लाइव वेब सर्वर पर उत्पादन के लिए कोणीय (संस्करण 2, 4, 6, ...) को बंडल करने की सबसे अच्छी विधि क्या है।
कृपया जवाब के भीतर कोणीय संस्करण को शामिल करें ताकि बाद में रिलीज़ होने पर हम बेहतर तरीके से ट्रैक कर सकें।
लाइव वेब सर्वर पर उत्पादन के लिए कोणीय (संस्करण 2, 4, 6, ...) को बंडल करने की सबसे अच्छी विधि क्या है।
कृपया जवाब के भीतर कोणीय संस्करण को शामिल करें ताकि बाद में रिलीज़ होने पर हम बेहतर तरीके से ट्रैक कर सकें।
जवाबों:
2.x, 4.x, 5.x, 6.x, 7.x, 8.x, 9.x
(टाइपस्क्रिप्ट) कोणीय सीएलआई के साथnpm install -g @angular/cli
ng new projectFolder
एक नया अनुप्रयोग बनाता हैng build --prod
(जब निर्देशिका है कमांड लाइन में चलाएं projectFolder
)
prod
उत्पादन के लिए ध्वज बंडल ( उत्पादन ध्वज के साथ शामिल विकल्प की सूची के लिए कोणीय दस्तावेज देखें )।
ब्रेटली संपीड़न का उपयोग करके संपीड़ित करेंनिम्नलिखित आदेश का उपयोग करते हुए संसाधनों का उपयोग करते करें
for i in dist/*; do brotli $i; done
बंडलों को डिफ़ॉल्ट रूप से उत्पन्न किया जाता है प्रोजेक्ट फोल्डर / डिस्ट ($ 6 के लिए $ प्रोजेक्टफॉल्डर)
9.0.0
सीएलआई के साथ कोणीय के साथ आकार 9.0.1
और कोणीय मार्ग के बिना सीएसएस विकल्प
dist/main-[es-version].[hash].js
आपका आवेदन बंडल हो गया [ES5 आकार: नया कोणीय सीएलआई आवेदन खाली करने के लिए 158 KB, 40 KB संपीड़ित]।dist/polyfill-[es-version].[hash].bundle.js
पॉलीफ़िल निर्भरता (@angular, RxJS ...) बंडल [ES5 आकार: 127 KB के लिए नया कोणीय CLI अनुप्रयोग रिक्त, 37 KB संपीड़ित]।dist/index.html
आपके आवेदन का प्रवेश बिंदु।dist/runtime-[es-version].[hash].bundle.js
वेबपैक लोडरdist/style.[hash].bundle.css
शैली परिभाषाएँdist/assets
कोणीय सीएलआई संपत्ति विन्यास से कॉपी किए गए संसाधनआप ng serve --prod
एक स्थानीय HTTP सर्वर शुरू करने वाले कमांड का उपयोग करके अपने आवेदन का पूर्वावलोकन प्राप्त कर सकते हैं जैसे कि उत्पादन फाइलों के साथ आवेदन http: // localhost: 4200 का उपयोग करके सुलभ है। ।
उत्पादन उपयोग के लिए, आपको dist
अपनी पसंद के HTTP सर्वर में फ़ोल्डर से सभी फ़ाइलों को तैनात करना होगा ।
2.0.1 Final
गल्प (टाइपस्क्रिप्ट - लक्ष्य: ES5) का उपयोग करनाnpm install
(direcory प्रोजेक्टफॉर्ड होने पर cmd में चलता है)npm run bundle
(direcory प्रोजेक्टफॉर्ड होने पर cmd में चलता है)
बंडल प्रोजेक्टफ़ॉर्म / बंडल / के लिए उत्पन्न होते हैं
bundles/dependencies.bundle.js
[ आकार: ~ 1 एमबी (जितना संभव हो उतना छोटा)]
bundles/app.bundle.js
[ आकार: आपकी परियोजना पर निर्भर करता है , मेरा ~ ०.५ एमबी है ]
var gulp = require('gulp'),
tsc = require('gulp-typescript'),
Builder = require('systemjs-builder'),
inlineNg2Template = require('gulp-inline-ng2-template');
gulp.task('bundle', ['bundle-app', 'bundle-dependencies'], function(){});
gulp.task('inline-templates', function () {
return gulp.src('app/**/*.ts')
.pipe(inlineNg2Template({ useRelativePaths: true, indent: 0, removeLineBreaks: true}))
.pipe(tsc({
"target": "ES5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": true,
"noImplicitAny": false
}))
.pipe(gulp.dest('dist/app'));
});
gulp.task('bundle-app', ['inline-templates'], function() {
// optional constructor options
// sets the baseURL and loads the configuration file
var builder = new Builder('', 'dist-systemjs.config.js');
return builder
.bundle('dist/app/**/* - [@angular/**/*.js] - [rxjs/**/*.js]', 'bundles/app.bundle.js', { minify: true})
.then(function() {
console.log('Build complete');
})
.catch(function(err) {
console.log('Build error');
console.log(err);
});
});
gulp.task('bundle-dependencies', ['inline-templates'], function() {
// optional constructor options
// sets the baseURL and loads the configuration file
var builder = new Builder('', 'dist-systemjs.config.js');
return builder
.bundle('dist/app/**/*.js - [dist/app/**/*.js]', 'bundles/dependencies.bundle.js', { minify: true})
.then(function() {
console.log('Build complete');
})
.catch(function(err) {
console.log('Build error');
console.log(err);
});
});
{
"name": "angular2-quickstart",
"version": "1.0.0",
"scripts": {
***
"gulp": "gulp",
"rimraf": "rimraf",
"bundle": "gulp bundle",
"postbundle": "rimraf dist"
},
"license": "ISC",
"dependencies": {
***
},
"devDependencies": {
"rimraf": "^2.5.2",
"gulp": "^3.9.1",
"gulp-typescript": "2.13.6",
"gulp-inline-ng2-template": "2.0.1",
"systemjs-builder": "^0.15.16"
}
}
(function(global) {
// map tells the System loader where to look for things
var map = {
'app': 'app',
'rxjs': 'node_modules/rxjs',
'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
'@angular': 'node_modules/@angular'
};
// packages tells the System loader how to load when no filename and/or no extension
var packages = {
'app': { main: 'app/boot.js', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' },
'angular2-in-memory-web-api': { defaultExtension: 'js' }
};
var packageNames = [
'@angular/common',
'@angular/compiler',
'@angular/core',
'@angular/forms',
'@angular/http',
'@angular/platform-browser',
'@angular/platform-browser-dynamic',
'@angular/router',
'@angular/router-deprecated',
'@angular/testing',
'@angular/upgrade',
];
// add package entries for angular packages in the form '@angular/common': { main: 'index.js', defaultExtension: 'js' }
packageNames.forEach(function(pkgName) {
packages[pkgName] = { main: 'index.js', defaultExtension: 'js' };
});
var config = {
map: map,
packages: packages
};
// filterSystemConfig - index.asp's chance to modify config before we register it.
if (global.filterSystemConfig) { global.filterSystemConfig(config); }
System.config(config);
})(this);
var map = {
'app': 'dist/app',
};
dist-systemjs.config.js
बंडल टैग के बाद टैग रखने से प्रोग्राम अभी भी चलने देगा लेकिन निर्भरता बंडल को अनदेखा किया जाएगा और निर्भरता node_modules
फ़ोल्डर से लोड की जाएगी ।<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<base href="/"/>
<title>Angular</title>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
<my-app>
loading...
</my-app>
<!-- Polyfill(s) for older browsers -->
<script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.min.js"></script>
<script src="node_modules/reflect-metadata/Reflect.js"></script>
<script src="node_modules/systemjs/dist/system.js"></script>
<script src="dist-systemjs.config.js"></script>
<!-- Project Bundles. Note that these have to be loaded AFTER the systemjs.config script -->
<script src="bundles/dependencies.bundle.js"></script>
<script src="bundles/app.bundle.js"></script>
<script>
System.import('app/boot').catch(function (err) {
console.error(err);
});
</script>
</body>
</html>
सबसे अच्छा मैं अभी तक कर सकता था :)
inline-templates
इसे चलाया जाता है तो यह टेम्प्लेट्स को इनलाइन करता है और फिर सभी ऐप फोल्डर और फाइल्स की एक कॉपी बनाता है dist/app
। फिर dist-systemjs.config.js
आप मैप app
करते हैं dist/app
कि एक फ़ोल्डर है जो मौजूद नहीं होगा यदि आप dist
फ़ोल्डर को रूट के रूप में उपयोग करते हैं । क्या आप dist
फ़ोल्डर से अपना ऐप नहीं चलाना चाहेंगे ? और अगर ऐसा है, तो आपके पास dist
रूट dist
फ़ोल्डर में एक नेस्टेड फ़ोल्डर नहीं होगा । मुझे यहां कुछ और याद आ रहा है। क्या आपको अपनी बंधी हुई फ़ाइलों का उपयोग करने के लिए सिस्टमज को बताने की जरूरत नहीं है और न ही dist/app
फ़ोल्डर में पाई जाने वाली सामान्य फाइलों को ?
Angular2 टीम ने वेबपैक का उपयोग करने के लिए एक ट्यूटोरियल प्रकाशित किया
मैंने एक छोटे से गिटहब सीड प्रोजेक्ट में ट्यूटोरियल से फाइलें बनाई और रखीं । तो आप वर्कफ़्लो को जल्दी आज़मा सकते हैं।
निर्देश :
npm स्थापित करें
npm शुरू । विकास के लिए। यह एक वर्चुअल "डिस्ट" फ़ोल्डर बनाएगा जो आपके स्थानीयहोस्ट पते पर लीवरेलोड किया जाएगा।
npm रन बिल्ड । उत्पादन के लिए। "यह एक भौतिक" डिस्टर्ब "फोल्डर वर्जन बनाएगा, जिससे वेबसर्वर को भेजा जा सके। डिस्टर्ब फोल्डर 7.8 एमबी है, लेकिन वास्तव में वेब ब्राउजर में पेज को लोड करने के लिए केवल 234KB की आवश्यकता होती है।
यह वेबपैक स्टार्टर किट उपरोक्त ट्यूटोरियल की तुलना में कुछ अधिक परीक्षण सुविधाएँ प्रदान करता है और काफी लोकप्रिय लगता है।
Angular.io में क्विक स्टार्ट ट्यूटोरियल है। मैंने इस ट्यूटोरियल को कॉपी किया और डिस्टर्ब फोल्डर के लिए सब कुछ बंडल करने के लिए कुछ सरल gulp कार्यों के साथ बढ़ाया, जिसे सर्वर पर कॉपी किया जा सकता है और उसी तरह काम कर सकता है। मैंने जेनकिस सीआई पर अच्छी तरह से काम करने के लिए सब कुछ अनुकूलित करने की कोशिश की, इसलिए नोड_मॉड्यूल्स को कैश किया जा सकता है और कॉपी करने की आवश्यकता नहीं है।
Github पर नमूना एप्लिकेशन के साथ स्रोत कोड: https://github.com/Anjmao/angular2-production-workflow
उत्पादन के लिए कदमनोड : जब आप हमेशा अपनी स्वयं की बिल्ड प्रक्रिया बना सकते हैं, लेकिन मैं कोणीय-क्ली का उपयोग करने की अत्यधिक सलाह देता हूं, क्योंकि इसमें सभी वर्कफ़्लो की आवश्यकता होती है और यह अब पूरी तरह से काम करता है। हम पहले से ही उत्पादन में इसका उपयोग कर रहे हैं और कोणीय-सीएलआई के साथ कोई समस्या नहीं है।
यह समर्थन करता है:
एनजी नया प्रोजेक्ट-नाम - क्राउटिंग
आप --style=scss
SASS .scss समर्थन के लिए जोड़ सकते हैं ।
आप --ng4
कोणीय 2 के बजाय कोणीय 4 का उपयोग करने के लिए जोड़ सकते हैं ।
प्रोजेक्ट बनाने के बाद, सीएलआई स्वचालित रूप npm install
से आपके लिए चलेगा । यदि आप इसके बजाय यार्न का उपयोग करना चाहते हैं, या बस स्थापित किए बिना प्रोजेक्ट कंकाल को देखना चाहते हैं, तो यहां देखें कि यह कैसे करना है ।
प्रोजेक्ट फ़ोल्डर के अंदर:
एनजी बिल्ड -प्रोड
वर्तमान संस्करण में आपको --aot
मैन्युअल रूप से निर्दिष्ट करने की आवश्यकता है , क्योंकि इसका उपयोग विकास मोड में किया जा सकता है (हालांकि यह धीमापन के कारण व्यावहारिक नहीं है)।
यह छोटे बंडलों के लिए एओटी संकलन भी करता है (कोई कोणीय संकलक, इसके बजाय, उत्पन्न संकलक आउटपुट)। यदि आप कोणीय 4 का उपयोग करते हैं तो बंडल एओटी के साथ बहुत छोटा है क्योंकि उत्पन्न कोड छोटा है।
आप एओटी को विकास मोड (सोर्समैप्स, नो मिनिफिकेशन) और एओटी के साथ चलाकर अपने ऐप का परीक्षण कर सकते हैंng build --aot
।
डिफ़ॉल्ट आउटपुट dir है ./dist
, हालांकि इसे अंदर बदला जा सकता है ./angular-cli.json
।
बिल्ड स्टेप का परिणाम निम्न है:
(ध्यान दें: <content-hash>
कैश की ख़राब तरीके से होने वाली फ़ाइल की सामग्री के हैश / फ़िंगरप्रिंट को संदर्भित करता है, यह संभव है क्योंकि वेबपैक script
स्वयं द्वारा टैग लिखता है)
./dist/assets
./src/assets/**
./dist/index.html
./src/index.html
, वेबपैक स्क्रिप्ट को इसमें जोड़ने के बाद ./angular-cli.json
./dist/inline.js
./dist/main.<content-hash>.bundle.js
./dist/styles.<content-hash>.bundle.js
पुराने संस्करणों में इसने अपने आकार, और .map
स्रोत फ़ाइलों की जाँच के लिए gzipped संस्करण भी बनाए , लेकिन अब ऐसा नहीं हो रहा है क्योंकि लोग इन्हें हटाने के लिए कहते रहे।
कुछ अन्य अवसरों में, आपको अन्य अवांछित फ़ाइलें / फ़ोल्डर मिल सकते हैं:
./out-tsc/
./src/tsconfig.json
कीoutDir
./out-tsc-e2e/
./e2e/tsconfig.json
कीoutDir
./dist/ngfactory/
<content-hash>
बंडलों से ठेस में हटा दें । यह नवीनतम बंडल प्राप्त करने में समस्याएं पैदा कर सकता है?
आज के रूप में मैं अभी भी उत्पादन बंडल के लिए सबसे अच्छा नुस्खा के रूप में आगे के समय संकलन रसोई की किताब पाते हैं। आप इसे यहाँ पा सकते हैं: https://angular.io/docs/ts/latest/cookbook/aot-compiler.html
एंगुलर 2 के साथ मेरा अब तक का अनुभव यह है कि एओटी लगभग कोई लोडिंग समय नहीं के साथ सबसे छोटा बनाता है। और सबसे महत्वपूर्ण सवाल जैसा कि यहाँ है - आपको केवल उत्पादन के लिए कुछ फ़ाइलों को शिप करने की आवश्यकता है।
ऐसा इसलिए प्रतीत होता है क्योंकि कोणीय कंपाइलर को उत्पादन बिल्ड के साथ नहीं भेजा जाएगा क्योंकि टेम्प्लेट को "समय से आगे" संकलित किया जाता है। अपने HTML टेम्प्लेट मार्कअप को जावास्क्रिप्ट निर्देशों में तब्दील होते देखना भी बहुत अच्छा है जो कि मूल HTML में इंजीनियर को उल्टा करना बहुत कठिन होगा।
मैंने एक साधारण वीडियो बनाया है जहाँ मैं देव बनाम AoT बिल्ड में एक कोणीय 2 ऐप के लिए डाउनलोड आकार, फ़ाइलों की संख्या आदि प्रदर्शित करता हूँ - जिसे आप यहाँ देख सकते हैं:
आपको वीडियो में उपयोग किया गया स्रोत कोड यहां मिलेगा:
**Production build with
- Angular Rc5
- Gulp
- typescripts
- systemjs**
1)con-cat all js files and css files include on index.html using "gulp-concat".
- styles.css (all css concat in this files)
- shims.js(all js concat in this files)
2)copy all images and fonts as well as html files with gulp task to "/dist".
3)Bundling -minify angular libraries and app components mentioned in systemjs.config.js file.
Using gulp 'systemjs-builder'
SystemBuilder = require('systemjs-builder'),
gulp.task('system-build', ['tsc'], function () {
var builder = new SystemBuilder();
return builder.loadConfig('systemjs.config.js')
.then(function () {
builder.buildStatic('assets', 'dist/app/app_libs_bundle.js')
})
.then(function () {
del('temp')
})
});
4)Minify bundles using 'gulp-uglify'
jsMinify = require('gulp-uglify'),
gulp.task('minify', function () {
var options = {
mangle: false
};
var js = gulp.src('dist/app/shims.js')
.pipe(jsMinify())
.pipe(gulp.dest('dist/app/'));
var js1 = gulp.src('dist/app/app_libs_bundle.js')
.pipe(jsMinify(options))
.pipe(gulp.dest('dist/app/'));
var css = gulp.src('dist/css/styles.min.css');
return merge(js,js1, css);
});
5) In index.html for production
<html>
<head>
<title>Hello</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="utf-8" />
<link rel="stylesheet" href="app/css/styles.min.css" />
<script type="text/javascript" src="app/shims.js"></script>
<base href="https://stackoverflow.com/">
</head>
<body>
<my-app>Loading...</my-app>
<script type="text/javascript" src="app/app_libs_bundle.js"></script>
</body>
</html>
6) Now just copy your dist folder to '/www' in wamp server node need to copy node_modules in www.
आप अपने कोणीय अनुप्रयोग github
का उपयोग करने
पर तैनात कर सकते हैं कोणीय-क्लि-घपेस
इस क्लि का उपयोग करके कैसे परिनियोजित करें यह जानने के लिए लिंक देखें।
तैनात वेबसाइट को कुछ शाखा में संग्रहीत किया जाएगा github
आम तौर पर
gh-पृष्ठों
उपयोग git शाखा को क्लोन कर सकता है और इसे अपने सर्वर में स्थिर वेबसाइट की तरह उपयोग कर सकता है
"बेस्ट" परिदृश्य पर निर्भर करता है। ऐसे समय होते हैं जब आप केवल सबसे छोटी संभव एकल बंडल की परवाह करते हैं, लेकिन बड़े एप्लिकेशन में आपको आलसी लोडिंग पर विचार करना पड़ सकता है। कुछ बिंदु पर एक बंडल के रूप में पूरे ऐप की सेवा करना अव्यावहारिक हो जाता है।
बाद के मामले में वेबपैक आमतौर पर सबसे अच्छा तरीका है क्योंकि यह कोड विभाजन का समर्थन करता है।
एक बंडल के लिए मैं रोलअप या क्लोजर कंपाइलर पर विचार करूंगा यदि आप बहादुर महसूस कर रहे हैं :-)
मैंने उन सभी कोणीय बंडलों के नमूने बनाए हैं जिन्हें मैंने कभी यहाँ इस्तेमाल किया है: http://www.syntaxsuccess.com/viewarticle/angular-production-builds
कोड यहां पाया जा सकता है: https://github.com/thelgevold/angular-2-samples
कोणीय संस्करण: 4.1.x
बस सेटअप कोणीय 4 वेबपैक 3 के साथ एक मिनट के भीतर आपका विकास और उत्पादन ईएनवी बंडल किसी भी मुद्दे के बिना तैयार हो जाएगा बस नीचे दिए गए गितुब डॉक का पालन करें
कृपया वर्तमान परियोजना निर्देशिका में CLI कमांड के नीचे का प्रयास करें। यह डिस्टर्ब फोल्डर बंडल बनाएगा। इसलिए आप तैनाती के लिए डिस्टर्ब फोल्डर के भीतर सभी फाइलों को अपलोड कर सकते हैं।
ng बिल्ड --प्रोड --aot --base-href।
एनजी सेवा विकास प्रयोजनों के लिए हमारे आवेदन की सेवा के लिए काम करता है। उत्पादन के बारे में क्या? यदि हम अपने पैकेज.जॉन फ़ाइल में देखते हैं, तो हम देख सकते हैं कि ऐसी स्क्रिप्ट हैं जिनका हम उपयोग कर सकते हैं:
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build --prod",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
बिल्ड स्क्रिप्ट एंगुलर सीएलआई के एनजी बिल्ड को --प्रोड फ्लैग के साथ उपयोग करती है। चलो अब कोशिश करते हैं। हम इसे दो तरीकों में से एक कर सकते हैं:
# npm स्क्रिप्ट का उपयोग करना
npm run build
# सीधे क्ली का उपयोग करना
ng build --prod
इस बार हमें पाँच के बजाय चार फाइलें दी गई हैं। Theprod ध्वज कोणीय हमारे आकार में हमारे आवेदन बहुत छोटा करने के लिए कहता है।