जैसा कि कई लोगों ने पहले ही उल्लेख किया है: आपके नोड_मॉडल्स निर्देशिका (पैकेज के लिए एनपीएम स्थान) की सभी फाइलें आपके प्रोजेक्ट निर्भरता (तथाकथित प्रत्यक्ष निर्भरता) का हिस्सा हैं। इसके अतिरिक्त, आपकी निर्भरताओं की अपनी निर्भरताएं भी हो सकती हैं, इत्यादि, आदि (तथाकथित सकर्मक निर्भरताएं)। कई दस हजार फाइलें कुछ खास नहीं हैं।
क्योंकि आपको केवल 10'000 फाइलें (टिप्पणियां देखें) अपलोड करने की अनुमति है, मैं एक बंडल इंजन के साथ जाऊंगा। यह इंजन आपके सभी जावास्क्रिप्ट, सीएसएस, एचटीएमएल, आदि को बंडल करेगा और एक बंडल बना देगा (या यदि आप उन्हें निर्दिष्ट करते हैं तो अधिक)। आपका index.html इस बंडल को लोड करेगा और यही है।
मैं वेबपैक का प्रशंसक हूं, इसलिए मेरा वेबपैक समाधान एक एप्लिकेशन बंडल और एक विक्रेता बंडल बनाएगा (पूर्ण काम करने वाले एप्लिकेशन के लिए यहां देखें https://github.com/swaechter/project-collection/tree/master/web-angular2- उदाहरण ):
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));
}
लाभ:
- पूर्ण बिल्ड लाइन (टीएस लाइनिंग, संकलन, खनन, आदि)
- तैनाती के लिए 3 फाइलें -> केवल कुछ Http अनुरोध
नुकसान:
- उच्च निर्माण समय
- Http 2 परियोजनाओं के लिए सबसे अच्छा समाधान नहीं है (अस्वीकरण देखें)
डिस्क्लेमर: यह Http 1 * के लिए एक अच्छा समाधान है, क्योंकि यह प्रत्येक Http अनुरोध के लिए ओवरहेड को कम करता है। आपके पास केवल अपने index.html और प्रत्येक बंडल के लिए एक अनुरोध है - लेकिन 100 - 200 फ़ाइलों के लिए नहीं। फिलहाल, यही रास्ता तय करना है।
दूसरी ओर, एचटीपी 2, एचटीपी ओवरहेड को कम करने की कोशिश करता है, इसलिए यह एक स्ट्रीम प्रोटोकॉल पर आधारित है। यह स्ट्रीम दोनों दिशाओं (क्लाइंट <-> सर्वर) में संचार करने में सक्षम है और उसी के कारण, एक अधिक बुद्धिमान संसाधन लोडिंग संभव है (आप केवल आवश्यक फ़ाइलों को लोड करते हैं)। स्ट्रीम Http ओवरहेड (कम Http दौर यात्राएं) के बहुत कुछ को समाप्त करता है।
लेकिन यह IPv6 की तरह ही है: इसमें कुछ साल लगेंगे जब तक लोग वास्तव में Http 2 का इस्तेमाल नहीं करेंगे