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

时间:2018-06-20 08:31:24

标签: javascript ecmascript-6 module

为了了解模块结构,我读了minimized tensorflow.js fileTensorflow.js用打字稿写成,以上文件(链接)可能是编译结果。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

const d = require("foo").default

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

import fs from "fs" 

import express from "express" 

不允许。

要允许在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"));