Babel kullandığımda js'ye ihtiyacım var mı?
Bir modül yükleyiciye ihtiyacınız olabilir, ancak RequireJS gerekli değildir. Birkaç seçeneğiniz var. Aşağıdakiler başlamanıza yardımcı olacaktır.
Toplama, yeni nesil bir JavaScript modülü paketleyicisidir. ES2015 modüllerini yerel olarak anlar ve çalışmak için herhangi bir modül yükleyiciye ihtiyaç duymayan bir paket üretir. Kullanılmayan dışa aktarımlar çıktıdan kesilecektir, buna ağaç sallama denir.
Şimdi, en net çıktıyı ürettiği ve kurulumu kolay olduğu için ben şahsen rollupjs kullanmanızı tavsiye ediyorum, ancak cevaba farklı bir yön veriyor. Diğer tüm yaklaşımlar şunları yapar:
- ES6 kodunu babel ile derleyin, seçtiğiniz modül formatını kullanın
- Bir modül yükleyiciyle birlikte derlenen modülleri birleştirin VEYA bağımlılıkları sizin için geçecek bir paketleyici kullanın.
Rollupjs ile işler gerçekten bu şekilde yürümez. Burada, babel yerine toparlama ilk adımdır. Yalnızca varsayılan olarak ES6 modüllerini anlar. Bağımlılıklarının geçilip birleştirileceği bir giriş modülü vermelisiniz. ES6 bir modülde birden çok adlandırılmış dışa aktarmaya izin verdiği için, toplayıcılar kullanılmayan dışa aktarmaları kaldıracak kadar akıllıdır ve böylece paket boyutunu küçültür. Ne yazık ki, rollupjs-s ayrıştırıcısı> ES6 sözdizimini anlamıyor, bu nedenle, ES7 modüllerinin, toplama onları ayrıştırmadan önce derlenmesi gerekir, ancak derleme, ES6 içe aktarımlarını etkilememelidir. Ön ayarlı rollup-plugin-babeleklenti kullanılarak yapılır babel-preset-es2015-rollup(bu ön ayar, modül transformatörü ve harici yardımcılar eklentisi dışında es2015 ile aynıdır). Dolayısıyla, doğru bir şekilde ayarlanmışsa toplama, modüllerinizle aşağıdakileri yapacaktır:
- ES6-7 modülünüzü dosya sisteminden okur
- Babel eklentisi bunu bellekte ES6'ya derler
- toplama, ithalat ve ihracat için ES6 kodunu ayrıştırır (meşe palamudu ayrıştırıcı kullanarak, toplama halinde derlenir)
- tüm grafiği gezer ve tek bir paket oluşturur (ki bu hala harici bağımlılıklara sahip olabilir ve girişin dışa aktarımları seçtiğiniz bir formatta dışa aktarılabilir)
Örnek nodejs derlemesi:
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));
Grunt-rollup ile örnek homurtu derleme
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"]
}
}
}
});
}
Yudum toplaması ile örnek yudum yapısı
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'));
});
Babel'in babelify adında temiz bir paketi var . Kullanımı basit ve anlaşılırdır:
$ 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 ] ]
veya node.js'den kullanabilirsiniz:
$ 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"));
Bu, kodunuzu aynı anda aktaracak ve birleştirecektir. Browserify's .bundleküçük bir CommonJS yükleyici içerecek ve aktarılan modüllerinizi işlevlere göre düzenleyecektir. Hatta göreli ithalata bile sahip olabilirsiniz.
Misal:
.
+-- 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);
Derlemek için sadece node build.jsproje kök dizininde çalıştırın .
Babel kullanarak tüm kodunuzu derleyin. Amd modül transformatörünü kullanmanızı tavsiye ederim ( babel-plugin-transform-es2015-modules-amdbabel 6'da denir ). Bundan sonra derlenmiş kaynaklarınızı WebPack ile paketleyin.
WebPack 2 çıktı! Yerel ES6 modüllerini anlar ve babili -s yerleşik ölü kod eleme kullanarak ağaç sallamayı gerçekleştirir (veya daha doğrusu simüle eder) . Şimdilik (Eylül 2016), WebPack 2'nin ilk sürümüyle görüşüm değişse de, babel ile toplamayı kullanmayı öneririm. Görüşlerinizi yorumlarda tartışmaktan çekinmeyin.
Özel derleme ardışık düzeni
Bazen derleme işlemi üzerinde daha fazla kontrole sahip olmak istersiniz. Kendi ardışık düzeninizi şu şekilde uygulayabilirsiniz:
Öncelikle, babel'i amd modüllerini kullanacak şekilde yapılandırmanız gerekir. Varsayılan olarak babel, tarayıcıda işlenmesi biraz karmaşık olan CommonJS modüllerine aktarılır, ancak browsererify bunları iyi bir şekilde yönetmeyi başarır.
- Babel 5:
{ modules: 'amdStrict', ... }seçeneği kullan
- Babel 6:
es2015-modules-amdeklentiyi kullanın
moduleIds: trueSeçeneği açmayı unutmayın .
Oluşturulan modül adları için aktarılmış kodu kontrol edin, tanımlanmış ve gerekli modüller arasında genellikle uyuşmazlıklar olur. SourceRoot ve moduleRoot'a bakın .
Son olarak, bir tür modül yükleyiciniz olması gerekir, ancak bu zorunlu değildir. Orada almondjs küçücük iyi çalışıyor şimi gerektirir. Hatta kendinizinkini bile uygulayabilirsiniz:
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);
}
}
Sonunda, yükleyici şimini ve derlenmiş modülleri birbirine bağlayabilir ve bunun üzerinde çirkinleştirebilirsiniz.
Babel'in klişe kodu her modülde kopyalanmıştır
Varsayılan olarak, yukarıdaki yöntemlerin çoğu her modülü babel ile ayrı ayrı derler ve sonra bunları birleştirir. Babelify'ın yaptığı da budur. Ancak derlenen koda bakarsanız, babel'in her dosyanın başına çok sayıda ortak metin eklediğini görürsünüz, bunların çoğu tüm dosyalarda kopyalanır.
Bunu önlemek için babel-plugin-transform-runtimeeklentiyi kullanabilirsiniz .
requiretarayıcıda bulunmadığından, Require.js, Browserify veya Webpack gibi bazı oluşturma araçlarını kullanmanız gerekir.