我使用SystemJS作为模块系统来编译TypeScript文件,但是每当我在浏览器中加载页面时(通过live-server),都会出现以下错误:

ReferenceError: Sensor is not defined
    at (index):17
    at <anonymous>


这是我的index.html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Sensor</title>
</head>
<body>

    <input type="text" id="textField"/>
    <p id="text"></p>

    <script src="node_modules/systemjs/dist/system.js"></script>
    <script>
        SystemJS.import('dist/index.js').then( function() {
            var textField = new Sensor(document.getElementById('textField')).setName('textField');
        }).catch(function(err) { console.log(err); });
    </script>
</body>
</html>


这是我的tsconfig.json文件:

{
    "compileOnSave": true,
    "compilerOptions": {
        "module": "system",
        "target": "es5",
        "outFile": "dist/index.js"
    },
    "files": [
        "./src/sensor.ts",
        "./src/signal.ts",
        "./src/signal_receiver.ts"
    ]
}


我检查了输出文件,看起来已经定义了Sensor

System.register("sensor", ["signal", "signal_receiver"], function (exports_3, context_3) {
    ...
    exports_3("Sensor", Sensor);


编辑:我现在检查,当我尝试调用它们时,没有定义任何函数。

最佳答案

我看到您的代码有两个问题。一个是您正在使用捆绑软件,但是您的代码将其忽略。其次,您不是从模块中获取Sensor类,而是从全局空间获取它。

tsc生成的代码中,对System.register的调用的第一个参数为"sensor",这意味着您正在处理捆绑软件。这种调用对模块名称进行硬编码,此处的模块名称为"sensor"。可以使用script元素加载SystemJS捆绑包,因此您可以在加载SystemJS之后添加该元素:

<script src="dist/index.js"></script>


这将加载整个捆绑包,并使其中的所有模块可供使用。

然后,为模块生成的代码将Sensor类导出为模块上的Sensor字段。 (这就是代码exports_3("Sensor", Sensor)的作用。)因此,使用它时需要从模块中获取它。因此,代码应为:

SystemJS.import('sensor').then(function(sensor) {
  var textField = new sensor.Sensor(document.getElementById('textField')).setName('textField');
}).catch(function(err) { console.log(err); });


在这段代码中,我要求SystemJS加载名为"sensor"的模块,该模块与System.register所使用的名称相同,并且已将sensor添加到传递给.then的回调的参数列表中并引用转到类为sensor.Sensor

关于javascript - SystemJS的ReferenceError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47602125/

10-11 11:36