Wie bereits von mehreren Personen erwähnt: Alle Dateien in Ihrem Verzeichnis node_modules (NPM-Speicherort für Pakete) sind Teil Ihrer Projektabhängigkeiten (sogenannte direkte Abhängigkeiten). Darüber hinaus können Ihre Abhängigkeiten auch eigene Abhängigkeiten usw. haben (sogenannte transitive Abhängigkeiten). Mehrere zehntausend Dateien sind nichts Besonderes.
Da Sie nur 10'000 Dateien hochladen dürfen (siehe Kommentare), würde ich mich für eine Bundler-Engine entscheiden. Diese Engine bündelt Ihr gesamtes JavaScript, CSS, HTML usw. und erstellt ein einzelnes Bundle (oder mehr, wenn Sie diese angeben). Ihre index.html lädt dieses Bundle und das wars.
Ich bin ein Fan von Webpack, daher erstellt meine Webpack-Lösung ein Anwendungspaket und ein Anbieterpaket (Die voll funktionsfähige Anwendung finden Sie hier https://github.com/swaechter/project-collection/tree/master/web-angular2- Beispiel ):
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));
}
Vorteile:
- Vollständige Build-Linie (TS-Flusen, Kompilieren, Minimieren usw.)
- 3 Dateien für die Bereitstellung -> Nur wenige HTTP-Anforderungen
Nachteile:
- Höhere Bauzeit
- Nicht die beste Lösung für HTTP 2-Projekte (siehe Haftungsausschluss)
Haftungsausschluss: Dies ist eine gute Lösung für HTTP 1. *, da dadurch der Overhead für jede HTTP-Anforderung minimiert wird. Sie haben nur eine Anfrage für Ihre index.html und jedes Bundle - nicht jedoch für 100 - 200 Dateien. Im Moment ist dies der richtige Weg.
Http 2 hingegen versucht, den Http-Overhead zu minimieren, sodass es auf einem Stream-Protokoll basiert. Dieser Stream kann in beide Richtungen kommunizieren (Client <-> Server). Aus diesem Grund ist ein intelligenteres Laden von Ressourcen möglich (Sie laden nur die erforderlichen Dateien). Der Stream eliminiert einen Großteil des HTTP-Overheads (weniger HTTP-Roundtrips).
Aber es ist das gleiche wie bei IPv6: Es wird einige Jahre dauern, bis die Leute wirklich HTTP 2 verwenden