为什么 module.js 文件在浏览器中不是 运行

Why is module.js file not running in the browser

代码不是 运行ning 并且没有任何内容输出到控制台,就像我尝试 console.log("random text");在 module.ts 中,它不会向控制台记录任何内容

在这里,我基本上是在我的打字稿项目中尝试 运行 模块。所以我安装了 systemjs,将其包含在添加的配置中。在 tsconfig 中添加了模块 "system"。但它仍然不起作用

import { add } from "./function1";
import { subtract } from "./function2";
import { Person } from "./interface";

const John: Person = {
    name: "John",
    lastname: "Doe",
    greet(): void {
        console.log(`Hello, ${this.name} ${this.lastname}`);
    }
}
const addition = add(3, 3);
const subtraction = subtract(5, 2); 

console.log("Random Text"); //Doesnt Work



PACKAGE JSON
{
  "name": "assignment_4.3",
  "version": "0.0.1",
  "description": "typescript modules app",
  "main": "module.js",
  "dependencies": {
    "systemjs": "^0.20.18"
  },
  "devDependencies": {
    "lite-server": "^2.3.0"
  },
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev":"lite-server"
  },
  "keywords": [
    "typescript",
    "modules"
  ],
  "license": "ISC"
}
{
    "compilerOptions": {
        "module":"system",
        "target": "es5",
        "noEmitOnError": true,
        "sourceMap": true,
        "removeComments": true,
        "outFile": "./module.js"
    }
}
<!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>Document</title>
    <script src="./node_modules/systemjs/dist/system.js"></script>
</head>

<body>
    
    <script>
        SystemJS.config({
            baseUrl: '/',
            defaultExtensions: true
        });

        SystemJS.import('./module.js');
    </script>
</body>

</html>

Output HTML =====================

<body data-gr-c-s-loaded="true" cz-shortcut-listen="true"><script id="__bs_script__">//<![CDATA[
document.write("<script async src='/browser-sync/browser-sync-client.js?v=2.18.13'><\/script>".replace("HOST", location.hostname));
//]]></script><script async="" src="/browser-sync/browser-sync-client.js?v=2.18.13"></script>


<script>
    SystemJS.config({
        baseUrl: '/',
        defaultExtensions: true
    });

    SystemJS.import('module.js');
</script>


</body>

问题是您正在设置 tsc 来生成 SystemJS 包,然后使用 System.import 加载包。仅加载捆绑包 注册 捆绑包中的模块。它不会执行 捆绑包中的模块:仍然需要请求它们。

当您使用 outFile 时,您说的是 "put all my modules in the same file",这是一个捆绑包。这将创建一个文件,其模块名称与您在 TypeScript 代码中输入的名称完全相同。因此,如果他们在那里没有扩展,那么他们在生成的包中就没有扩展。您可以通过查看 tsc 生成的文件看到:

System.register("module", [], function (exports_1, context_1) {
    "use strict";
    var __moduleName = context_1 && context_1.id;
    return {
        setters: [],
        execute: function () {
            console.log("MODULE");
        }
    };
});

如果您不想使用捆绑包

更改您的 tsconfig.json 以删除 outFile:

{
    "compilerOptions": {
        "module":"system",
        "target": "es5",
        "noEmitOnError": true,
        "sourceMap": true,
        "removeComments": true
    }
}

将您的 SystemJS 配置更改为:

    SystemJS.config({
      baseUrl: './',
      packages: {
        '': {
          defaultExtension: "js"
        },
      }
    });

添加默认扩展的设置是单数defaultExtension,在packages.

内有效

并让 SystemJS 添加 .js,因此导入 module 而不是 module.js:

SystemJS.import("module");

如果您想使用捆绑包

更改您的 tsconfig.json 以给您的包取一个与您的模块不同的名称,因为这将有助于消除混淆:

{
    "compilerOptions": {
        "module":"system",
        "target": "es5",
        "noEmitOnError": true,
        "sourceMap": true,
        "removeComments": true,
        "outFile": "bundle.js"
    }
}

并且 declare the bundle 在您的 SystemJS 配置中:

   SystemJS.config({
        baseUrl: './',
        bundles: {
          "bundle.js": ["module"],
        },
    });

就像上面一样,您应该在没有扩展名的情况下导入:

SystemJS.import("module")

这是题外话,但我建议不要将模块命名为 module,因为除了没有描述模块的内容外,它还会损害可移植性。例如AMD加载器,为加载器提供的一种虚拟模块保留模块名称module