Daha önce de belirtildiği gibi: node_modules dizininizdeki (paketler için NPM konumu) tüm dosyalar proje bağımlılıklarınızın bir parçasıdır (Doğrudan bağımlılıklar denir). Buna ek olarak, bağımlılıklarınızın da kendi bağımlılıkları vb. Olabilir. (Geçişli bağımlılıklar denir). Birkaç on bin dosya özel bir şey değildir.
Yalnızca 10.000 dosya yüklemenize izin verildiği için (Yorumlara bakın), bir bundler motoruyla giderdim. Bu motor, tüm JavaScript, CSS, HTML vb. Öğelerinizi bir araya getirecek ve tek bir demet oluşturacak (veya belirttiğinizde daha fazla). İndex.html dosyanız bu paketi yükleyecek ve hepsi bu kadar.
Ben bir webpack hayranıyım, bu yüzden webpack çözümüm bir uygulama paketi ve bir satıcı paketi oluşturacak (Tam çalışan uygulama için buraya bakın https://github.com/swaechter/project-collection/tree/master/web-angular2- örnek ):
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));
}
Avantajları:
- Komple üretim hattı (TS astarlama, derleme, küçültme vb.)
- Dağıtım için 3 dosya -> Yalnızca birkaç Http isteği
Dezavantajları:
- Daha yüksek inşa süresi
- Http 2 projeleri için en iyi çözüm değil (Feragatnameye bakın)
Feragatname: Bu, Http 1 * için iyi bir çözümdür, çünkü her Http isteği için ek yükü en aza indirir. Yalnızca index.html ve her paket için bir isteğiniz vardır, ancak 100-200 dosya için değil. Şu an, bu yol.
Http 2, diğer taraftan, Http yükünü en aza indirmeye çalışır, bu nedenle bir akış protokolüne dayanır. Bu akış her iki yönde de iletişim kurabilir (İstemci <--> Sunucu) ve bu nedenle daha akıllı bir kaynak yüklemesi mümkündür (Yalnızca gerekli dosyaları yüklersiniz). Akış, Http ek yükünün çoğunu ortadan kaldırır (Daha az Http turları).
Ancak IPv6 ile aynı: İnsanların gerçekten Http 2'yi kullanması birkaç yıl sürecek