tsconfig 模块选项 - “系统”是指 SystemJS 吗?

Chr*_*row 5 module angularjs typescript angular

在 tsconfig.json 文件中,可以将以下选项指定为 compilerOptions 'module' 属性的值:

System
Run Code Online (Sandbox Code Playgroud)

这样我们得到:

{
  "compilerOptions": {
    "module": "System",
     ...
Run Code Online (Sandbox Code Playgroud)

System 是否指 SystemJS(即,如果 SystemJS 被用作模块加载器,我在创建 AngularJS 或 Angular 应用程序时是否总是需要在我的 tsconfig.json 中使用“System”)?该文档似乎没有解释这一点:

https://www.typescriptlang.org/docs/handbook/compiler-options.html

在 TypeScript 的 Visual Studio 项目配置中,“TypeScript Build > Module system”下还有一个“System”选项,这显然与 tsconfig.json 中的“System”指代相同。

Gre*_*ycz 5

是的,它指的是 SystemJS,如果您希望 TypeScript 编译器按照您的预期运行并生成您预期的代码,那么显式包含它非常重要。如果您不指定,TypeScript 将恢复为基于当前targetES 版本生成(并期望)代码(默认情况下ES3,触发commonjs模块)。moduleResolution正如编译器文档中所述,它将对其他默认编译器选项(例如和 )产生影响allowSyntheticDefaultImports

例如,如果您有一个如下所示的打字稿文件

import { functionA } from './moduleA';
functionA();
Run Code Online (Sandbox Code Playgroud)

如果您指定module生成system的代码将使用系统调用:

System.register(["./moduleA"], function (exports_1, context_1) {
    "use strict";
    var __moduleName = context_1 && context_1.id;
    var moduleA_1;
    return {
        setters: [
            function (moduleA_1_1) {
                moduleA_1 = moduleA_1_1;
            }
        ],
        execute: function () {
            moduleA_1.functionA('Stuff');
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

但是,如果您允许编译器默认为commonjs,它将生成:

"use strict";
var moduleA_1 = require('./moduleA');
moduleA_1.functionA('Stuff');
Run Code Online (Sandbox Code Playgroud)

请注意,生成的代码可能会根据 TS 版本或其他标志而有所不同。

来自测试/经验以及您链接的模块分辨率编译器文档。

  • 谢谢 Greg,您能引用这些文档中阐明 System 选项指的是 SystemJS 的部分吗?我很困惑为什么在 tsconfig.json 中为“amd”(这是一个通用概念)设置“module”的值时,Visual Studio 中有智能感知选项,您所说的“system”是 SystemJS(一个特定的系统),而es2015是一个标准!这没有意义 (2认同)