আমি যখন বাবেল ব্যবহার করি তখন আমার কি জেএস প্রয়োজন?
আপনার কিছু মডিউল লোডার দরকার হতে পারে তবে এটি প্রয়োজনীয় জেএসএস নয়। আপনার কাছে বেশ কয়েকটি বিকল্প রয়েছে। নিম্নলিখিতটি আপনাকে শুরু করতে সহায়তা করবে।
রোলআপ হ'ল একটি পরবর্তী প্রজন্মের জাভাস্ক্রিপ্ট মডিউল বান্ডলার। এটি ES2015 মডিউলগুলি স্থানীয়ভাবে বোঝে এবং এমন একটি বান্ডিল তৈরি করবে যা পরিচালনা করতে কোনও মডিউল লোডার প্রয়োজন হয় না। অব্যবহৃত রফতানি আউটপুট থেকে ছাঁটাই করা হবে, এটিকে গাছ কাঁপানো বলা হয়।
এখন আমি ব্যক্তিগতভাবে রোলআপগুলি ব্যবহার করার পরামর্শ দিচ্ছি, কারণ এটি পরিষ্কার আউটপুট উত্পাদন করে এবং সেটআপ করা সহজ, তবে এটি উত্তরের একটি আলাদা দিক দেয়। অন্যান্য সমস্ত পদ্ধতির নিম্নলিখিতগুলি করে:
- বাবেলের সাথে ES6 কোডটি সংকলন করুন, আপনার পছন্দের মডিউল বিন্যাসটি ব্যবহার করুন
- সংকলিত মডিউলগুলির সাথে একটি মডিউল লোডার পাশাপাশি সংযুক্ত করুন বা এমন একটি বান্ডিল ব্যবহার করুন যা আপনার জন্য নির্ভরতাগুলি অতিক্রম করবে।
রোলআপজসের সাথে জিনিসগুলি সত্যিই এইভাবে কাজ করে না। এখানে, বাবেলের পরিবর্তে রোলআপটি প্রথম ধাপ। এটি কেবলমাত্র ডিফল্টরূপে ES6 মডিউলগুলি বোঝে। আপনাকে অবশ্যই একটি এন্ট্রি মডিউল দিতে হবে যার নির্ভরতাগুলি ট্র্যাভেট এবং কনটেনটেটেড হবে। যেহেতু ইএস 6 মডিউলে একাধিক নামযুক্ত রফতানিকে মঞ্জুরি দেয়, রোলুপজগুলি অব্যবহৃত রফতানিগুলি ছাঁটাই করতে যথেষ্ট স্মার্ট, এভাবে বান্ডিল আকার সঙ্কুচিত হয়। দুর্ভাগ্যক্রমে রোলআপজেস-এর পার্সার> ES6 সিনট্যাক্স বুঝতে পারে না, সুতরাং ES7 মডিউলগুলি রোলআপ পার্স করার আগে সংকলন করতে হবে, তবে সংকলনটি ES6 আমদানিকে প্রভাবিত করবে না। এটি প্রিসেটের rollup-plugin-babel
সাথে প্লাগইন ব্যবহার করে করা হয় babel-preset-es2015-rollup
(এই প্রিসেটটি মডিউল ট্রান্সফর্মার এবং বহিরাগত-সহায়ক প্লাগইন বাদে es2015 এক হিসাবে একই)। সুতরাং সঠিকভাবে সেট আপ করা হলে রোলআপ আপনার মডিউলগুলির সাথে নিম্নলিখিতটি করবে:
- ফাইল সিস্টেম থেকে আপনার ES6-7 মডিউলটি পড়ে
- বাবেল প্লাগইন এটি মেমরিতে ES6 এ সংকলন করে
- রোলআপ ইম্পোর্ট এবং রফতানির জন্য ES6 কোডটি পার্স করে (অ্যাকরন পার্সার ব্যবহার করে, রোলআপে সংকলিত)
- এটি পুরো গ্রাফটিকে অনুসরণ করে এবং একটি একক বান্ডিল তৈরি করে (এতে এখনও বাহ্যিক নির্ভরতা থাকতে পারে এবং প্রবেশের রফতানি আপনার পছন্দসই বিন্যাসে রফতানি হতে পারে)
নোডজ বিল্ড উদাহরণ:
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({
format: 'iife'
});
require("fs").writeFileSync("./dist/bundle.js", result.code);
}).then(null, err => console.error(err));
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"]
}
}
}
});
}
var gulp = require('gulp'),
rollup = require('gulp-rollup');
gulp.task('bundle', function() {
gulp.src('./src/**/*.js')
.pipe(rollup({
"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 ] ]
অথবা আপনি এটি নোড.জেএস থেকে ব্যবহার করতে পারেন:
$ 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"));
এটি একবারে আপনার কোডটিকে স্থানান্তরিত এবং কনটেনেট করবে। ব্রাউজারফি.bundle
একটি দুর্দান্ত সামান্য লোডার অন্তর্ভুক্ত থাকবে এবং আপনার স্থানান্তরিত মডিউলগুলিকে ফাংশনগুলিতে সংগঠিত করবে। এমনকি আপেক্ষিক আমদানিও করতে পারেন।
উদাহরণ:
.
+-- src/
| +-- library/
| | \-- ModuleA.js
| +-- config.js
| \-- script.js
+-- dist/
\-- 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"));
export default "Some config";
import config from '../config';
export default "Some nice export: " + config;
import ModuleA from './library/ModuleA';
console.log(ModuleA);
সংকলন করতে কেবল node build.js
আপনার প্রকল্পের মূল চলুন।
বাবেল ব্যবহার করে আপনার সমস্ত কোড সংকলন করুন। আমি আপনাকে amd মডিউল ট্রান্সফর্মার ( babel-plugin-transform-es2015-modules-amd
বাবেল 6 নামে পরিচিত ) ব্যবহার করার পরামর্শ দিচ্ছি । এর পরে আপনার ওয়েবপ্যাক দিয়ে সংকলিত উত্সগুলি বান্ডিল করুন।
ওয়েবপ্যাক 2 আউট! এটি নেটিভ ES6 মডিউলগুলি বোঝে এবং বাবিলি-বিল্টইন ডেড কোড বিলোপ ব্যবহার করে গাছ কাঁপানো (বা বরং অনুকরণ) সম্পাদন করবে । আপাতত (সেপ্টেম্বর ২০১)) আমি এখনও বাবেলের সাথে রোলআপ ব্যবহার করার পরামর্শ দেব, যদিও ওয়েবপ্যাকের প্রথম প্রকাশের সাথে আমার মতামত পরিবর্তিত হতে পারে। মন্তব্যগুলিতে আপনার মতামত নিয়ে নির্দ্বিধায় আলোচনা করুন।
কাস্টম সংকলন পাইপলাইন
কখনও কখনও আপনি সংকলন প্রক্রিয়া উপর আরও নিয়ন্ত্রণ রাখতে চান। আপনি নিজের পাইপলাইনটি এভাবে প্রয়োগ করতে পারেন:
প্রথমে, আপনাকে এমডি মডিউলগুলি ব্যবহার করতে বাবেল কনফিগার করতে হবে। ডিফল্টরূপে ব্যাবেলগুলি কমনজেএস মডিউলগুলিতে স্থানান্তর করে, যা ব্রাউজারে পরিচালনা করা কিছুটা জটিল, যদিও ব্রাউজারিফাই এগুলি হ্যান্ডেল করতে পরিচালিত করে।
- ব্যাবেল 5: ব্যবহার
{ modules: 'amdStrict', ... }
বিকল্প
- বাবেল 6:
es2015-modules-amd
প্লাগইন ব্যবহার করুন
moduleIds: true
বিকল্পটি চালু করতে ভুলবেন না ।
উত্পন্ন মডুলের নামের জন্য পরিবাহিত কোডটি পরীক্ষা করে দেখুন, সংজ্ঞায়িত এবং প্রয়োজনীয় মডিউলগুলির মধ্যে প্রায়শই মিল নেই। সোর্স রুট এবং মডিউল রুট দেখুন ।
শেষ অবধি, আপনার কাছে এক ধরণের মডিউল লোডার থাকতে হবে, তবে এটি আবশ্যকীয় প্রয়োজনীয়তা নয়। নেই almondjs একটি ক্ষুদ্র shim যে ভাল কাজ করে প্রয়োজন। এমনকি আপনি নিজের প্রয়োগ করতে পারেন:
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);
}
}
শেষে, আপনি কেবল লোডার শিম এবং সংকলিত মডিউলগুলি একসাথে সংযুক্ত করতে পারেন এবং এটিতে একটি uglif চালাচ্ছেন।
বাবেলের বয়লারপ্লেট কোড প্রতিটি মডিউলে নকল করা হয়
ডিফল্টরূপে, উপরের বেশিরভাগ পদ্ধতিগুলি প্রতিটি মডিউল পৃথকভাবে বাবেলের সাথে সংকলন করে এবং তারপরে তাদের একত্রে সংযুক্ত করে। বাবেলিফাই এটি করে। তবে আপনি যদি সংকলিত কোডটি দেখেন, আপনি দেখতে পাবেন যে বাবেল প্রতিটি ফাইলের শুরুতে প্রচুর বয়লারপ্লেট সন্নিবেশ করায়, তাদের বেশিরভাগই সমস্ত ফাইল জুড়ে নকল করা থাকে।
এটি প্রতিরোধ করতে আপনি babel-plugin-transform-runtime
প্লাগইনটি ব্যবহার করতে পারেন ।
require
ব্রাউজারে বিদ্যমান না থাকায় আপনার প্রয়োজনের মতো কিছু বিল্ড টুল ব্যবহার করা দরকার, ব্রাউজারফি বা ওয়েবপ্যাক।