Jak już wspomniano kilka osób: Wszystkie pliki w katalogu node_modules (lokalizacja NPM dla pakietów) są częścią zależności projektu (tzw. Zależności bezpośrednie). Dodatkowo, twoje zależności mogą również mieć swoje własne zależności itp. (Tzw. Zależności przechodnie). Kilka dziesięciu tysięcy plików to nic specjalnego.
Ponieważ możesz przesyłać tylko 10 000 plików (patrz komentarze), wybrałbym silnik pakujący. Ten silnik połączy wszystkie twoje JavaScript, CSS, HTML itp. I utworzy jeden pakiet (lub więcej, jeśli je określisz). Twój index.html załaduje ten pakiet i to wszystko.
Jestem fanem pakietu webpack, więc moje rozwiązanie webpack utworzy pakiet aplikacji i pakiet dostawcy (pełny działający program znajduje się tutaj https://github.com/swaechter/project-collection/tree/master/web-angular2- przykład ):
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));
}
Zalety:
- Pełna linia kompilacji (kłaczkowanie, kompilacja, minimalizacja itp.)
- 3 pliki do wdrożenia -> Tylko kilka żądań HTTP
Niedogodności:
- Wyższy czas budowy
- Nie najlepsze rozwiązanie dla projektów HTTP 2 (zobacz wyłączenie odpowiedzialności)
Oświadczenie: Jest to dobre rozwiązanie dla Http 1. *, ponieważ minimalizuje obciążenie ogólne dla każdego żądania HTTP. Masz tylko prośbę o indeks.html i każdy pakiet - ale nie o 100-200 plików. W tej chwili jest to właściwy sposób.
Z drugiej strony Http 2 próbuje zminimalizować narzut HTTP, więc jest oparty na protokole strumieniowym. Strumień ten może komunikować się w obu kierunkach (Klient <--> Serwer), dlatego możliwe jest bardziej inteligentne ładowanie zasobów (ładujesz tylko wymagane pliki). Strumień eliminuje znaczną część narzutu HTTP (mniej podróży w obie strony HTTP).
Ale to tak samo, jak w przypadku IPv6: minie kilka lat, zanim ludzie naprawdę zaczną korzystać z HTTP 2