Object.defineProperty(exports,“ __esModule”,{value:!0})的目的是什么?

Hyu*_*ang 2 javascript module ecmascript-6

我阅读了最小化的tensorflow.js文件以了解模块结构。Tensorflow.js是用打字稿编写的,以上文件(链接)可能是编译结果。

无论如何,我了解这个模块是用IIEF模式编写的,用于UMD模块格式。但是,在工厂功能结束时,Object.defineProperty(exports, "__esModule", { value: !0 })存在。我知道它的语法含义。但是我不知道这段代码的目的。就我而言,这段代码似乎将模块标记为ES Module。但是对我来说还不够清楚。因此,一些问题随之而来。

  1. 此代码似乎是可删除的。真的吗
  2. 是否有使用此属性的情况?

Max*_*m T 9

它有助于正确导入CommonJS / AMD / UMD模块格式的默认导出。

CommonJS / AMD / UMD模块的默认导入(即从“ foo”导入d)等效于

const d = require("foo").default
Run Code Online (Sandbox Code Playgroud)

但是,当今可用的大多数CommonJS / AMD / UMD模块都没有默认导出,这使得该导入模式实际上无法用于导入非ES模块(即CommonJS / AMD / UMD)。例如

import fs from "fs" 
Run Code Online (Sandbox Code Playgroud)

要么

import express from "express" 
Run Code Online (Sandbox Code Playgroud)

不允许。

为了允许在CommonJS / AMD / UMD中进行默认导入(例如,从“ fs”导入fs),打字稿编译器添加__esModule标志,并在已编译的代码中进行检查(从ES6到CommonJS)。它使用__importDefault辅助函数(检查__esModule标志)导入默认导出。

var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
}
exports.__esModule = true;
var bar_1 = __importDefault(require("bar"));
Run Code Online (Sandbox Code Playgroud)


Xle*_*lee 6

马克西姆给出了一个很好的答案。

使用https://www.typescriptlang.org/tsconfig#esModuleInterop标志打开/关闭来探索Typescript Playground也可能会有所帮助。

离开

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const foo_1 = require("foo");
console.log(foo_1.default);
Run Code Online (Sandbox Code Playgroud)

"use strict";
+ var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+ };
Object.defineProperty(exports, "__esModule", { value: true });
- const foo_1 = require("foo");
+ const foo_1 = __importDefault(require("foo"));
console.log(foo_1.default);
Run Code Online (Sandbox Code Playgroud)