我正在努力让我的角度应用程序达到可以分发的程度,我已经设法创建了2个bundle,一个用于我的角度应用程序,一个用于我的依赖项(包括角度框架和rxjs框架)。我正在使用systemjs builder进行捆绑并使用gulp来运行构建器。这两个包都是生成的,我的自定义包(包含我的代码)由前端加载,但是供应商/依赖包被忽略,依赖性仍然从node_modules
文件夹加载。
我在想这是我在最终发布中使用的dist-system-config.js
文件的问题。
我的解决方案主要基于this previous answer,但有几个例外,例如不包括/内联我的html模板以及将node_modules
添加到依赖项的排除路径。
我会包含我认为与问题相关的所有内容,如果需要更多内容,请告知我们。
重申一下,应用程序加载并运行正常,但不是从dependencies.bundle.js
加载依赖项,而是从node_modules
文件夹中的原始位置加载它们。加载app.bundle.js
没有任何问题。
的index.html
<script src="/node_modules/core-js/client/shim.min.js"></script>
<script src="/node_modules/zone.js/dist/zone.min.js"></script>
<script src="/node_modules/reflect-metadata/Reflect.js"></script>
<script src="/node_modules/systemjs/dist/system.js"></script>
<script src="/bundles/dependencies.bundle.js"></script>
<script src="/bundles/app.bundle.js"></script>
<script src="/Scripts/dist-system-config.js"></script>
<script>
System.import('app/boot').catch(function(err) {
console.error(err);
});
</script>
应用/ boot.ts
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { enableProdMode } from '@angular/core';
import { AppModule } from './app.module';
enableProdMode();
const platform = platformBrowserDynamic();
platform.bootstrapModule(AppModule);
脚本/ DIST-系统config.js
System.config({
baseURL: '/',
paths: {
'npm:': 'node_modules/'
},
map: {
'app': 'dist/app',
// angular bundles
'@angular/core': 'npm:@angular/core/bundles/core.umd.min.js',
'@angular/common': 'npm:@angular/common/bundles/common.umd.min.js',
'@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.min.js',
'@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.min.js',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.min.js',
'@angular/http': 'npm:@angular/http/bundles/http.umd.min.js',
'@angular/router': 'npm:@angular/router/bundles/router.umd.min.js',
'@angular/forms': 'npm:@angular/forms/bundles/forms.umd.min.js',
'rxjs': 'npm:rxjs'
},
packages: {
'app': { main: './boot.js', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' }
}
});
gulpfile.js
var gulp = require('gulp'),
tsc = require('gulp-typescript'),
Builder = require('systemjs-builder');
gulp.task('bundle', ['bundle-app', 'bundle-dependencies'], function(){});
gulp.task('app-components', function () {
return gulp.src('Scripts/app/**/*.ts')
.pipe(tsc({
"target": 'es5',
"module": 'commonjs',
"moduleResolution": 'node',
"lib": [ 'es2015', 'dom', 'es2015.iterable' ],
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": true,
"noImplicitAny": false
}))
.pipe(gulp.dest('dist/app'));
});
gulp.task('bundle-app', ['app-components'], function() {
// optional constructor options
// sets the baseURL and loads the configuration file
var builder = new Builder('', 'Scripts/dist-system-config.js');
return builder
.bundle('dist/app/**/* - [node_modules/@angular/**/*.js] - [node_modules/rxjs/**/*.js]', 'bundles/app.bundle.js', { minify: true})
.then(function() {
console.log('Build complete');
})
.catch(function(err) {
console.log('Build error');
console.log(err);
});
});
gulp.task('bundle-dependencies', ['app-components'], function() {
// optional constructor options
// sets the baseURL and loads the configuration file
var builder = new Builder('', 'Scripts/dist-system-config.js');
return builder
.bundle('dist/app/**/*.js - [dist/app/**/*.js]', 'bundles/dependencies.bundle.js', { minify: true})
.then(function() {
console.log('Build complete');
})
.catch(function(err) {
console.log('Build error');
console.log(err);
});
});
package.json (仅限相关版本)
"@angular/***": "4.2.6",
"canonical-path": "0.0.2",
"gulp": "3.9.1",
"gulp-typescript": "^3.2.0",
"rimraf": "2.6.1",
"rxjs": "5.4.2",
"systemjs": "0.20.14",
"systemjs-builder": "0.16.9",
"typescript": "2.4.1",
答案 0 :(得分:2)
在加载任何捆绑包之前配置SystemJS。
我能够重现你的问题。我发现如果在配置SystemJS之前加载了bundle,那么SystemJS将忽略已加载的bundle。如果在配置SystemJS后加载包,那么一切都很好。所以你应该按照这个顺序编写脚本:
<script src="/Scripts/dist-system-config.js"></script>
<script src="/bundles/dependencies.bundle.js"></script>
<script src="/bundles/app.bundle.js"></script>
这是SystemJS的作者(Guy Bedford)的a comment解释原因:
您需要在加载bundle之前先配置SystemJS,因为bundle通过规范化运行,因此需要配置才能正确规范化。