Come diverse persone hanno già detto: tutti i file nella directory node_modules (posizione NPM per i pacchetti) fanno parte delle dipendenze del progetto (le cosiddette dipendenze dirette). In aggiunta a ciò, le tue dipendenze possono anche avere le loro dipendenze e così via, ecc. (Le cosiddette dipendenze transitive). Diverse diecimila file non sono niente di speciale.
Dato che ti è permesso caricare solo 10'000 file (vedi commenti), andrei con un motore bundler. Questo motore raggrupperà tutto il tuo JavaScript, CSS, HTML, ecc. E creerà un singolo pacchetto (o più se li specifichi). Il tuo index.html caricherà questo bundle e il gioco è fatto.
Sono un fan del webpack, quindi la mia soluzione webpack creerà un bundle di applicazioni e un bundle di fornitori (per l'applicazione completa di lavoro consultare qui https://github.com/swaechter/project-collection/tree/master/web-angular2- esempio ):
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));
}
vantaggi:
- Linea di costruzione completa (linting TS, compilazione, minimizzazione, ecc.)
- 3 file per la distribuzione -> Solo alcune richieste HTTP
svantaggi:
- Tempo di costruzione superiore
- Non è la soluzione migliore per i progetti Http 2 (vedi disclaimer)
Dichiarazione di non responsabilità: questa è una buona soluzione per Http 1. *, poiché riduce al minimo il sovraccarico per ogni richiesta Http. Hai solo una richiesta per il tuo index.html e per ogni pacchetto, ma non per 100-200 file. Al momento, questa è la strada da percorrere.
Http 2, d'altra parte, cerca di ridurre al minimo l'overhead Http, quindi si basa su un protocollo di flusso. Questo flusso è in grado di comunicare in entrambe le direzioni (Client <--> Server) e, per questo motivo, è possibile un caricamento delle risorse più intelligente (si caricano solo i file richiesti). Il flusso elimina gran parte dell'overhead Http (meno round trip Http).
Ma è lo stesso di IPv6: ci vorranno alcuni anni prima che le persone usino davvero Http 2