Como varias personas ya mencionaron: Todos los archivos en su directorio node_modules (ubicación NPM para paquetes) son parte de las dependencias de su proyecto (las llamadas dependencias directas). Además de eso, sus dependencias también pueden tener sus propias dependencias, etc. (llamadas dependencias transitivas). Varios diez mil archivos no son nada especial.
Debido a que solo puedes subir 10'000 archivos (ver comentarios), iría con un motor de paquetes. Este motor agrupará todos sus JavaScript, CSS, HTML, etc. y creará un solo paquete (o más si los especifica). Su index.html cargará este paquete y listo.
Soy un fanático de webpack, por lo que mi solución de paquete web creará un paquete de aplicaciones y un paquete de proveedores (para ver la aplicación de trabajo completa, consulte aquí https://github.com/swaechter/project-collection/tree/master/web-angular2- ejemplo ):
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));
}
Ventajas:
- Línea de compilación completa (TS linting, compilación, minificación, etc.)
- 3 archivos para implementación -> Solo unas pocas solicitudes Http
Desventajas
- Mayor tiempo de construcción
- No es la mejor solución para proyectos Http 2 (Ver descargo de responsabilidad)
Descargo de responsabilidad: esta es una buena solución para Http 1. *, ya que minimiza la sobrecarga para cada solicitud Http. Solo tiene una solicitud para su index.html y cada paquete, pero no para 100-200 archivos. Por el momento, este es el camino a seguir.
Http 2, por otro lado, intenta minimizar la sobrecarga de Http, por lo que se basa en un protocolo de transmisión. Este flujo puede comunicarse en ambas direcciones (Cliente <--> Servidor) y, por eso, es posible una carga de recursos más inteligente (Solo carga los archivos necesarios). La secuencia elimina gran parte de la sobrecarga Http (menos viajes de ida y vuelta Http).
Pero es lo mismo que con IPv6: tomará algunos años hasta que la gente realmente use Http 2