我们正在尝试组织一个较旧的软件包。为此,我们开始将原始“export = module
”表单更改为“export default module
”。此更改会破坏使用eval()的代码的其他部分,因为“import module from 'module'
”正在编译为“module_1”。提供给eval()的代码来自外部源,而我们想要使用模块,而不是“module_1.default”形式。
这种命名约定实际上如何运作?您能告诉我们这个概念吗?我们如何使用原始模块名称而不是编译的名称?或者是否有编译后获取模块实际名称的函数?
谢谢, 亚当
答案 0 :(得分:1)
使用编译器生成的名称是不安全的。它可以改变。
但你可以这样做:
import myModule from 'module'
const module = myModule
第二行将编译为:
var module = module_1.default;
然后,您可以使用变量module
。
export default
而不是export =
在不久的将来,使用export default
将成为常态。此功能由ECMAScript设计,以替换当前的CommonJS用例。成员default
更好,更通用。
这是一个例子。您需要导出一个对象:
const myConfigObject = Object.freeze({
dbHost: "",
dbUser: "",
// ...
})
export = myConfigObject
然后,您可以导入它:
import * as myConfigObject from "./myConfigObject"
随后,您希望导出一个小帮助函数toDSN
,帮助模块用户执行与导出对象相关的操作。怎么做?您可以将帮助程序添加为配置的成员。但它不会优雅。
以下是ES6方式:
export default Object.freeze({
dbHost: "",
dbUser: "",
// ...
})
export function toDSN(configObj) {
return // ...
}
然后,您可以导入默认对象:
import myConfigObject from "./myConfigObject"
...或导入toDSN
:
import { toDSN } from "./myConfigObject"
...或导入两者:
import myConfigObject, { toDSN } from "./myConfigObject"
唯一的小缺陷是当前Node.js用户代码:必须使用成员default
。当Node.js实现ES6模块时,陷阱就不再存在了。
因为ES6模块的一般情况需要它。以下ES6代码:
import myConfigObject, { toDSN } from "./myConfigObject"
此处导入两个变量。但是CommonJS(或AMD)require
只能导入一个变量。因此,编译器将此单个变量作为中间变量myConfigObject_1
导入。然后,通过myConfigObject
可以使用对象myConfigObject_1.default
,toDSN
可以使用myConfigObject_1.toDSN
。
我建议the article from Mozilla介绍ES6模块。