Angular2とTypeScriptを使用してアプリ(大規模)を作成しています。多数のプロジェクトに分割する必要があり、各プロジェクトには、.html
ビュー、.css
スタイルシート、および.ts
ロジック/クラスを備えた多数のコンポーネントがあります。
各プロジェクトを1つの*.js
ファイルにコンパイルし、IISで実行されるホストWebサイトにコピーするようにします。これは、.xaml
ファイルをすべて.dll
にコンパイルしてWPFまたはSilverlightアプリを構築する方法と似ています。
私はWebを見回しており、.ts
ファイルを.js
オプションを使用して単一の--outFile
ファイルにビルドすることができます。しかし、これは.html
ファイルやcss
の助けにはなりません。
私が求めていることは不可能だと言っていても、どんな助けでも大歓迎です:-)
スティーブン
SystemJS loader でデフォルトのAngular2 _tsconfig.json
_を使用している場合:
_"module": "system",
"moduleResolution": "node",
...
_
SystemJS Build Tool のすべての重い作業はそのままにしておくことができます。これは、たとえば、プロジェクトでgulp
を使用して行う方法です。
*。tsおよびインライン* .htmlテンプレートをコンパイルします
私は _gulp-angular-embed-templates
_ をすぐに使用して、すべてのtemplateUrl
をtemplate
文字列にインライン化します(このプラグインはAngular = 1. *およびAngular 2)。
_var tsc = require('gulp-TypeScript');
var tsProject = tsc.createProject('tsconfig.json');
var embedTemplates = require('gulp-angular-embed-templates');
gulp.task('app.build', function () {
var tsResult = gulp.src('app/src/**/*.ts', {base: './app/src'})
.pipe(embedTemplates()) // inline templates
.pipe(tsc(tsProject));
return tsResult.js
.pipe(gulp.dest('build/js'));
});
_
これにより、_build/js
_ディレクトリに多数の anonymous System.register modules が生成されます。それらのすべては、templateUrl
がすでにインライン化されています。
すべてを1つの_.js
_ファイルにバンドルします
これには SystemJS Build Tool を使用します。たとえば、webpackを使用するよりも簡単だと思うからです。それで、私はこれをプロセスを自動化するための別の根本的なタスクがあります:
_var SystemBuilder = require('systemjs-builder');
gulp.task('app.systemjs.bundle', function () {
var builder = new SystemBuilder('build/js, {
paths: {
'*': '*.js'
},
meta: {
'angular2/*': {
build: false
},
'rxjs/*': {
build: false
}
}
});
return builder.bundle('main', 'build/js/app.bundle.js');
});
_
ビルダーは SystemJS と同じオプションを取るため、その Config API を確認してください。
builder.bundle('main', ...)
を呼び出すと、_main.js
_が検索されます(これは、Angularのbootstrap
呼び出しを使用した最初のスクリプトです。これは、表示されるファイルと同じです 5分のクイックスタートで )ビルダーが検索したすべてのパスに_.js
_を追加するためです。これは、TSにモジュールをインポートするときに、通常次のように呼び出すためです。
_import {ModalResultComponent} from './modal-result.component';
_
これは_./modal-result.component
_依存関係としてコンパイルされ、ファイル拡張子は関係ありません。そのため、すべてのパスに_*.js
_を追加して、ビルダーがすべてのコンパイル済みJavaScriptファイルを検索できるようにする必要がありました。
meta
オプションは、バンドルしたくない依存関係を無視するようにビルダーに指示するだけです。 _import 'rxjs/add/operator/map'
_に_main.ts
_を含めているので、これはAngular2自体とrxjs
ライブラリです。
これにより、すべてのモジュールが System.register を使用して名前付きモジュールとして登録された単一の_app.bundle.js
_ファイルが生成されます。
_app.bundle.js
_を使用する
最後はケーキです。デフォルトのAngular2のものをインポートし、 bundle
option を使用して、SystemJSにすべての依存関係がある場所を通知します。
_<script>
System.config({
packages: {
'/web': {
format: 'register',
defaultExtension: 'js'
}
},
bundles: {
'/web/app.bundle': ['main']
}
});
System.import('main').then(null, console.error.bind(console));
</script>
_
実際にSystem.import('main')
を呼び出すと、実際にはまず_/web/app.bundle.js
_をダウンロードしてパッケージ内のすべてのモジュールを登録し、その後モジュールをmain
をAngular2ブートストラップにインポートします。
以上です!
実際には、gulp
を使用する必要はまったくなく、純粋なnode
スクリプトですべてを実行する必要があります。
CSSファイルのバンドルは cssnano のようなもので簡単で、どこでもそれを使用する方法のチュートリアルを見つけることができると思います。
同じことをする他の方法があると確信しています。 Angular2は、1つのテクノロジーだけを使用するように制限しないように設計されています。ただし、デフォルトではAngular2と同じモジュールシステムを使用しているので、SystemJSを使用するのが最も簡単な方法のようです。
たとえばcommonjs
形式も使用できると思いますが、require()
ローダーにポリフィルも使用する必要がありますが、まだ試していません。私は生きている [〜#〜] umd [〜#〜] も試してみる価値があるかもしれません。