【发布时间】:2017-12-16 00:40:35
【问题描述】:
我正在尝试让我的 Angular 应用程序准备好分发,并且我设法创建了 2 个捆绑包,一个用于我的 Angular 应用程序,一个用于我的依赖项(其中包括 Angular 框架和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>
app/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-system-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",
【问题讨论】:
-
'app': { main: './main.js', defaultExtension: 'js' }在我的配置中是{ main: 'app/boot.js', defaultExtension: 'js' }所以如果你的引导文件被命名为main.js而不是boot.js那么它应该是{ main: 'app/main.js', defaultExtension: 'js' },。而且不需要'main': 'dist/app/main.js',(我猜) -
@AnkitSingh - 谢谢,我根据您的评论更新了
Scripts/dist-system-config.js,但仍然遇到相同的行为。 -
@AnkitSingh - 从 Angular 引用
umd捆绑包与它有什么关系? (而不是另一个 .js 文件) -
@AnkitSingh - 请参阅下面 Louis 的答案,加载/脚本标签顺序很重要。再次感谢您在另一个线程上的帮助和之前的回答(我确实投票了)。
-
当然,Angular CLI,它运行起来没有太多麻烦。有关更多信息,请参阅我对其他问题的回答上方已接受的答案。或者你可以使用@AngularClass中的This Starter
标签: angular rxjs systemjs systemjs-builder