Como preparar versão de lançamento com SystemJS e Gulp?

Eu uso o SystemJS no meu projeto Angular2. Eu uso o arquivo tsconfig para o TypeScript. Eu quero usar gulp para concat e minify meu código para a versão de produção. Estou tendo problemas com a concatenação do código: cada vez que tento concatenar arquivos, recebo ‘angular‘ não definido ou ‘sistema’ não definido. Eu tentei modificar a ordem que eu tento carregar meus arquivos de módulos de nó, no entanto eu não consegui.

Eu queria saber se algum de vocês teve esses problemas e encontrou uma resposta para isso?

Aqui está o meu arquivo gulp:

var gulp = require('gulp'), ..... var paths = { dist: 'dist', vendor: { js: [ 'node_modules/systemjs/dist/system.src.js', 'node_modules/angular2/bundles/angular2.dev.js', 'node_modules/angular2/bundles/angular2-polyfills.js', 'node_modules/angular2/bundles/router.dev.js' ... ], css: [] }, app: { templates: [ 'app/**/*.html', '!node_modules/*.html' ], scripts: [ 'app/**/*.ts', 'app/config.ts', 'app/app.ts' ] } }; var tsProject = ts.createProject('tsconfig.json', { out: 'Whatever.js' }); gulp.task('dev:build:templates', function () { return gulp.src(paths.app.templates) .pipe(ngHtml2Js({ moduleName: 'Whatever', declareModule: false })) .pipe(concat("Whatever.tpls.min.js")) .pipe(gulp.dest(paths.dist)); }); gulp.task('prod:build:templates', function () { return gulp.src(paths.app.templates) .pipe(minifyHtml({ empty: true, spare: true, quotes: true })) .pipe(ngHtml2Js({ moduleName: 'whatever', declareModule: false })) .pipe(concat(paths.appName + ".tpls.min.js")) .pipe(uglify()) .pipe(gulp.dest(paths.dist)); }); gulp.task('dev:build:scripts', function () { var tsResult = tsProject.src() .pipe(sourcemaps.init()) .pipe(ts(tsProject)); return tsResult.js .pipe(sourcemaps.write({ sourceRoot: '/app' })) .pipe(concat('whatever.js')) .pipe(gulp.dest(paths.dist)); }); gulp.task('dev:build:styles', function () { return gulp.src(paths.app.styles) .pipe(sass()) .pipe(gulp.dest(paths.dist + '/css')); }); gulp.task('dev:build:vendor', function () { return gulp.src(paths.vendor.js) .pipe(concat('vendor.min.js')) .pipe(gulp.dest(paths.dist)) }); gulp.task('dev:build', [ 'dev:build:vendor', 'dev:build:templates', 'dev:build:scripts', 'dev:build:styles', ], function () { }); 

É assim que eu carrego meus arquivos:

     

E aqui estão os erores que estou recebendo:

 Uncaught TypeError: Unexpected anonymous System.register call.(anonymous function) @ vendor.min.js:2680load.metadata.format @ vendor.min.js:3220oldModule @ vendor.min.js:3749(anonymous function) @ vendor.min.js:2411SystemJSLoader.register @ vendor.min.js:2636(anonymous function) @ Whatever.js:2 Whatever.tpls.min.js:1 Uncaught ReferenceError: angular is not defined 

Você receberá “chamada System.register anônima inesperada” porque as referências não estão sendo carregadas na ordem correta. Eu uso o JSPM para construir corretamente meu aplicativo angular para produção. Existem 4 partes para o processo.

Parte 1: Compile seus arquivos typescripts

 var ts = require("gulp-typescript"); var tsProject = ts.createProject("./App/tsconfig.json"); gulp.task("compile:ts", function () { var tsResult = tsProject.src() .pipe(ts(tsProject)); tsResult.js.pipe(gulp.dest("./wwwroot/app")); }); 

Você pode usar o SystemJS Builder

tão fácil quanto isso

 var path = require("path"); var Builder = require('systemjs-builder'); // optional constructor options // sets the baseURL and loads the configuration file var builder = new Builder('path/to/baseURL', 'path/to/system/config-file.js'); builder .bundle('local/module.js', 'outfile.js') .then(function() { console.log('Build complete'); }) .catch(function(err) { console.log('Build error'); console.log(err); }); 

você pode olhar para a configuração completa no meu projeto inicial

Acho que encontramos a causa raiz disso. Honestamente, eu já estive lá antes, então a maneira como eu traço esse tipo de problema é

  1. Verifique se angular e systemjs são carregados antecipadamente.
  2. Verifique se eles estão realmente carregados. não 404 surpresa. (Soa estúpido mas a merda acontece)
  3. Se você agrupar bibliotecas como vender.js, certifique-se de que elas estejam agrupadas na sequência correta. Verifique o arquivo de saída e veja se eles estão concatidos da maneira esperada.