TL; DR - Jangan, sampai ~ Oktober 2019. Tim Modul Node.js telah bertanya :
Harap jangan mempublikasikan paket modul ES yang dimaksudkan untuk digunakan oleh Node.js hingga [Oktober 2019]
Pembaruan 2019 Mei
Sejak 2015 ketika pertanyaan ini diajukan, dukungan JavaScript untuk modul telah matang secara signifikan, dan semoga akan stabil secara resmi pada Oktober 2019. Semua jawaban lain sekarang sudah usang atau terlalu rumit. Inilah situasi saat ini dan praktik terbaik.
Dukungan ES6
99% dari ES6 (alias 2015) telah didukung oleh Node sejak versi 6 . Versi Node saat ini adalah 12. Semua peramban hijau mendukung sebagian besar fitur ES6. ECMAScript sekarang di versi 2019 , dan skema versi sekarang lebih suka menggunakan tahun.
Modul ES (alias modul ECMAScript) di browser
Semua evergreen browser telah mendukung import
-ing modul ES6 sejak 2017. impor dinamis yang didukung oleh Chrome (+ garpu seperti Opera dan Samsung internet) dan Safari. Dukungan Firefox dijadwalkan untuk versi berikutnya, 67.
Anda tidak lagi memerlukan Webpack / rollup / Parcel dll untuk memuat modul. Mereka mungkin masih berguna untuk tujuan lain, tetapi tidak diharuskan memuat kode Anda. Anda dapat langsung mengimpor URL yang menunjuk ke kode modul ES.
Modul ES di Node
Modul ES ( .mjs
file dengan import
/ export
) telah didukung sejak Node v8.5.0 dengan memanggil node
dengan --experimental-modules
flag. Node v12, dirilis pada April 2019, menulis ulang dukungan modul eksperimental. Perubahan yang paling terlihat adalah bahwa ekstensi file harus ditentukan secara default saat mengimpor:
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib.mjs';
console.log(hello);
Perhatikan .mjs
ekstensi wajib di seluruh. Jalankan sebagai:
node --experimental-modules index.mjs
Rilis Node 12 juga ketika Tim Modul meminta pengembang untuk tidak mempublikasikan paket modul ES yang dimaksudkan untuk digunakan oleh Node.js sampai solusi ditemukan untuk menggunakan paket melalui keduanya require('pkg')
dan import 'pkg'
. Anda masih dapat menerbitkan modul ES asli yang ditujukan untuk browser.
Dukungan ekosistem modul ES asli
Pada Mei 2019, dukungan ekosistem untuk Modul ES belum sempurna. Misalnya, kerangka kerja pengujian seperti Jest dan Ava tidak mendukung --experimental-modules
. Anda perlu menggunakan transpiler, dan kemudian harus memutuskan antara menggunakan import { symbol }
sintaks import ( ) yang bernama (yang belum bekerja dengan sebagian besar paket npm), dan sintaks impor default ( import Package from 'package'
), yang berfungsi, tetapi tidak ketika Babel mem-parsingnya untuk paket - paket yang ditulis dalam TypeScript (graphql-tools, node-influx, faast dll.) Namun ada solusi yang berfungsi baik dengan --experimental-modules
dan jika Babel mengubah kode Anda sehingga Anda dapat mengujinya dengan Jest / Ava / Mocha dll:
import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;
Bisa dibilang jelek, tetapi dengan cara ini Anda bisa menulis kode modul ES Anda sendiri dengan import
/ export
dan menjalankannya node --experimental-modules
, tanpa transpiler. Jika Anda memiliki dependensi yang belum siap ESM, impor mereka seperti di atas, dan Anda akan dapat menggunakan kerangka kerja pengujian dan perkakas lain melalui Babel.
Jawaban sebelumnya untuk pertanyaan - ingat, jangan lakukan ini sampai Node menyelesaikan masalah persyaratan / impor, semoga sekitar Oktober 2019.
Menerbitkan modul ES6 ke npm, dengan kompatibilitas ke belakang
Untuk menerbitkan modul ES untuk npmjs.org sehingga dapat diimpor langsung, tanpa Babel atau transpilers lainnya, hanya titik main
lapangan di Anda package.json
ke .mjs
file, namun menghilangkan ekstensi:
{
"name": "mjs-example",
"main": "index"
}
Itu satu-satunya perubahan. Dengan menghilangkan ekstensi, Node akan mencari file mjs terlebih dahulu jika dijalankan dengan --experimental-modules. Jika tidak, ia akan kembali ke file .js, sehingga proses transpilasi Anda yang ada untuk mendukung versi Node yang lebih lama akan berfungsi seperti sebelumnya - pastikan untuk mengarahkan Babel ke .mjs
file tersebut.
Inilah sumber untuk modul ES asli dengan kompatibilitas ke belakang untuk Node <8.5.0 yang saya terbitkan ke NPM. Anda dapat menggunakannya sekarang, tanpa Babel atau apa pun.
Pasang modul:
npm install local-iso-dt
# or, yarn add local-iso-dt
Buat file tes test.mjs :
import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');
Jalankan node (v8.5.0 +) dengan flag --experimental-modules:
node --experimental-modules test.mjs
TypeScript
Jika Anda mengembangkan dalam TypeScript, Anda dapat menghasilkan kode ES6 dan menggunakan modul ES6:
tsc index.js --target es6 --modules es2015
Kemudian, Anda perlu mengubah nama *.js
keluaran menjadi .mjs
, masalah yang diketahui yang diharapkan akan segera diperbaiki sehingga tsc
dapat menampilkan .mjs
file secara langsung.