Angular 2プロジェクトで、モジュールのロードにSystemJSを使用し、タスクランナーにGulpを使用しています。プロジェクトのAngularの現在のバージョンはRC2ですが、この問題はRC1にも存在します。ブランドの答え here の手順に従いました。
アプリケーションとWebサイトの初期ロードをバンドルした後、SystemJSはエラーをスローします。
エラー: http:// localhost:57462/app/app.bundle.js 登録として検出されましたが、実行されませんでした。
アプリケーションは動作しますが、コンソールのエラーは間違いなく良いことではありません。
空のプロジェクトで構成をテストしましたが、問題が再び存在するため、問題は構成にあると思います。
ここにあります:
ガルフファイル
var gulp = require('gulp');
var sourcemaps = require('gulp-sourcemaps');
var concat = require('gulp-concat');
var TypeScript = require('gulp-TypeScript');
var jspm = require('gulp-jspm-build');
gulp.task('compile:ts', function () {
return gulp.src(['./appTS/**/*.ts'])
.pipe(sourcemaps.init())
.pipe(TypeScript({
noEmitOnError: true,
target: 'ES5',
removeComments: false,
experimentalDecorators: true,
emitDecoratorMetadata: true,
module: 'system',
moduleResolution: 'node'
}))
.pipe(sourcemaps.write('./'))
.pipe(gulp.dest('./app/'));
});
gulp.task('copy:vendor', function () {
return gulp.src([
'node_modules/systemjs/dist/system-polyfills.js',
'node_modules/reflect-metadata/Reflect.js',
'node_modules/core-js/client/shim.min.js',
'node_modules/zone.js/dist/zone.min.js',
'node_modules/systemjs/dist/system.js',
'node_modules/rxjs/bundles/Rx.js'
]).pipe(gulp.dest('./assets/vendor/'));
});
gulp.task('bundle:app', ['compile:ts'], function () {
return jspm({
bundleOptions: {
minify: true,
mangle: false
},
bundleSfx: true,
bundles: [
{ src: './app/main.js', dst: 'bundle.js' }
]
})
.pipe(gulp.dest('./app/'));
});
gulp.task('bundle', ['bundle:app', 'copy:vendor'], function () {
return gulp.src([
'./assets/vendor/Reflect.js',
'./assets/vendor/shim.min.js',
'./assets/vendor/zone.min.js',
'./app/bundle.js'])
.pipe(concat('app.bundle.js'))
.pipe(gulp.dest('./app/'))
});
gulp.task('default', ['bundle']);
var packages = {
app: {
format: 'register',
defaultExtension: 'js'
},
"symbol-observable": { main: 'index.js', defaultExtension: 'js' },
"reflect-metadata": { main: 'Reflect.js', defaultExtension: 'js' }
};
var ngPackageNames = ['common',
'compiler',
'core',
'http',
'platform-browser',
'platform-browser-dynamic',
'router',
'router-deprecated',
'upgrade'];
ngPackageNames.forEach(function (element, index, array) {
packages['@angular/' + element] = { main: 'bundles/' + element + '.umd.min.js', defaultExtension: 'js' };
});
System.config({
main: 'dispel.bundle.min',
defaultExtension: 'js',
format: 'register',
packages: packages,
baseURL: "/",
defaultJSExtensions: true,
transpiler: false,
paths: {
"node_modules*": "node_modules*",
"@angular*": "node_modules/@angular/*"
},
map: {
"@angular": "node_modules/@angular",
"symbol-observable": "node_modules/symbol-observable",
"ng2-translate": "node_modules/ng2-translate",
"es6-shim": "node_modules/es6-shim",
"reflect-metadata": "node_modules/reflect-metadata",
"rxjs": "node_modules/rxjs",
"zone.js": "node_modules/zone.js"
}
});
Jspmの代わりにbundle:app
gulpタスクで SystemJS Builder を使用してみましたか?
以下は、2.0.0-rc.1( source 、 live example )を実行しているTour of Heroesをバンドルする方法の簡易バージョンです。
gulpfile.js
var gulp = require('gulp');
var sourcemaps = require('gulp-sourcemaps');
var concat = require('gulp-concat');
var TypeScript = require('gulp-TypeScript');
var systemjsBuilder = require('systemjs-builder');
// Compile TypeScript app to JS
gulp.task('compile:ts', function () {
return gulp
.src([
"appTS/**/*.ts",
"typings/*.d.ts"
])
.pipe(sourcemaps.init())
.pipe(TypeScript({
"module": "system",
"moduleResolution": "node",
"outDir": "app",
"target": "ES5"
}))
.pipe(sourcemaps.write('.'))
.pipe(gulp.dest('app'));
});
// Generate systemjs-based bundle (app/app.js)
gulp.task('bundle:app', function() {
var builder = new systemjsBuilder('public', './system.config.js');
return builder.buildStatic('app', 'app/app.js');
});
// Copy and bundle dependencies into one file (vendor/vendors.js)
// system.config.js can also bundled for convenience
gulp.task('bundle:vendor', function () {
return gulp.src([
'node_modules/zone.js/dist/zone.js',
'node_modules/reflect-metadata/Reflect.js',
'node_modules/systemjs/dist/system-polyfills.js',
'node_modules/core-js/client/shim.min.js',
'node_modules/systemjs/dist/system.js',
'system.config.js',
])
.pipe(concat('vendors.js'))
.pipe(gulp.dest('vendor'));
});
// Copy dependencies loaded through SystemJS into dir from node_modules
gulp.task('copy:vendor', function () {
return gulp.src([
'node_modules/rxjs/bundles/Rx.js',
'node_modules/@angular/**/*'
])
.pipe(gulp.dest('vendor'));
});
gulp.task('vendor', ['bundle:vendor', 'copy:vendor']);
gulp.task('app', ['compile:ts', 'bundle:app']);
// Bundle dependencies and app into one file (app.bundle.js)
gulp.task('bundle', ['vendor', 'app'], function () {
return gulp.src([
'app/app.js',
'vendor/vendors.js'
])
.pipe(concat('app.bundle.js'))
.pipe(uglify())
.pipe(gulp.dest('./app'));
});
gulp.task('default', ['bundle']);
system.config.js
var map = {
'app': 'app',
'rxjs': 'vendor/rxjs',
'zonejs': 'vendor/zone.js',
'reflect-metadata': 'vendor/reflect-metadata',
'@angular': 'vendor/@angular'
};
var packages = {
'app': { main: 'main', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' },
'zonejs': { main: 'zone', defaultExtension: 'js' },
'reflect-metadata': { main: 'Reflect', defaultExtension: 'js' }
};
var packageNames = [
'@angular/common',
'@angular/compiler',
'@angular/core',
'@angular/http',
'@angular/platform-browser',
'@angular/platform-browser-dynamic',
'@angular/router',
'@angular/router-deprecated',
'@angular/testing',
'@angular/upgrade',
];
packageNames.forEach(function(pkgName) {
packages[pkgName] = { main: 'index.js', defaultExtension: 'js' };
});
System.config({
map: map,
packages: packages
});
gulp
とAngular 2.4
を使用して本番環境にバンドルしようとしましたが、すべての例でブロッキングの問題がありました。 git clone
の実例でも動作しませんでした。 angular2-webpack-starter を使用してそこにファイルをコピーすることで、ようやく機能するようになりました。 system.config.js
に追加する必要があるSystemJS
を使用し、SystemJS
が望むパターンに依存することを期待する場合に比べて、依存関係は簡単に管理できます。
おそらくこれは助けになるでしょう:
System.config({
"meta": {
"app.bundle.js": {
"format": "register"
}
}
});