首页 > 解决方案 > `Object.defineProperty(exports, "__esModule", { value: !0 })` 的目的是什么?

问题描述

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

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

  1. 此代码似乎是可移动的。真的吗?
  2. 有使用此属性的案例吗?

标签: javascriptecmascript-6module

解决方案


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

CommonJS/AMD/UMD 模块的默认导入(即 import d from "foo")等价于

const d = require("foo").default

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

import fs from "fs" 

或者

import express from "express" 

不允许。

为了允许 CommonJS/AMD/UMD 中的默认导入(例如 import fs from "fs"),typescript 编译器添加了 __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"));

推荐阅读