为什么我收到警告,我应该将模块格式设置为" system"?

时间:2017-08-02 12:28:34

标签: angular typescript systemjs

我的Typescript在控制台中显示错误:

  

TypeScript [警告]转换为CommonJS,考虑设置模块:" system"在typescriptOptions中直接转换为System.register格式

好的,但是我安装了SystemJS,它应该可以工作!

的package.json: "systemjs": "^0.20.13"

tsconfig.json:

{
  "compilerOptions": {
    "target": "es5",
    "module": "system",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": ["es2017", "dom"],
    "noImplicitAny": true,
    "removeComments": true,
    "sourceMap": true,
    "suppressImplicitAnyIndexErrors": true
  },
  "exclude": [
    "node_modules/*",
    "**/*-aot.ts"
  ]
}

的index.html:

<!DOCTYPE html>
<html>
<head>
    <base href="./" />
    <title>test</title>
    <script src="node_modules/systemjs/dist/system.src.js"></script>
    <script src="systemjs.config.js"></script>
    <script>
        System.import('app').catch(function (err) {
            console.error(err);
        });
    </script>
</head>
<body>
    <app>Loading...</app>
</body>
</html>

怪物,SystemJS! IDK你怎么管理这个意大利面? See the code here

因此。问题是:为什么Typescript说:

  

TypeScript [警告]转换为CommonJS,考虑设置模块:&#34; system&#34;在typescriptOptions中直接转换为System.register格式

在调试Web应用程序时,在浏览器控制台中

2 个答案:

答案 0 :(得分:0)

我的systemjs.config.js文件,我假设,是您的pastebin中包含的内容。

这会将systemjs配置为使用该文件中的嵌入式配置在浏览器中动态传输您的打字稿。

这很可能不是你想要的。相反,您应该在命令行上调用typescript。请勿在{{1​​}}中添加systemjs.config.js,并确保已编译的index.html文件在app.js尝试从中获取的位置可用 - 或直接将其包含在systemjs中{1}}标记。

答案 1 :(得分:0)

您收到该警告是因为您已将SystemJS设置为通过SystemJS加载的任何打字稿代码进行转换,并且您已配置执行转换的插件以生成commonjs格式的模块。

您在问题中显示tsconfig.json该插件不会使用该文件。插件使用的是SystemJS配置的以下部分, 你设置了"module": "commonjs"

typescriptOptions: {
  // Complete copy of compiler options in standard tsconfig.json
  "emitDecoratorMetadata": true,
  "experimentalDecorators": true,
  "lib": ["es2015", "dom"],
  "module": "commonjs",
  "moduleResolution": "node",
  "noImplicitAny": true,
  "sourceMap": true,
  "suppressImplicitAnyIndexErrors": true,
  "target": "es5"
},

您可以在用于转换here的插件的源代码中找到生成警告的代码:

if ((options.module != ts.ModuleKind.System) && (options.module != ts.ModuleKind.ES2015)) {
    logger.warn(`transpiling to ${ts.ModuleKind[options.module]}, consider setting module: "system" in typescriptOptions to transpile directly to System.register format`)
}

首先请注意,这仅仅是一个警告。您可以继续使用TypeScript发出CommonJS模块。你得到警告的原因是,假设插件是针对SystemJS的,那么你强行要在SystemJS中加载模块,大概你应该只使用SystemJS的本机模块格式而不是生成CommonJS模块。 SystemJS 可以加载CommonJS模块,但为什么在使用本机格式时可以使用该格式?而一般来说,有理由让TypeScript编译器生成除本机SystemJS格式之外的其他格式,在此特定上下文中没有明确的理由这样做。这就是你收到警告的原因。