Angular 2 Ahead-of-Time Compiler with gulp-typescript
用
我正在尝试学习此处概述的Ahead-of-Time编译。 看起来很简单:
-
运行
ngc 而不是Typescript编译器来生成.ngfactory.ts 文件 -
将
platformBrowserDynamic().bootstrapModule() 替换为platformBrowser().bootstrapModuleFactory()
我不确定如何将第一步应用到我的设置中。 我使用
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)); }); |
所以我的问题是; 如何将说明集成到我的工具中? 如何获得
1 2 3 | var tsProject = ts.createProject('tsconfig.json', { typescript: require('@angular/compiler') // or '@angular/compiler-cli' }); |
这将引发错误,而无需运行
1 2 3 | var tsProject = ts.createProject('tsconfig.json', { typescript: require('./node_modules/.bin/ngc') }); |
这确实执行
SyntaxError: Unexpected string at ngc:2: basedir=$(dirname"$(echo"$0" | sed -e 's,\\,/,g')")
我怀疑这是因为没有源目录传递到
基本上,有没有一种方法可以使用
我想
现在,如果您的项目就像编译一样简单,则可以像这样从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); }); }); |
这要求您正确设置
如果您需要gulp-typescript软件包提供的更复杂的功能,恐怕您要么不得不自己开发它,要么等待其他人来开发。
我试图使它也能正常工作,威廉·吉尔默(William Gilmour)的回答很有帮助。
我将其扩展了一点,以运行本地
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插件。