Angular用のシンプルなHello Worldアプリを起動したいと思いました。
公式クイックスタートの指示に従ってインストールすると、プロジェクトに32,000個のファイルが作成されました。
これは間違いであるか、何かを見逃していると思ったので、angular-cliを使用することにしましたが、プロジェクトを設定した後、41,000ファイルをカウントしました。
どこで私は間違えましたか?私は本当に本当に明白な何かを見逃していますか?
Angular用のシンプルなHello Worldアプリを起動したいと思いました。
公式クイックスタートの指示に従ってインストールすると、プロジェクトに32,000個のファイルが作成されました。
これは間違いであるか、何かを見逃していると思ったので、angular-cliを使用することにしましたが、プロジェクトを設定した後、41,000ファイルをカウントしました。
どこで私は間違えましたか?私は本当に本当に明白な何かを見逃していますか?
回答:
設定に問題はありません。
Angular(バージョン2.0以降)は、開発にnpmモジュールと依存関係を使用します。これが、膨大な数のファイルが表示される唯一の理由です。
Angularの基本セットアップには、トランスパイラー、タイピングの依存関係が含まれていますが、これらは開発目的でのみ必要です。
開発が完了したら、このアプリケーションをバンドルするだけで済みます。
アプリケーションをバンドルbundle.js
すると、サーバーにデプロイできるファイルは1つだけになります。
'transpiler'は単なるコンパイラです。@ omninonsenseが追加してくれてありがとう。
Typical Angular2 Project
NPMパッケージ ファイル(開発) 実際のファイル(展開)
@angular 3,236 1
rxJS 1,349 1*
core-js 1,341 2
typings 1,488 0
gulp 1,218 0
gulp-typescript 1,243 0
lite-server 5,654 0
systemjs-builder 6,470 0
__________________________________________________________________
Total 21,999 3
*
: bundled with @angular
-3
合計を行わなかったために与えられたと思いますが、今私は持っています:)
開発構成に問題はありません。
プロダクション構成に問題があります。
「Angular 2プロジェクト」または「JSに基づく任意のプロジェクト」を開発する場合、すべてのファイルを使用でき、すべてのファイルを試すことができ、すべてのファイルをインポートできます。ただし、このプロジェクトを提供する場合は、すべての構造化ファイルを結合し、不要なファイルを取り除く必要があります。
これらのファイルを組み合わせるためのオプションはたくさんあります。
いくつかの人がすでに述べたように:node_modulesディレクトリー(パッケージのNPMロケーション)内のすべてのファイルは、プロジェクトの依存関係(いわゆる直接依存関係)の一部です。これに加えて、依存関係は独自の依存関係などを持つこともできます(いわゆる推移的な依存関係)。数万のファイルは特別なものではありません。
アップロードできるのは10'000ファイル(コメントを参照)だけなので、私はバンドルエンジンを使用します。このエンジンは、すべてのJavaScript、CSS、HTMLなどをバンドルし、単一のバンドル(または指定した場合はさらにバンドル)を作成します。あなたのindex.htmlはこのバンドルをロードし、それだけです。
私はwebpackのファンなので、私のwebpackソリューションはアプリケーションバンドルとベンダーバンドルを作成します(完全に機能するアプリケーションについては、https://github.com/swaechter/project-collection/tree/master/web-angular2-を参照してください)例):
index.html
<!DOCTYPE html>
<html>
<head>
<base href="/">
<title>Webcms</title>
</head>
<body>
<webcms-application>Applikation wird geladen, bitte warten...</webcms-application>
<script type="text/javascript" src="vendor.bundle.js"></script>
<script type="text/javascript" src="main.bundle.js"></script>
</body>
</html>
webpack.config.js
var webpack = require("webpack");
var path = require('path');
var ProvidePlugin = require('webpack/lib/ProvidePlugin');
var CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin');
var UglifyJsPlugin = require('webpack/lib/optimize/UglifyJsPlugin');
/*
* Configuration
*/
module.exports = {
devtool: 'source-map',
debug: true,
entry: {
'main': './app/main.ts'
},
// Bundle configuration
output: {
path: root('dist'),
filename: '[name].bundle.js',
sourceMapFilename: '[name].map',
chunkFilename: '[id].chunk.js'
},
// Include configuration
resolve: {
extensions: ['', '.ts', '.js', '.css', '.html']
},
// Module configuration
module: {
preLoaders: [
// Lint all TypeScript files
{test: /\.ts$/, loader: 'tslint-loader'}
],
loaders: [
// Include all TypeScript files
{test: /\.ts$/, loader: 'ts-loader'},
// Include all HTML files
{test: /\.html$/, loader: 'raw-loader'},
// Include all CSS files
{test: /\.css$/, loader: 'raw-loader'},
]
},
// Plugin configuration
plugins: [
// Bundle all third party libraries
new CommonsChunkPlugin({name: 'vendor', filename: 'vendor.bundle.js', minChunks: Infinity}),
// Uglify all bundles
new UglifyJsPlugin({compress: {warnings: false}}),
],
// Linter configuration
tslint: {
emitErrors: false,
failOnHint: false
}
};
// Helper functions
function root(args) {
args = Array.prototype.slice.call(arguments, 0);
return path.join.apply(path, [__dirname].concat(args));
}
利点:
短所:
免責事項:これは、各Httpリクエストのオーバーヘッドを最小限に抑えるため、Http 1. *の優れたソリューションです。index.htmlと各バンドルに対するリクエストのみがあり、100〜200ファイルに対するリクエストはありません。現時点では、これが方法です。
一方、Http 2はHttpオーバーヘッドを最小限に抑えようとするため、ストリームプロトコルに基づいています。このストリームは双方向(クライアント<->サーバー)で通信でき、そのため、よりインテリジェントなリソースのロードが可能です(必要なファイルのみをロードします)。ストリームにより、HTTPオーバーヘッドの大部分が排除されます(HTTPラウンドトリップが少なくなります)。
しかし、それはIPv6と同じです。人々が実際にHttp 2を使用するようになるまでには数年かかります
angular-cli
は、すでにバンドラー(同じ推奨Webパック)に付属している使用方法が記載されているため、必要ありません。
Angular CLIによって生成されたプロジェクトからdist(配布可能の略)フォルダーをデプロイしていることを確認する必要があります。これにより、ツールでソースコードとその依存関係を取得し、アプリケーションを実行するために必要なものだけを提供できます。
ng build --prodを介した本番環境のビルドに関して、Angular CLIに問題がある、またはあったと言われている
昨日(2016年8月2日)、ビルドメカニズムをブロッコリー + systemjsから本番環境ビルドを正常に処理するWebpackに切り替えたリリースが行われました。
これらのステップに基づいて:
ng new test-project
ng build --prod
私は見ていますdist
のフォルダサイズ1.1メガバイトを越えて14個のファイルここに記載されています:
./app/index.js
./app/size-check.component.css
./app/size-check.component.html
./favicon.ico
./index.html
./main.js
./system-config.js
./tsconfig.json
./vendor/es6-shim/es6-shim.js
./vendor/reflect-metadata/Reflect.js
./vendor/systemjs/dist/system.src.js
./vendor/zone.js/dist/zone.js
注:現在、角度cliのwebpackバージョンをインストールするには、実行する必要があります...npm install angular-cli@webpack -g
Angular自体には多くの依存関係があり、CLIのベータ版は4倍のファイルをダウンロードします。
これは、単純なプロジェクトを作成する方法で、ファイルが少なくなります(「10Kファイルのみ」) https://yakovfain.com/2016/05/06/starting-an-angular-2-rc-1-project/
ここで説明されているように、誰もがAhead-of-Timeコンパイルについて言及していないようです:https : //angular.io/docs/ts/latest/cookbook/aot-compiler.html
これまでの私のAngularの経験では、AoTはロード時間がほとんどなく、最小のビルドを作成します。そして、ここでの質問が最も重要である-あなたは本番にいくつかのファイルを出荷する必要があるだけです。
これは、テンプレートが「Ahead of Time」でコンパイルされるため、Angularコンパイラが製品ビルドに同梱されないためであると思われます。HTMLテンプレートのマークアップが、元のHTMLにリバースエンジニアリングするのが非常に難しいJavaScript命令に変換されるのを見るのも非常にクールです。
開発サイズとAoTビルドのAngularアプリのダウンロードサイズ、ファイル数などを示す簡単なビデオを作成しました。
デモのソースコードは次の場所にあります。
https://github.com/fintechneo/angular2-templates
そして、他のすべての人がここで言ったように、開発環境に多くのファイルがあっても問題はありません。これが、Angularに付属するすべての依存関係、およびその他の多くの最新のフレームワークとの関係です。ただし、ここでの違いは、本番環境に出荷するときに、いくつかのファイルにパックできることです。また、gitリポジトリにこれらの依存関係ファイルのすべてが必要なわけではありません。
これは実際にはAngular固有ではなく、ツールにNodeJs / npmエコシステムを使用するほとんどすべてのプロジェクトで発生します。
これらのプロジェクトは、node_modulesフォルダー内にあり、直接の依存関係を実行する必要がある一時的な依存関係です。
ノードでは、エコシステムモジュールは通常小さいので、自分で開発するのではなく、必要なもののほとんどをモジュールの形でインポートする傾向があります。これには、有名な左パッド機能などの小さなものを含めることができます。演習としてではないのに、なぜ自分で書くのですか
したがって、多くのファイルがあることは実際には良いことです。つまり、すべてが非常にモジュール化されており、モジュールの作成者は他のモジュールを頻繁に再利用しました。このモジュール化の容易さは、おそらくノードエコシステムが急速に成長した主な理由の1つです。
原則としてこれで問題が発生することはありませんが、Google App Engineのファイル数の制限に達したようです。その場合、node_modulesをApp Engineにアップロードしないことをお勧めします。
代わりに、アプリケーションをローカルでビルドし、バンドルされたファイルのみをGoogle App Engineにアップロードします。ただし、App Engine自体にはビルドしません。
最近、angular cliを使用して新しいプロジェクトを作成し、node_modulesフォルダーが270 mbだったので、これは正常ですが、angular worldのほとんどの新しい開発者がこれを疑問視し、有効であると確信しています。単純な新しいプロジェクトの場合は、依存関係を少し削減することは理にかなっています;)すべてのパッケージが依存しているものを知らないことは、特に初めてcliを試す新しい開発者にとって、少し不安になります。加えて、ほとんどの基本的なチュートリアルでは、必要なエクスポートファイルのみを取得するための配置設定については説明していません。Angularの公式Webサイトで提供されているチュートリアルでさえ、単純なプロジェクトをデプロイする方法について話しているとは思えません。
ファイルシステムがシンボリックリンクをサポートしている場合は、少なくともこれらすべてのファイルを隠しフォルダーに委任するtree
ことができます。これにより、などのスマートツールはデフォルトでそれらを表示しません。
mv node_modules .blergyblerp && ln -s .blergyblerp node_modules
このために隠しフォルダーを使用すると、これらがビルド関連の中間ファイルであり、リビジョン管理に保存する必要がない、またはデプロイメントで直接使用する必要がないことを理解するのにも役立ちます。
何も問題はありません。これらは、package.jsonで言及したすべてのノードの依存関係です。
gitハブプロジェクトの一部をダウンロードした場合は注意してください。他の依存関係が多数あり、実際には角度2の最初のHello Worldアプリには必要ありません。