之所以问这个问题,是因为我在关于 module 的官方文档中看到了下面这句话。
该模式的核心思想是 import id = require("...") 语句让我们可以访问模块公开的类型。
我完全糊涂了。为什么模块有类型?为什么 require() 可以给我们模块暴露的类型?
在运行时,对于导入它的另一个模块来说,模块是一个具有每个导出属性的 JavaScript 对象。该对象的属性集概述了模块的类型。当然,TypeScript 可以在编译时知道这些属性的类型,就像它可以知道其他对象一样。
但从模块本身的角度来看,它是一个执行该函数以向exports传递给它的对象添加属性的函数。一般来说,该exports对象成为其导入者的模块。
如果这看起来很奇怪,那么我们需要看看模块的目的,即限制其成员的范围。在 JavaScript 中,限制所定义内容范围的主要方法是在函数内定义它。
TypeScript 生成的模块的函数的确切形式取决于您选择的加载器选项。例如,对于 CommonJS 模块(由 NodeJS 使用),加载器会自动将模块的函数包装在 .js 文件的内容中。对于 Node.js,其功能通常如下所示:
(function (exports, require, module, __filename, __dirname) {
<<JavaScriptFileContent>>
\n});
Run Code Online (Sandbox Code Playgroud)
作为模块加载过程的一部分,Node.js 编译这个匿名函数,然后调用它,为 、exports函数require()等传递一个(几乎)空的 JavaScript 对象。通常,中间的代码通过向exports对象添加属性来工作。
这还不是故事的全部,模块有可能是其他东西。如果中间的代码将其他内容分配给module.exports,则该对象将成为运行时模块对象。这并不常见。
| 归档时间: |
|
| 查看次数: |
2646 次 |
| 最近记录: |