javascript - `Object.defineProperty(exports, "__esModule", { value: !0 })` 的目的是什么?
问题描述
我阅读了最小化的 tensorflow.js 文件以了解模块结构。Tensorflow.js是用 typescript 编写的,上面的文件(链接)可能是转译的结果。
无论如何,我理解这个模块是用IIEF模式编写的UMD模块格式。但是,在工厂功能结束时,Object.defineProperty(exports, "__esModule", { value: !0 })
存在。我知道它的语法意义。但我不知道这段代码的目的。据我用谷歌搜索,这段代码似乎将模块标记为ES Module。但这对我来说还不够清楚。所以,一些问题随之而来。
- 此代码似乎是可移动的。真的吗?
- 有使用此属性的案例吗?
解决方案
它有助于正确导入 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"));
推荐阅读
- r - 有没有办法只向 r data.frame 添加一个名称?
- maven - 当 intelij maven 从 nexus 下载特定的 pom 但从 url 打开时,身份验证失败并出现 401
- laravel - laravel:登录到外部 API
- spring-boot - Spring Cloud LoadBalancer 是否像 Netflix Ribbon 一样有超时?
- java - 使用 PDFBox 提取“图形”行位置
- javascript - 如何在单击下一个和上一个按钮时访问 JQuery 中动态生成的 div 元素值
- c++ - 如何在不阻塞 C++ 中的主线程的情况下无限运行线程?
- java - Selenium - 使用 Java 的 Safari facebook 登录错误
- android - Kotlin:来自 AppCompatActivity 的片段
- javascript - 更新时反应状态材料ui地图冲突