带有gulp-typescript的Angular 2提前编译器

Angular 2 Ahead-of-Time Compiler with gulp-typescript

Typescript 2.0.2编写的Angular 2 rc 6

我正在尝试学习此处概述的Ahead-of-Time编译。 看起来很简单:

  • 运行ngc而不是Typescript编译器来生成.ngfactory.ts文件
  • platformBrowserDynamic().bootstrapModule()替换为platformBrowser().bootstrapModuleFactory()

我不确定如何将第一步应用到我的设置中。 我使用gulp-typescript 2.13.6将我的打字稿编译为JavaScript。

gulpfile.js

1
2
3
4
5
6
7
8
9
10
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编译器? 我试过了:

1
2
3
var tsProject = ts.createProject('tsconfig.json', {
    typescript: require('@angular/compiler') // or '@angular/compiler-cli'
});

这将引发错误,而无需运行ngc。 我也试过

1
2
3
var tsProject = ts.createProject('tsconfig.json', {
    typescript: require('./node_modules/.bin/ngc')
});

这确实执行ngc,但立即引发错误:

SyntaxError: Unexpected string at ngc:2: basedir=$(dirname"$(echo"$0" | sed -e 's,\\,/,g')")

我怀疑这是因为没有源目录传递到ngc(所需的命令是ngc -p path/to/project)

基本上,有没有一种方法可以使用gulp-typescript进行一步构建? (生成.ngfactory.ts文件,然后全部编译为JavaScript)


我想typescript: require(..)不能正常工作的原因是因为gulp-typescript寻找typescript之类的东西或试图运行命令tsc,并且由于angular编译器命令是ngc,所以找不到它。

现在,如果您的项目就像编译一样简单,则可以像这样从gulp运行命令:

1
2
3
4
5
6
7
8
9
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此处讨论的潜在其他选项。

如果您需要gulp-typescript软件包提供的更复杂的功能,恐怕您要么不得不自己开发它,要么等待其他人来开发。


我试图使它也能正常工作,威廉·吉尔默(William Gilmour)的回答很有帮助。

我将其扩展了一点,以运行本地ngc安装(例如在node_modules/.bin中运行一个2的有角度的示例),并且可以在Linux和Windows系统上运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var exec = require('child_process').exec;
var os = require('os');

gulp.task('build-ts', function (cb) {

    var cmd = os.platform() === 'win32' ?
        'node_modules\\\\.bin\\\
gc' : './node_modules/.bin/ngc';

    exec(cmd, function (err, stdout, stderr) {
        console.log(stdout);
        console.log(stderr);
        cb(err);
    });
});

这是gulpfile的跨平台版本,我目前正在使用角度2进行Ahead-Of-Time(AOT)编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//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存储库上使用gulp.js随意查看《英雄之旅》(ToH)示例的完整示例:ng2-heroes-gulp

这肯定是短期解决方案,对我来说,长期解决方案将是gulp-ngc插件。