Sebelumnya, babel akan menambahkan baris module.exports = exports["default"]
. Tidak lagi melakukan ini. Apa artinya ini sebelum saya bisa melakukan:
var foo = require('./foo');
// use foo
Sekarang saya harus melakukan ini:
var foo = require('./foo').default;
// use foo
Bukan masalah besar (dan saya menduga inilah yang seharusnya selama ini). Masalahnya adalah bahwa saya memiliki banyak kode yang bergantung pada cara hal-hal yang digunakan untuk bekerja (saya dapat mengonversikan sebagian besar ke impor ES6, tetapi tidak semuanya). Adakah yang bisa memberi saya tips tentang cara membuat cara lama bekerja tanpa harus melalui proyek saya dan memperbaiki ini (atau bahkan beberapa instruksi tentang cara menulis codemod untuk melakukan ini akan sangat licin).
Terima kasih!
Contoh:
Memasukkan:
const foo = {}
export default foo
Output dengan Babel 5
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = {};
exports["default"] = foo;
module.exports = exports["default"];
Output dengan Babel 6 (dan plugin es2015):
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = {};
exports["default"] = foo;
Perhatikan bahwa satu-satunya perbedaan dalam output adalah module.exports = exports["default"]
.
Edit
Anda mungkin tertarik pada posting blog ini yang saya tulis setelah menyelesaikan masalah spesifik saya: Modul ES6 Kesalahpahaman, Memutakhirkan Babel, Air Mata, dan Solusi
sumber
require
jika Anda bekerja dalam basis kode yang menggunakan Babel? Kemungkinannya, ada beberapa pendekatan lain yang memungkinkan Anda untuk menghindarinya.if (false) { require('./foo') }
dengan webpack akan melompati sebenarnya termasukfoo.js
dalam bundel yang dihasilkan.false
toggle Anda di sana? Jika itu adalah kondisi yang tersedia di konfigurasi webpack Anda, mungkin ada opsi lain.export default {foo, bar}
dengan sayamodule.exports = {foo, bar}
. Saya cukup menyukai metode yang salah yang sekarang tidak didukung.Jawaban:
Anda juga dapat menggunakan plugin ini untuk mendapatkan
export
kembali perilaku lama .sumber
Jika Anda ingin perilaku ekspor CommonJS, Anda harus menggunakan CommonJS secara langsung (atau menggunakan plugin di jawaban lain). Perilaku ini telah dihapus karena menyebabkan kebingungan dan menyebabkan semantik ES6 yang tidak valid, yang diandalkan oleh beberapa orang misalnya
lalu
yang ES6 tidak valid tetapi bekerja karena perilaku interoperabilitas CommonJS yang Anda gambarkan. Sayangnya mendukung kedua kasus itu tidak mungkin, dan memungkinkan orang untuk menulis ES6 yang tidak valid adalah masalah yang lebih buruk daripada membuat Anda melakukannya
.default
.Masalah lainnya adalah bahwa itu tidak terduga bagi pengguna jika mereka menambahkan ekspor bernama di masa depan, misalnya
kemudian
tapi
kemudian
sumber
export default function () {}
di modul A dan kemudianimport a from 'a'
di modul B, dengan Babel 6a
akan menjadi{ default: function () {} }
... Dari apa yang saya bisa pahami dari explorejs.com/es6/… ini seharusnya bekerja dan saya harus mendapatkan hasil ekspor fungsi dalam B, bukan objek.Untuk penulis perpustakaan, Anda mungkin dapat mengatasi masalah ini.
Saya biasanya memiliki titik masuk
index.js
,, yang merupakan file yang saya tunjuk dari bidang utama dipackage.json
. Ia tidak melakukan apa-apa selain mengekspor kembali titik masuk aktual lib:Untuk mengatasi masalah babel, saya mengubah ini menjadi
import
pernyataan dan kemudian menetapkan default kemodule.exports
:Semua file saya yang lain tetap sebagai modul ES6 murni, tanpa solusi. Jadi hanya titik masuk yang perlu diubah sedikit :)
Ini akan bekerja untuk commonjs memerlukan, dan juga untuk impor ES6 karena babel tampaknya tidak menjatuhkan reverse interop (commonjs -> es6). Babel menyuntikkan fungsi berikut untuk menambal commonjs:
Saya telah menghabiskan berjam-jam berjuang melawan ini, jadi saya harap ini menyelamatkan orang lain upaya!
sumber
module.exports
danexport default
sebagainya. Sekarang kita kembali ke titik awal?require("whatever").default
. Jika Anda bukan penulis perpustakaan, ini mungkin tidak relevanSaya memiliki masalah seperti itu. Dan ini solusi saya:
//src/arithmetic.js
//src/main.js
sumber