当我从命令行运行脚本时,如何修复"ReferenceError: System is not defined"错误?

17

我正在尝试创建一个TypeScript服务器端(示例代码 import mongoose from 'mongoose';),我知道在此之前应该初始化systemjs,但是我不知道如何在服务器端脚本中进行初始化。

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "system",
    "moduleResolution": "node",
    "noImplicitAny": true,
    "removeComments": true,
    "preserveConstEnums": true,
    "sourceMap": true
  },
  "exclude": [
    "node_modules",
    "typings/main",
    "typings/main.d.ts"
  ]
}
2个回答

8

如果您想在服务器端使用“system”模块-您将需要安装systemjs软件包并进行配置:

import System = require('systemjs');

System.config({
  ...
});

System.import(...);

但是在我看来,更好的方法是针对commonjs进行目标定位,并在node.js中“本地”运行它,而不需要任何额外的依赖。

作为奖励-您还可以使用systemjs作为加载器在浏览器中运行commonjs模块-它支持开箱即用的加载。

[编辑]

请注意,node.js是使用commonjs作为模块标准构建的。因此,您可以使用SystemJS消耗“系统”模块,但只能在必须以commonjs格式运行才能在nodejs中运行的主程序“内部”使用。


看起来你缺少包含 require 的 node.js 定义。尝试在 typings.json 文件中添加以下行:"node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts",然后运行 typings install - Amid
你应该使用import,我的错。我已经在本地尝试过了。安装了systemjs包并导入定义后 - 它可以正常工作,并且System被定义了。 - Amid
好的,现在我想我明白你想做什么了。你确实可以编译一些模块为 'system' 格式,但是不能直接在 node.js 环境中加载它们。因为 node.js 使用 commonjs 作为标准。所以编译 app.ts 目标为 'system' 将无法在 node.js 中运行。但是你可以将 app.ts 编译为 commonjs,并从其中使用 systemjs 包来加载其他编译为 'system' 的模块。希望这能帮助你解决问题。 - Amid
所以我现在看到的是,并不是 TypeScript 的问题。出于好奇,我想知道在我的情况下是否可以使用 systemjs?或者在 Node.js 中根本不可能使用它? - chrisp
你可以使用SystemJS模块,但不能“本地”使用。你的应用程序必须编译为目标commonjs,然后从中可以使用System.import()加载其他格式的模块而不是commonjs。 - Amid
显示剩余2条评论

5

我通过在tsconfig.json文件中添加"module" : "commonjs"来解决了这个问题。Commonjs是历史悠久的Node模块系统。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接