Saya bereksperimen dengan ES6, dan saya menggunakan gulp untuk membangun dan babel untuk ditranspilasi ke ES5. Outputnya tidak dijalankan dalam node, hanya ditautkan ke dari file .htm dengan tag. Saya pikir saya perlu menambahkan
<script src='require.js'></script>
atau semacam itu.
Saya mencoba untuk mengimpor / mengekspor.
////////////////scripts.js
import {Circle} from 'shapes';
c = new Circle(4);
console.log(c.area());
/////////////////shapes.js
export class Circle {
circle(radius) {
this.radius = radius;
}
area() {
return this.radius * this.radius * Math.PI;
}
}
Kesalahan adalah
Uncaught ReferenceError: require is not defined
Mengacu pada ini (setelah .pipe (babel ()) di gulp)
var _shapes = require('shapes');
javascript
ecmascript-6
jason
sumber
sumber
require
tidak ada di browser, Anda perlu menggunakan beberapa alat build seperti Require.js, Browserify atau Webpack.require
fungsi (sekali lagi, tidak ada hubungannya dengan require.js). Namun, Anda dapat memberi tahu Babel untuk mengonversi modul ke modul lain , misalnya AMD atau UMD, yang kemudian akan berfungsi dengan require.js. Bagaimanapun, Anda memerlukan sistem untuk memuat modul di browser, karena browser tidak menyediakan modul secara default (belum).Jawaban:
Anda mungkin membutuhkan beberapa modul loader, tetapi itu tidak perlu RequireJS. Anda punya beberapa pilihan. Berikut ini akan membantu Anda untuk memulai.
rollup.js dengan rollup-plugin-babel
Rollup adalah bundler modul JavaScript generasi berikutnya. Ini memahami modul ES2015 secara native, dan akan menghasilkan bundel yang tidak memerlukan modul loader apa pun untuk beroperasi. Ekspor yang tidak digunakan akan dipotong dari output, ini disebut gemetar pohon.
Sekarang saya pribadi merekomendasikan menggunakan rollupjs, karena menghasilkan output paling jelas, dan mudah diatur, namun memberikan aspek yang berbeda untuk jawabannya. Semua pendekatan lainnya melakukan yang berikut:
Dengan rollupjs hal-hal tidak benar-benar berfungsi seperti ini. Di sini, rollup adalah langkah pertama, bukan babel. Ini hanya memahami modul ES6 secara default. Anda harus memberikan modul entri yang dependensinya akan dilintasi dan digabungkan. Karena ES6 mengizinkan beberapa ekspor bernama dalam satu modul, rollupj cukup pintar untuk menghapus ekspor yang tidak digunakan, sehingga memperkecil ukuran paket. Sayangnya parser rollupjs-s tidak memahami sintaksis> ES6, jadi modul ES7 harus dikompilasi sebelum rollup mem-parsainya, tetapi kompilasi tidak akan memengaruhi impor ES6. Ini dilakukan dengan menggunakan
rollup-plugin-babel
plugin denganbabel-preset-es2015-rollup
preset (preset ini sama dengan es2015, kecuali modul transformer dan plugin external-helpers). Jadi rollup akan melakukan hal berikut dengan modul Anda jika diatur dengan benar:Contoh nodejs build:
Contoh build grunt dengan grunt-rollup
Contoh membangun gulp dengan gulp-rollup
Babelify + Browserify
Babel memiliki paket rapi yang disebut babelify . Penggunaannya sederhana dan mudah:
atau Anda dapat menggunakannya dari node.js:
Ini akan mentranspilasi dan menggabungkan kode Anda sekaligus. Browserify's
.bundle
akan menyertakan pemuat CommonJS kecil yang bagus, dan akan mengatur modul transparan Anda ke dalam fungsi. Anda bahkan dapat memiliki impor relatif.Contoh:
Untuk mengkompilasi, jalankan saja
node build.js
di root proyek Anda.Babel + WebPack
Kompilasi semua kode Anda menggunakan babel. Saya merekomendasikan Anda untuk menggunakan transformator modul amd (disebut
babel-plugin-transform-es2015-modules-amd
dalam babel 6). Setelah itu bundel sumber yang Anda kompilasi dengan WebPack.WebPack 2 sudah keluar! Ia memahami modul ES6 asli, dan akan melakukan (atau lebih tepatnya mensimulasikan) pohon gemetar menggunakan eliminasi kode mati bawaan babili -s. Untuk saat ini (September 2016) saya tetap menyarankan untuk menggunakan rollup dengan babel, meskipun pendapat saya mungkin berubah dengan rilis pertama WebPack 2. Jangan ragu untuk mendiskusikan pendapat Anda di kolom komentar.
Pipeline kompilasi kustom
Terkadang Anda ingin memiliki kontrol lebih atas proses kompilasi. Anda dapat menerapkan pipeline Anda sendiri seperti ini:
Pertama, Anda harus mengkonfigurasi babel untuk menggunakan modul amd. Secara default babel transpiles ke modul CommonJS, yang sedikit rumit untuk ditangani di browser, meskipun browserify berhasil menanganinya dengan cara yang baik.
{ modules: 'amdStrict', ... }
opsies2015-modules-amd
pluginJangan lupa untuk mengaktifkan
moduleIds: true
opsinya.Periksa kode transparan untuk nama modul yang dihasilkan, sering kali ada ketidaksesuaian antara modul yang ditentukan dan yang diperlukan. Lihat sourceRoot dan moduleRoot .
Akhirnya, Anda harus memiliki beberapa jenis modul loader, tetapi itu tidak perlu membutuhkanjs. Ada almondjs , shim kecil yang bekerja dengan baik. Anda bahkan dapat menerapkannya sendiri:
Pada akhirnya, Anda cukup menggabungkan shim loader dan modul yang dikompilasi, dan menjalankan uglify padanya.
Kode boilerplate Babel diduplikasi di setiap modul
Secara default, sebagian besar metode di atas mengkompilasi setiap modul dengan babel satu per satu, dan kemudian menggabungkannya. Itu juga yang dilakukan babelify. Tetapi jika Anda melihat kode yang dikompilasi, Anda melihat bahwa babel menyisipkan banyak boilerplate di awal setiap file, kebanyakan dari mereka digandakan di semua file.
Untuk mencegahnya, Anda dapat menggunakan
babel-plugin-transform-runtime
plugin.sumber
barebones webpack 2
1) Jika ini adalah direktori root Anda:
index.html
scripts.js
bentuk. js
2) memiliki node terpasang node
3) jalankan perintah berikut di terminal Anda:
5) di direktori root Anda, jalankan perintah berikut:
Anda sekarang harus memiliki file bernama bundle.js di direktori root Anda yang akan menjadi file yang akan digunakan index.html Anda. Ini adalah fitur bundling minimalis dari webpack. Anda dapat mempelajari lebih lanjut di sini
sumber
require
tidak ada di browser, jadi kesalahan ini sudah diperkirakan. Anda perlu menggunakan sesuatu seperti require.js atau Browserify.sumber