Angular 2 rc 6
撰写的 Typescript 2.0.2
我正在尝试学习Ahead-of-Time编译as outlined here。看起来很简单:
ngc
而不是Typescript编译器来生成.ngfactory.ts
个文件platformBrowserDynamic().bootstrapModule()
替换为platformBrowser().bootstrapModuleFactory()
我不确定如何将第一步应用到我的设置中。我使用gulp-typescript 2.13.6
将我的打字稿编译为JavaScript。
gulpfile.js
var ts = require('gulp-typescript');
var tsProject = ts.createProject('tsconfig.json', {
//Use TS version installed by NPM instead of gulp-typescript's built-in
typescript: require('typescript')
});
gulp.task('build-ts', function () {
return gulp.src(appDev + '**/*.ts')
.pipe(ts(tsProject))
.pipe(gulp.dest(appProd));
});
所以我的问题是;如何将指令集成到我的工具中?如何让gulp-typescript
使用Angular编译器?我试过了:
var tsProject = ts.createProject('tsconfig.json', {
typescript: require('@angular/compiler') // or '@angular/compiler-cli'
});
这会在不运行ngc
的情况下抛出错误。我也试过
var tsProject = ts.createProject('tsconfig.json', {
typescript: require('./node_modules/.bin/ngc')
});
这会执行ngc
但会立即抛出错误:
SyntaxError:ngc上的意外字符串:2:basedir = $(dirname“$(echo”$ 0“| sed -e's,\,/,g')”)
我怀疑这是因为没有源目录传递给ngc
(所需命令为ngc -p path/to/project
)
基本上,有没有办法使用gulp-typescript
进行一步构建过程? (生成.ngfactory.ts
个文件,然后将所有文件编译为JavaScript)
答案 0 :(得分:7)
我想象typescript: require(..)
无效的原因是因为gulp-typescript会查找名为typescript
的内容或尝试运行命令tsc
,因为angular编译命令是ngc
,它找不到它。
现在,如果您的项目就像编译它一样简单,您可以像这样从gulp运行命令:
var exec = require('child_process').exec;
gulp.task('task', function (cb) {
exec('ngc -p "<path to your tsconfig.json>"', function (err, stdout, stderr) {
console.log(stdout);
console.log(stderr);
cb(err);
});
});
这需要您正确设置tsconfig.json
,并在配置标题下设置Google讨论here的潜在额外选项。
如果您需要gulp-typescript包提供的更复杂的功能,我恐怕您要么自己开发它,要么等待其他人来。
答案 1 :(得分:3)
我试图让这个也工作,William Gilmour的answer帮助了很多。
我将其扩展一点以运行本地ngc
安装(例如运行node_modules/.bin
中的角色2 example),并且在Linux和Windows系统上都可以运行:
var exec = require('child_process').exec;
var os = require('os');
gulp.task('build-ts', function (cb) {
var cmd = os.platform() === 'win32' ?
'node_modules\\.bin\\ngc' : './node_modules/.bin/ngc';
exec(cmd, function (err, stdout, stderr) {
console.log(stdout);
console.log(stderr);
cb(err);
});
});
答案 2 :(得分:1)
这是gulpfile的跨平台版本,我目前用于使用角度2的Ahead-Of-Time(AOT)编译:
//jshint node:true
//jshint esversion: 6
'use strict';
...
// helper function for running ngc and tree shaking tasks
const run_proc = (cmd, callBack, options) => {
process.stdout.write(stdout);
process.stdout.write(stderr);
callBack(err);
});
};
gulp.task('ngc', ['css', 'html', 'ts'], cb => {
let cmd = 'node_modules/.bin/ngc -p tsconfig-aot.json';
if (isWin) {
cmd = '"node_modules/.bin/ngc" -p tsconfig-aot.json';
}
return run_proc(cmd, cb);
});
随时在我的github repo上查看gulp.js的Tour of Heroes (ToH)示例的完整示例:ng2-heroes-gulp
这肯定是短期解决方案,对我而言,长期解决方案将是gulp-ngc插件。