当我在app.ts脚本中导入模块时,' .js'编译的js文件的导入行中缺少文件扩展名。
app.ts import {ModuleA} from './ModuleA'
编译了app.js import {ModuleA} from './ModuleA';
我将其包含在html文件中,如<script type="module" src="app.js"></script>
但浏览器无法找到模块&#39; ModuleA&#39;。
只有在我导入import {ModuleA} from './ModuleA.js'
但我想通过导入&#39; .ts&#39;模块文件,而不是&#39; .js&#39;模块文件。
我希望ts编译添加&#39; .js&#39;扩展到进口线。
有什么建议吗?
答案 0 :(得分:1)
似乎这是打字稿中的一个错误。 https://github.com/Microsoft/TypeScript/issues/13422。
目前还没有解决方案。目前,您的方法是正确的。
import {ModuleA} from './ModuleA.js'
答案 1 :(得分:1)
您也可以使用webpack构建单个js文件。然后您不需要添加扩展名。
答案 2 :(得分:1)
如果未在tsc
的命令行中指定编译器选项,并且您没有tsconfig.json
文件,则typescript将使用默认值。根据{{3}},发出的语言的默认值为es3
,模块加载器的默认值为commonjs
。我发现这些选项不可接受,因此我在tsconfig.json
文件中指定了不同的选项。尝试按如下方式设置项目,我认为您会对结果感到满意。这可能看起来很多工作,但您可以在完成后将项目导出到模板,并且您不必再次执行此操作。这假设您已在计算机上设置npm
。
在VS 2017中创建一个新项目,选择ASP.NET Web应用程序(.NET Framework)作为模板。我知道这可能听起来不对,但请耐心等待,因为你最终会得到一个不包含你不想要的东西的最小项目。在向导的下一页上,选择“清空”并取消选中每个框,然后不进行身份验证。完成向导。
在项目的根级添加以下文件。
的package.json:
{
"version": "1.0.0",
"name": "asp.net",
"author": "you",
"private": true,
"dependencies": {
"core-js": "^2.5.3",
"systemjs": "^0.21.0"
}
}
tsconfig.json:
{
"compilerOptions": {
"module": "system",
"target": "es5",
"noImplicitAny": true,
"noEmitOnError": true,
"sourceMap": true
},
"files": [
"app/app.ts"
],
"exclude": [
"node_modules"
]
}
system.config.js:
(function (global) {
SystemJS.config({
paths: {
'npm:': '/node_modules/'
},
map: {
app: '/app'
},
packages: {
app: {
main: 'app.js',
defaultExtension: 'js'
}
}
})
})(this);
的index.html:
<!DOCTYPE html>
<html>
<head>
<base href="/" />
<meta charset="utf-8" />
<title>Typescript with SystemJS and Modules Demo</title>
<script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/systemjs/dist/system.js"></script>
<script src="system.config.js"></script>
<script>
SystemJS.import("app/app.js").catch(function (e) { console.log(e); });
</script>
</head>
<body>
<div id="personDiv"></div>
</body>
</html>
此外,创建一个app
文件夹并将以下两个文件放入其中:
app.ts:
import { Person } from "./person";
export class App {
constructor() {
let person: Person = new Person();
let div: HTMLDivElement = <HTMLDivElement>document.getElementById('personDiv');
div.innerHTML = person.getName();
}
}
// Use this assignment to start execution.
let a: App = new App();
// The following doesn't appear to work with SystemJS. It does with plain TypeScript.
// It is probably because SystemJS already defines a listener for window.onload,
// although I haven't verified that.
//window.onload = () => {
// let a: App = new App();
// let person = new Person();
// alert(person.getName);
//}
person.ts:
export class Person {
fullName: string;
constructor() {
this.fullName = "Test Guy";
}
getName():string {
return this.fullName;
}
}
然后构建并运行应用程序。结果应该表明导入工作正常。