ฉันจำเป็นต้องใช้ js เมื่อฉันใช้ babel หรือไม่?
คุณอาจต้องการตัวโหลดโมดูล แต่ไม่จำเป็นต้องใช้ RequireJS คุณมีหลายทางเลือก สิ่งต่อไปนี้จะช่วยคุณในการเริ่มต้น
Rollup เป็นบันเดิลโมดูล JavaScript รุ่นใหม่ เข้าใจโมดูล ES2015 โดยกำเนิดและจะสร้างบันเดิลที่ไม่ต้องใช้ตัวโหลดโมดูลใด ๆ ในการทำงาน การส่งออกที่ไม่ได้ใช้จะถูกตัดออกจากผลผลิตเรียกว่าการเขย่าต้นไม้
ตอนนี้ฉันแนะนำให้ใช้ rollupjs เป็นการส่วนตัวเนื่องจากให้ผลลัพธ์ที่ชัดเจนที่สุดและง่ายต่อการติดตั้งอย่างไรก็ตามมันให้แง่มุมที่แตกต่างกับคำตอบ แนวทางอื่น ๆ ทั้งหมดทำดังต่อไปนี้:
- รวบรวมรหัส ES6 ด้วย babel ใช้รูปแบบโมดูลที่คุณเลือก
- เชื่อมต่อโมดูลที่คอมไพล์เข้าด้วยกันกับตัวโหลดโมดูลหรือใช้บันเดิลเลอร์ที่จะข้ามผ่านการอ้างอิงสำหรับคุณ
ด้วยสิ่งที่ rollupjs ไม่ได้ผลเช่นนี้ ที่นี่การรวบรวมเป็นขั้นตอนแรกแทนที่จะเป็น Babel เข้าใจเฉพาะโมดูล ES6 ตามค่าเริ่มต้น คุณต้องให้โมดูลรายการซึ่งการอ้างอิงจะถูกส่งผ่านและเชื่อมต่อกัน เนื่องจาก ES6 อนุญาตการส่งออกที่มีชื่อหลายรายการในโมดูล rollupjs จึงฉลาดพอที่จะตัดการส่งออกที่ไม่ได้ใช้ออกไปจึงทำให้ขนาดของชุดรวมลดลง น่าเสียดายที่ rollupjs-s parser ไม่เข้าใจไวยากรณ์> ES6 ดังนั้นจึงต้องรวบรวมโมดูล ES7 ก่อนที่ Rollup จะแยกวิเคราะห์ได้ แต่การคอมไพล์ไม่ควรส่งผลต่อการนำเข้า ES6 ทำได้โดยใช้rollup-plugin-babel
ปลั๊กอินที่มีbabel-preset-es2015-rollup
ค่าที่ตั้งไว้ล่วงหน้า (ค่าที่ตั้งไว้นี้เหมือนกับ es2015 ยกเว้นหม้อแปลงโมดูลและปลั๊กอินตัวช่วยภายนอก) ดังนั้นค่าสะสมจะทำสิ่งต่อไปนี้กับโมดูลของคุณหากตั้งค่าอย่างถูกต้อง:
- อ่านโมดูล ES6-7 ของคุณจากระบบไฟล์
- ปลั๊กอิน babel รวบรวมไว้ในหน่วยความจำ ES6
- ค่าสะสมแยกวิเคราะห์รหัส ES6 สำหรับการนำเข้าและส่งออก (โดยใช้ตัวแยกวิเคราะห์ลูกโอ๊กรวบรวมเป็นค่าสะสม)
- มันข้ามกราฟทั้งหมดและสร้างบันเดิลเดียว (ซึ่งอาจยังมีการอ้างอิงภายนอกและการเอ็กซ์พอร์ตของรายการอาจถูกส่งออกในรูปแบบที่คุณเลือก)
ตัวอย่าง nodejs build:
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'));
});
บาเบลมีแพคเกจเรียบร้อยเรียกว่าbabelify การใช้งานนั้นง่ายและตรงไปตรงมา:
$ 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
จะรวมตัวโหลด CommonJS ตัวเล็ก ๆ ที่ดีและจะจัดระเบียบโมดูลที่แยกได้ของคุณให้เป็นฟังก์ชัน คุณสามารถนำเข้าแบบสัมพัทธ์ได้
ตัวอย่าง:
.
+-- 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
ในรูทโปรเจ็กต์ของคุณ
รวบรวมโค้ดทั้งหมดของคุณโดยใช้ babel ฉันแนะนำให้คุณใช้หม้อแปลงโมดูล amd (เรียกbabel-plugin-transform-es2015-modules-amd
ใน babel 6) หลังจากนั้นรวมแหล่งข้อมูลที่คอมไพล์ของคุณเข้ากับ WebPack
WebPack 2 หมดแล้ว! เข้าใจโมดูล ES6 ดั้งเดิมและจะดำเนินการ (หรือจำลองมากกว่า) การเขย่าต้นไม้โดยใช้การกำจัดโค้ดที่ตายแล้วในตัวของbabili สำหรับตอนนี้ (กันยายน 2016) ฉันยังคงแนะนำให้ใช้ rollup กับ babel แม้ว่าความคิดเห็นของฉันอาจเปลี่ยนแปลงไปกับ WebPack 2 รุ่นแรกอย่าลังเลที่จะพูดคุยเกี่ยวกับความคิดเห็นของคุณในความคิดเห็น
ไปป์ไลน์การรวบรวมแบบกำหนดเอง
บางครั้งคุณต้องการควบคุมกระบวนการคอมไพล์ให้มากขึ้น คุณสามารถใช้ไปป์ไลน์ของคุณเองได้ดังนี้:
ขั้นแรกคุณต้องกำหนดค่า babel เพื่อใช้โมดูล amd โดยค่าเริ่มต้น babel จะย้ายไปยังโมดูล CommonJS ซึ่งมีความซับซ้อนเล็กน้อยในการจัดการในเบราว์เซอร์แม้ว่า browserify จะจัดการกับมันได้ดีก็ตาม
- Babel 5: ใช้
{ modules: 'amdStrict', ... }
ตัวเลือก
- Babel 6: ใช้
es2015-modules-amd
ปลั๊กอิน
อย่าลืมเปิดmoduleIds: true
ตัวเลือก
ตรวจสอบรหัส Transpiled สำหรับชื่อโมดูลที่สร้างขึ้นมักจะมีความไม่ตรงกันระหว่างโมดูลที่กำหนดและโมดูลที่จำเป็น ดูsourceRoot และ moduleRoot
สุดท้ายคุณต้องมีตัวโหลดโมดูลบางประเภท แต่ก็ไม่จำเป็นต้องใช้นม มีอัลมอนด์เป็นชิมเล็ก ๆ ที่ต้องใช้งานได้ดี คุณสามารถใช้ของคุณเอง:
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);
}
}
ในตอนท้ายคุณสามารถเชื่อมต่อ shim ตัวโหลดและโมดูลที่คอมไพล์เข้าด้วยกันและเรียกใช้ uglify บนนั้น
รหัสสำเร็จรูปของ Babel ซ้ำกันในทุกโมดูล
ตามค่าเริ่มต้นวิธีการข้างต้นส่วนใหญ่จะรวบรวมแต่ละโมดูลด้วย babel ทีละโมดูลจากนั้นเชื่อมต่อเข้าด้วยกัน นั่นคือสิ่งที่ babelify ทำเช่นกัน แต่ถ้าคุณดูโค้ดที่คอมไพล์แล้วคุณจะเห็นว่า babel ใส่แผ่นสำเร็จรูปจำนวนมากที่จุดเริ่มต้นของแต่ละไฟล์ซึ่งส่วนใหญ่จะซ้ำกันในทุกไฟล์
เพื่อป้องกันปัญหานี้คุณสามารถใช้babel-plugin-transform-runtime
ปลั๊กอิน
require
ไม่มีอยู่ในเบราว์เซอร์คุณจึงต้องใช้เครื่องมือสร้างบางอย่างเช่น Require.js, Browserify หรือ Webpack