tsconfig 中的模块选项是用来做什么的



我正在尝试理解打字稿模块编译器选项。

我浏览了打字稿文档 - 文档 它说模块选项是Specify module code generation.

那是什么意思?

这是否意味着如果我将模块选项作为commonjs,那么编译器会将代码编译为 commonjs?但是我们也有这样的选择esnext, es16.在我浏览了文档:esnext,es6,es2015模块目标之间的区别后,我明白了import() expressions are understood in esnext。无论如何,编译器的目的是将代码编译成浏览器可理解的语法(commonjs)。 因此,将代码编译为给定的模块类型是没有意义的。

那么这是否意味着你给出的模块类型告诉编译器代码是用什么语法编写的呢?这意味着它必须从哪个代码中将其编译为 commonjs?但是我们经常使用模块类型commonjs,但我们几乎从不使用纯 commonjs 语法编写代码。

tsconfig.json的目的是什么?stackoverflow的答案说module specifies module manager。我不明白这意味着什么。

我还了解了 tsconfig 和 tsconfig 模块选项中的"目标"和"模块" - "系统"是指 SystemJS 吗?

这些似乎都没有正确回答我的问题。

tsconfig.json

{
"compilerOptions: {
"module": "esnext"
}
}

TLDR; tsconfig.json 中的module告诉编译器对发出的.js文件中的模块使用什么语法。常用的值是"commonjs"(require/module.exports)或"ES2015"(import/export关键字),但还有其他模块系统。module会影响发出代码的模块语法,而target会影响其余代码。

  • Specify module code generation是什么意思?

tsconfig.json 中的"module"告诉 Typescript (TS) 编译器什么模块语法 在文件编译为 Javascript (JS) 时使用。

当您在 tsconfig.json 中将"module"设置为"commonjs"时,这意味着编译.js文件中的模块将使用 commonJS (CJS) 语法,因此var x = require(...)module.exports = {...}导入和导出。 例如,如果将"module"更改为"ES2015",则编译的代码将使用ES2015模块语法中使用的importexport关键字。有关其他语法的概述,您可以查看此处。

有几种不同的模块系统带有 CJS 和 本机 ES 模块 (ESM) 格式可能是使用最广泛的格式。 选择什么取决于您的要求。如果是用于服务器端项目 使用Node.js那么可能是CJS,如果它是用于Angular前端应用程序 也许比ESM(或他们自己的NgModules,但这超出了这里的范围)。 一个有点类似的情况是库和包设计以及您将如何 喜欢将它们暴露给消费者。这取决于将要使用哪种类型的用户 代码,它们使用什么(浏览器,节点)以及哪些模块系统 最适合这份工作?

ES模块现在是在JS中导入/导出模块的内置标准,但是在没有本机解决方案的情况下设计了其他模块系统:这就是为什么我们也有CJS,AMD和UMD模块的原因。它们并没有全部过时,CJS 在 Node 中仍然大量使用.js例如 AMD 模块加载器允许非 JS 导入,这在某些情况下可能很有用。 如今,所有现代浏览器和 Node 13.2.0+ 都支持 ESM 格式(有关兼容性数据和更多模块背景信息,请参阅此页面)。

但是我们还有像 esnext 这样的选择

较新的JS版本有时包含更多模块导入/导出功能。 将"module"设置为"ESNext"可以支持这些功能,这些功能通常尚未添加到官方规范中。例如作为动态导入的import(...)表达式。

这是否意味着如果我将模块选项作为 commonjs,那么编译器会将代码编译为 commonjs?

"module"设置不会影响代码的其余部分,"target"用于此设置,并指定输出应与哪个JS版本兼容。 这已经在其他线程中进行了解释,为了清楚起见,我只是在这里添加它。 假设您想在 Node 项目中使用require(...)module.exports = {...},但也希望代码利用代码中的 ES2015 功能,如letconst(出于可读性/性能/其他原因)。 在这种情况下,您需要在 tsconfig 中将"module"设置为"commonjs""target"设置为"ES2015"

无论如何,编译器的目的是将代码编译成浏览器可理解的语法(commonjs)。

是的,编译器必须将 TS 代码转换为浏览器理解的 JS。 但是,JS不再局限于浏览器,例如Node在其他环境(服务器)中运行。CJS 实际上旨在作为服务器端模块格式,而 AMD 模块用于浏览器导入/导出。

那么这是否意味着你给出的模块类型告诉编译器代码是用什么语法编写的呢?

它告诉编译器在输出.js文件中以什么语法编写模块

最新更新