为了账号安全,请及时绑定邮箱和手机立即绑定

tsconfig中的模块选项用于什么?

tsconfig中的模块选项用于什么?

烙印99 2021-04-06 13:10:50
我试图了解打字稿模块编译器选项。我经历了打字稿文档-docs 它说模块选项是Specify module code generation。这意味着什么?这是否意味着如果我将module选项设置为commonjs,则编译器会将代码编译为commonjs?但是然后我们有类似的选择esnext, es16。在完成Docs: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"  }}
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

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

  • 什么Specify module code generation意思

"module" tsconfig.json中的内容告诉Typescript(TS)编译器将文件编译为Javascript(JS)时使用哪种模块语法。

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

有几种不同的模块系统,其中CJS和本机ES模块(ESM)格式可能是使用最广泛的模块系统。选择什么取决于您的要求。如果是用于使用Node.js的服务器端项目,则可能是CJS,如果是用于Angular前端应用程序,则可能是ESM(或他们自己的NgModules,但这超出了本文的范围)。类似的情况是库和包装设计,以及您希望如何向消费者展示它们。这取决于哪种类型的用户将使用该代码,与他们一起使用什么(浏览器,Node)以及哪种模块系统最适合该工作?

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

但是然后我们有诸如esnext之类的选项

较新的JS版本有时包含用于模块导入/导出的更多功能。设置"module""ESNext"启用对这些功能的支持,而这些功能通常尚未添加到官方规范中。比如import(...)表达式里面是动态导入的。

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

"module"设置不影响其余代码,"target"而是用于该设置,并指定输出应兼容的JS版本。其他线程对此进行了解释,为了清楚起见,我仅在此处添加它。假设您要在Node项目中使用require(...)module.exports = {...}而且还希望代码利用代码中的ES2015特性(例如letconst出于可读性/性能/其他原因)。在这种情况下,你会设定"module""commonjs""target""ES2015"在tsconfig。

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

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

那么,这是否意味着您提供的模块类型会告诉编译器以哪种语法编写代码?

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


查看完整回答
反对 回复 2021-04-15
  • 1 回答
  • 0 关注
  • 491 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信