SystemJS:加载构建文件
SystemJS: loading build file
我的 SystemJS 文件如下所示:
(function(global) {
// map tells the System loader where to look for things
var map = {
'angular2-boot': 'app', // 'dist',
'@angular': 'node_modules/@angular',
'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
'rxjs': 'node_modules/rxjs'
};
// packages tells the System loader how to load when no filename and/or no extension
var packages = {
// 'app': { main: 'js/main.js', defaultExtension: 'js' },
'app': { main: 'dist/build.js', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' },
'angular2-in-memory-web-api': { defaultExtension: 'js' }
};
var ngPackageNames = [
...
];
// Add package entries for angular packages
ngPackageNames.forEach(function(pkgName) {
packages['@angular/'+pkgName] = { main: pkgName + '.umd.js', defaultExtension: 'js' };
});
var config = {
map: map,
packages: packages
};
System.config(config);
})(this);
在此,我使用 tsconfig.js 中的 outDir 选项将我的打字稿转译到另一个目录中,并在使用 main: 'js/main.js' 的包中引用它,效果很好。
但是,当我尝试使用 outFile 选项转译为单个文件并使用 main 引用该文件时:'dist/build.js'。它不呈现页面,我在控制台中也没有看到任何错误。
我的 index.html 看起来像这样:
<html>
<head>
<title>Angular 2 QuickStart</title>
<base href="/">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="app/css/styles.css">
<!-- 1. Load libraries -->
<!-- Polyfill(s) for older browsers -->
<script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.js"></script>
<script src="node_modules/reflect-metadata/Reflect.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<!-- 2. Configure SystemJS -->
<script src="systemjs.config.js"></script>
<script>
System.import('angular2-boot').catch(function(err){ console.error(err); });
</script>
</head>
<!-- 3. Display the application -->
<body>
<my-app>Loading...</my-app>
</body>
</html>
我的 tsconfig.js 文件如下所示:
{
"compilerOptions": {
"target": "es5",
"module": "amd",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false,
"outDir": "app/js",
"outFile": "app/dist/build.js"
}
}
当我加载页面时它说正在加载...。我还需要做什么才能使用 SystemJS 加载单个输出转译文件?
当您转译为单个文件时,它会生成一个名为 'bundle' 的特殊格式的文件。当您导入它时,其中的所有模块都会在 SystemJS 中加载和注册,但不会执行任何操作。因此,在加载包之后,您需要在 index.html
中添加第二个导入,这将实际启动您的应用程序,如下所示:
System.import('app/dist/build.js').then(function() {
System.import('main');
})
.catch(function(err){ console.error(err); });
此代码使用显式路径加载包:app/dist/build.js
,然后加载名为 main
的模块,因为该名称必须与 [=14= 中给出的模块名称完全匹配] 在包中调用。因此,此代码中没有任何内容涉及 angular-boot
或 app
包,因为它在 systemjs.config.js
中定义,因此该文件中无需更改任何内容。
也可以加载带有普通 <script>
标签的包,之后您将只需要一个 System.import('main')
。
我的 SystemJS 文件如下所示:
(function(global) {
// map tells the System loader where to look for things
var map = {
'angular2-boot': 'app', // 'dist',
'@angular': 'node_modules/@angular',
'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
'rxjs': 'node_modules/rxjs'
};
// packages tells the System loader how to load when no filename and/or no extension
var packages = {
// 'app': { main: 'js/main.js', defaultExtension: 'js' },
'app': { main: 'dist/build.js', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' },
'angular2-in-memory-web-api': { defaultExtension: 'js' }
};
var ngPackageNames = [
...
];
// Add package entries for angular packages
ngPackageNames.forEach(function(pkgName) {
packages['@angular/'+pkgName] = { main: pkgName + '.umd.js', defaultExtension: 'js' };
});
var config = {
map: map,
packages: packages
};
System.config(config);
})(this);
在此,我使用 tsconfig.js 中的 outDir 选项将我的打字稿转译到另一个目录中,并在使用 main: 'js/main.js' 的包中引用它,效果很好。
但是,当我尝试使用 outFile 选项转译为单个文件并使用 main 引用该文件时:'dist/build.js'。它不呈现页面,我在控制台中也没有看到任何错误。
我的 index.html 看起来像这样:
<html>
<head>
<title>Angular 2 QuickStart</title>
<base href="/">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="app/css/styles.css">
<!-- 1. Load libraries -->
<!-- Polyfill(s) for older browsers -->
<script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.js"></script>
<script src="node_modules/reflect-metadata/Reflect.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<!-- 2. Configure SystemJS -->
<script src="systemjs.config.js"></script>
<script>
System.import('angular2-boot').catch(function(err){ console.error(err); });
</script>
</head>
<!-- 3. Display the application -->
<body>
<my-app>Loading...</my-app>
</body>
</html>
我的 tsconfig.js 文件如下所示:
{
"compilerOptions": {
"target": "es5",
"module": "amd",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": false,
"outDir": "app/js",
"outFile": "app/dist/build.js"
}
}
当我加载页面时它说正在加载...。我还需要做什么才能使用 SystemJS 加载单个输出转译文件?
当您转译为单个文件时,它会生成一个名为 'bundle' 的特殊格式的文件。当您导入它时,其中的所有模块都会在 SystemJS 中加载和注册,但不会执行任何操作。因此,在加载包之后,您需要在 index.html
中添加第二个导入,这将实际启动您的应用程序,如下所示:
System.import('app/dist/build.js').then(function() {
System.import('main');
})
.catch(function(err){ console.error(err); });
此代码使用显式路径加载包:app/dist/build.js
,然后加载名为 main
的模块,因为该名称必须与 [=14= 中给出的模块名称完全匹配] 在包中调用。因此,此代码中没有任何内容涉及 angular-boot
或 app
包,因为它在 systemjs.config.js
中定义,因此该文件中无需更改任何内容。
也可以加载带有普通 <script>
标签的包,之后您将只需要一个 System.import('main')
。