जब मुझे बेबल का उपयोग करना होता है, तो क्या मुझे जेएस की आवश्यकता होती है?
आपको कुछ मॉड्यूल लोडर की आवश्यकता हो सकती है, लेकिन यह आवश्यक नहीं है। आपके पास कई विकल्प हैं। निम्नलिखित आपको आरंभ करने में मदद करेगा।
रोलअप एक अगली पीढ़ी का जावास्क्रिप्ट मॉड्यूल बंडल है। यह मूल रूप से ES2015 मॉड्यूल को समझता है, और एक बंडल का उत्पादन करेगा जिसे संचालित करने के लिए किसी भी मॉड्यूल लोडर की आवश्यकता नहीं है। अप्रयुक्त निर्यात को आउटपुट से ट्रिम किया जाएगा, इसे ट्री-शेकिंग कहा जाता है।
अब मैं व्यक्तिगत रूप से रोलअप का उपयोग करने की सलाह देता हूं, क्योंकि यह सबसे स्पष्ट आउटपुट का उत्पादन करता है, और सेटअप करना आसान है, हालांकि, यह उत्तर के लिए एक अलग पहलू देता है। अन्य सभी दृष्टिकोण निम्नलिखित करते हैं:
- ईएस 6 कोड को बेबल के साथ संकलित करें, अपनी पसंद के मॉड्यूल प्रारूप का उपयोग करें
- एक मॉड्यूल लोडर के साथ संकलित मॉड्यूल को फिर से व्यवस्थित करें या एक बंडलर का उपयोग करें जो आपके लिए निर्भरता को पीछे छोड़ देगा।
रोलअपjs के साथ चीजें वास्तव में इस तरह से काम नहीं करती हैं। यहां, बैबेल के बजाय रोलअप पहला कदम है। यह केवल डिफ़ॉल्ट रूप से ईएस 6 मॉड्यूल को समझता है। आपको एक एंट्री मॉड्यूल देना होगा, जिस पर आश्रितों का पता लगाया जा सके और उन्हें समेट लिया जाए। चूंकि ES6 एक मॉड्यूल में कई नामित निर्यात की अनुमति देता है, रोलअपज अप्रयुक्त निर्यात को छीनने के लिए पर्याप्त स्मार्ट है, इस प्रकार बंडल आकार सिकुड़ता है। दुर्भाग्य से रोलअपज-एस पार्सर समझ में नहीं आता> ES6 सिंटैक्स, इसलिए ES7 मॉड्यूल को रोलअप पार्स करने से पहले संकलित किया जाना है, लेकिन संकलन को ES6 आयात को प्रभावित नहीं करना चाहिए। यह प्रीसेट के rollup-plugin-babel
साथ प्लगइन का उपयोग करके किया जाता है babel-preset-es2015-rollup
(यह प्रीसेट मॉड्यूल ट्रांसफॉर्मर और बाहरी-सहायक प्लगइन्स को छोड़कर es2015 एक के समान है)। यदि सही तरीके से सेट अप किया जाता है तो रोलअप आपके मॉड्यूल के साथ निम्नलिखित कार्य करेगा:
- फाइल सिस्टम से आपके ES6-7 मॉड्यूल को पढ़ता है
- बाबेल प्लगइन इसे मेमोरी में ES6 के लिए संकलित करता है
- रोलअप आयात और निर्यात के लिए ES6 कोड को पार्स करता है (रोलन में संकलित एकॉर्न पार्सर का उपयोग करके)
- यह पूरे ग्राफ का पता लगाता है, और एक एकल बंडल बनाता है (जिसमें अभी भी बाहरी निर्भरता हो सकती है, और प्रविष्टि का निर्यात आपकी पसंद के प्रारूप में निर्यात किया जा सकता है)
उदाहरण नोड्ज बिल्ड:
// setup by `npm i rollup rollup-plugin-babel babel-preset-es2015 babel-plugin-external-helpers --save-dev`
// build.js:
require("rollup").rollup({
entry: "./src/main.js",
plugins: [
require("rollup-plugin-babel")({
"presets": [["es2015", { "modules": false }]],
"plugins": ["external-helpers"]
})
]
}).then(bundle => {
var result = bundle.generate({
// output format - 'amd', 'cjs', 'es6', 'iife', 'umd'
format: 'iife'
});
require("fs").writeFileSync("./dist/bundle.js", result.code);
// sourceMaps are supported too!
}).then(null, err => console.error(err));
// setup by `npm i grunt grunt-rollup rollup-plugin-babel babel-preset-es2015 babel-plugin-external-helpers --save-dev`
// gruntfile.js
module.exports = function(grunt) {
grunt.loadNpmTasks("grunt-rollup");
grunt.initConfig({
"rollup": {
"options": {
"format": "iife",
"plugins": [
require("rollup-plugin-babel")({
"presets": [["es2015", { "modules": false }]],
"plugins": ["external-helpers"]
})
]
},
"dist": {
"files": {
"./dist/bundle.js": ["./src/main.js"]
}
}
}
});
}
उदाहरण गल्प -रोलअप के साथ निर्माण
// setup by `npm i gulp gulp-rollup rollup-plugin-babel babel-preset-es2015 babel-plugin-external-helpers --save-dev`
// gulpfile.js
var gulp = require('gulp'),
rollup = require('gulp-rollup');
gulp.task('bundle', function() {
gulp.src('./src/**/*.js')
// transform the files here.
.pipe(rollup({
// any option supported by Rollup can be set here.
"format": "iife",
"plugins": [
require("rollup-plugin-babel")({
"presets": [["es2015", { "modules": false }]],
"plugins": ["external-helpers"]
})
],
entry: './src/main.js'
}))
.pipe(gulp.dest('./dist'));
});
बैबेल में बेबिलिफ़ नामक एक साफ पैकेज होता है । यह उपयोग सरल और सीधा है:
$ npm install --save-dev babelify babel-preset-es2015 babel-preset-react
$ npm install -g browserify
$ browserify src/script.js -o bundle.js \
-t [ babelify --presets [ es2015 react ] ]
या आप इसे node.js से उपयोग कर सकते हैं:
$ npm install --save-dev browserify babelify babel-preset-es2015 babel-preset-react
...
var fs = require("fs");
var browserify = require("browserify");
browserify(["./src/script.js"])
.transform("babelify", {presets: ["es2015", "react"]})
.bundle()
.pipe(fs.createWriteStream("bundle.js"));
यह एक ही बार में आपके कोड को ट्रांसपाइल और कॉन्सेप्ट करेगा। Browserify के.bundle
इच्छा में एक अच्छा सा कॉमनजेएस लोडर शामिल होगा, और अपने ट्रांसप्लड मॉड्यूल को फ़ंक्शन में व्यवस्थित करेगा। आप सापेक्ष आयात भी कर सकते हैं।
उदाहरण:
// project structure
.
+-- src/
| +-- library/
| | \-- ModuleA.js
| +-- config.js
| \-- script.js
+-- dist/
\-- build.js
...
// build.js
var fs = require("fs");
var browserify = require("browserify");
browserify(["./src/script.js"])
.transform("babelify", {presets: ["es2015", "react"]})
.bundle()
.pipe(fs.createWriteStream("dist/bundle.js"));
// config.js
export default "Some config";
// ModuleA.js
import config from '../config';
export default "Some nice export: " + config;
// script.js
import ModuleA from './library/ModuleA';
console.log(ModuleA);
संकलन करने के लिए बस node build.js
अपने प्रोजेक्ट रूट में चलाएं ।
कोलाहल का उपयोग कर अपने सभी कोड संकलित करें। मैं आपको एएमडी मॉड्यूल ट्रांसफार्मर ( babel-plugin-transform-es2015-modules-amd
बेबल 6 में कहा जाता है) का उपयोग करने की सलाह देता हूं । उसके बाद अपने संकलित स्रोतों को वेबपैक के साथ बंडल करें।
WebPack 2 बाहर है! यह मूल ईएस 6 मॉड्यूल को समझता है, और बबिली - एस बिलिन डेड कोड एलिमिनेशन का उपयोग करके हिलाते हुए (या बल्कि अनुकरण) करेगा । अभी (सितंबर 2016) के लिए मैं अभी भी बैबेल के साथ रोलअप का उपयोग करने का सुझाव दूंगा, हालांकि मेरी राय वेबपैक की पहली रिलीज के साथ बदल सकती है। टिप्पणी में अपनी राय पर चर्चा करने के लिए स्वतंत्र महसूस करें।
कस्टम संकलन पाइपलाइन
कभी-कभी आप संकलन प्रक्रिया पर अधिक नियंत्रण रखना चाहते हैं। आप अपनी खुद की पाइपलाइन इस तरह से लागू कर सकते हैं:
सबसे पहले, आपको एएमडी मॉड्यूल का उपयोग करने के लिए कोलाहल को कॉन्फ़िगर करना होगा। डिफ़ॉल्ट बाबेल द्वारा कॉमनजेएस मॉड्यूल के लिए ट्रांसपाइल्स, जो ब्राउज़र में हैंडल करने के लिए थोड़ा जटिल है, हालांकि ब्राउज़र उन्हें अच्छे तरीके से संभालने के लिए प्रबंधित करता है।
- बैबल 5:
{ modules: 'amdStrict', ... }
विकल्प का उपयोग करें
- बैबल 6:
es2015-modules-amd
प्लगइन का उपयोग करें
को चालू करने के लिए मत भूलना moduleIds: true
विकल्प ।
उत्पन्न मॉड्यूल नामों के लिए ट्रांसप्लड कोड की जांच करें, परिभाषित और आवश्यक मॉड्यूल के बीच अक्सर बेमेल होते हैं। SourceRoot और मॉड्यूल देखें ।
अंत में, आपके पास किसी प्रकार का मॉड्यूल लोडर होना चाहिए, लेकिन यह आवश्यक नहीं है। नहीं है almondjs एक छोटे से शिम कि अच्छी तरह से काम करता है की आवश्यकता है। आप अपना स्वयं का कार्यान्वयन भी कर सकते हैं:
var __modules = new Map();
function define(name, deps, factory) {
__modules.set(name, { n: name, d: deps, e: null, f: factory });
}
function require(name) {
const module = __modules.get(name);
if (!module.e) {
module.e = {};
module.f.apply(null, module.d.map(req));
}
return module.e;
function req(name) {
return name === 'exports' ? module.e : require(name);
}
}
अंत में, आप बस लोडर शिम और संकलित मॉड्यूल को एक साथ जोड़ सकते हैं, और उस पर एक कुरकुरा चला सकते हैं।
हर मॉड्यूल में बैबल के बॉयलरप्लेट कोड को डुप्लिकेट किया गया है
डिफ़ॉल्ट रूप से, ऊपर दिए गए अधिकांश तरीके प्रत्येक मॉड्यूल को व्यक्तिगत रूप से बाबेल के साथ संकलित करते हैं, और फिर उन्हें एक साथ जोड़ते हैं। यही बबलीफाई भी करता है। लेकिन यदि आप संकलित कोड को देखते हैं, तो आप देखते हैं कि प्रत्येक फ़ाइल की शुरुआत में बैबल बहुत सारे बॉयलरप्लेट सम्मिलित करता है, उनमें से अधिकांश को सभी फाइलों में दोहराया जाता है।
इसे रोकने के लिए आप babel-plugin-transform-runtime
प्लगइन का उपयोग कर सकते हैं ।
require
ब्राउज़र में मौजूद नहीं है, तो आपको कुछ बिल्ड टूल की आवश्यकता होती है जैसे आवश्यकताएं। जेएस, ब्राउज़रसाइज़ या वेबपैक।