gpt4 book ai didi

typescript - 为什么 module.js 文件没有在浏览器中运行

转载 作者:搜寻专家 更新时间:2023-10-30 21:38:43 24 4
gpt4 key购买 nike

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

在这里,我主要是尝试在我的 typescript 项目中运行模块。所以我安装了 systemjs,将其包含在添加的配置中。在 tsconfig 中添加模块“系统”。但还是不行

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 加载包。加载包仅注册包中的模块。它不会执行 bundle 中的模块:它们仍然需要被请求。

当您使用 outFile 时,您是在说“将我所有的模块放在同一个文件中”,这是一个包。这将创建一个文件,其模块名称与您在 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");
}
};
});

如果您不想使用 bundle

更改您的 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

关于typescript - 为什么 module.js 文件没有在浏览器中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46102109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com