Ключевой момент, который нужно понять на этом уровне, заключается в том, что, используя следующую конфигурацию, вы не можете напрямую объединять скомпилированные файлы JS.
В конфигурации компилятора TypeScript:
{
"compilerOptions": {
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"declaration": false,
"stripInternal": true,
"module": "system",
"moduleResolution": "node",
"noEmitOnError": false,
"rootDir": ".",
"inlineSourceMap": true,
"inlineSources": true,
"target": "es5"
},
"exclude": [
"node_modules"
]
}
В HTML
System.config({
packages: {
app: {
defaultExtension: 'js',
format: 'register'
}
}
});
На самом деле эти JS-файлы будут содержать анонимные модули. Анонимный модуль - это файл JS, который использует System.register
имя модуля в качестве первого параметра, но без него. Это то, что компилятор машинописного текста генерирует по умолчанию, когда systemjs настроен как диспетчер модулей.
Итак, чтобы все ваши модули были в одном JS-файле, вам необходимо использовать это outFile
свойство в конфигурации компилятора TypeScript.
Для этого вы можете использовать следующий глоток:
const gulp = require('gulp');
const ts = require('gulp-typescript');
var tsProject = ts.createProject('tsconfig.json', {
typescript: require('typescript'),
outFile: 'app.js'
});
gulp.task('tscompile', function () {
var tsResult = gulp.src('./app/**/*.ts')
.pipe(ts(tsProject));
return tsResult.js.pipe(gulp.dest('./dist'));
});
Это может быть объединено с другой обработкой:
- чтобы уродить скомпилированные файлы TypeScript
- создать
app.js
файл
- создать
vendor.js
файл для сторонних библиотек
- чтобы создать
boot.js
файл для импорта модуля, запускающего приложение. Этот файл должен быть включен в конец страницы (когда вся страница загружена).
- обновить,
index.html
чтобы учесть эти два файла
В задачах gulp используются следующие зависимости:
- глоток-конкат
- глоток-HTML-заменить
- gulp-typescript
- проглотить
Ниже приведен образец для адаптации.
Создать app.min.js
файл
gulp.task('app-bundle', function () {
var tsProject = ts.createProject('tsconfig.json', {
typescript: require('typescript'),
outFile: 'app.js'
});
var tsResult = gulp.src('app/**/*.ts')
.pipe(ts(tsProject));
return tsResult.js.pipe(concat('app.min.js'))
.pipe(uglify())
.pipe(gulp.dest('./dist'));
});
Создать vendors.min.js
файл
gulp.task('vendor-bundle', function() {
gulp.src([
'node_modules/es6-shim/es6-shim.min.js',
'node_modules/systemjs/dist/system-polyfills.js',
'node_modules/angular2/bundles/angular2-polyfills.js',
'node_modules/systemjs/dist/system.src.js',
'node_modules/rxjs/bundles/Rx.js',
'node_modules/angular2/bundles/angular2.dev.js',
'node_modules/angular2/bundles/http.dev.js'
])
.pipe(concat('vendors.min.js'))
.pipe(uglify())
.pipe(gulp.dest('./dist'));
});
Создать boot.min.js
файл
gulp.task('boot-bundle', function() {
gulp.src('config.prod.js')
.pipe(concat('boot.min.js'))
.pipe(uglify())
.pipe(gulp.dest('./dist'));
});
config.prod.js
Просто содержит следующее:
System.import('boot')
.then(null, console.error.bind(console));
Обновите index.html
файл
gulp.task('html', function() {
gulp.src('index.html')
.pipe(htmlreplace({
'vendor': 'vendors.min.js',
'app': 'app.min.js',
'boot': 'boot.min.js'
}))
.pipe(gulp.dest('dist'));
});
Это index.html
выглядит так:
<html>
<head>
<!-- Some CSS -->
<!-- build:vendor -->
<script src="node_modules/es6-shim/es6-shim.min.js"></script>
<script src="node_modules/systemjs/dist/system-polyfills.js"></script>
<script src="node_modules/angular2/bundles/angular2-polyfills.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<script src="node_modules/rxjs/bundles/Rx.js"></script>
<script src="node_modules/angular2/bundles/angular2.dev.js"></script>
<script src="node_modules/angular2/bundles/http.dev.js"></script>
<!-- endbuild -->
<!-- build:app -->
<script src="config.js"></script>
<!-- endbuild -->
</head>
<body>
<my-app>Loading...</my-app>
<!-- build:boot -->
<!-- endbuild -->
</body>
</html>
Обратите внимание, что System.import('boot');
необходимо сделать это в конце тела, чтобы дождаться, пока все компоненты вашего приложения будут зарегистрированы из app.min.js
файла.
Я не описываю здесь способ обработки минификации CSS и HTML.