TL; DR - Đừng, cho đến ~ tháng 10 năm 2019. Nhóm Mô-đun Node.js đã hỏi :
Vui lòng không xuất bản bất kỳ gói mô-đun ES nào được Node.js sử dụng cho đến [tháng 10 năm 2019]
Cập nhật tháng 5 năm 2019
Kể từ năm 2015 khi câu hỏi này được hỏi, hỗ trợ JavaScript cho các mô-đun đã trưởng thành đáng kể và hy vọng sẽ chính thức ổn định vào tháng 10 năm 2019. Tất cả các câu trả lời khác hiện đã lỗi thời hoặc quá phức tạp. Dưới đây là tình hình hiện tại và thực hành tốt nhất.
Hỗ trợ ES6
99% ES6 (còn gọi là 2015) đã được Node hỗ trợ kể từ phiên bản 6 . Phiên bản hiện tại của Node là 12. Tất cả các trình duyệt thường xanh hỗ trợ phần lớn các tính năng ES6. ECMAScript hiện đang ở phiên bản 2019 và chương trình phiên bản hiện đang được ưa chuộng sử dụng nhiều năm.
Mô-đun ES (còn gọi là mô-đun ECMAScript) trong trình duyệt
Tất cả các trình duyệt thường xanh đã hỗ trợ import
các mô-đun ES6 kể từ năm 2017. Nhập khẩu động được hỗ trợ bởi Chrome (+ các nhánh như Opera và Samsung Internet) và Safari. Hỗ trợ Firefox dự kiến cho phiên bản tiếp theo, 67.
Bạn không còn cần Webpack / rollup / Parcel, v.v. để tải các mô-đun. Chúng có thể vẫn hữu ích cho các mục đích khác, nhưng không bắt buộc phải tải mã của bạn. Bạn có thể nhập trực tiếp các URL trỏ đến mã mô-đun ES.
Các mô-đun ES trong Node
Các mô-đun ES ( .mjs
tệp có import
/ export
) đã được hỗ trợ kể từ Node v8.5.0 bằng cách gọi node
bằng --experimental-modules
cờ. Node v12, được phát hành vào tháng 4 năm 2019, viết lại các hỗ trợ mô-đun thử nghiệm. Thay đổi rõ ràng nhất là phần mở rộng tệp cần được chỉ định theo mặc định khi nhập:
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib.mjs';
console.log(hello);
Lưu ý các .mjs
phần mở rộng bắt buộc trong suốt. Chạy như:
node --experimental-modules index.mjs
Bản phát hành Node 12 cũng là khi Nhóm Mô-đun yêu cầu các nhà phát triển không xuất bản các gói mô-đun ES dành cho Node.js sử dụng cho đến khi tìm thấy giải pháp cho việc sử dụng các gói thông qua cả hai require('pkg')
và import 'pkg'
. Bạn vẫn có thể xuất bản các mô-đun ES gốc dành cho trình duyệt.
Hỗ trợ hệ sinh thái của các mô đun ES bản địa
Kể từ tháng 5 năm 2019, hỗ trợ hệ sinh thái cho các Mô-đun ES là chưa trưởng thành. Ví dụ: các khung kiểm tra như Jest và Ava không hỗ trợ --experimental-modules
. Bạn cần sử dụng một bộ chuyển mã, và sau đó phải quyết định giữa việc sử dụng import { symbol }
cú pháp import ( ) có tên ( chưa hoạt động với hầu hết các gói npm) và cú pháp nhập mặc định ( import Package from 'package'
), hoạt động, nhưng không phải khi Babel phân tích cú pháp đối với các gói được tạo ra trong TypeScript (graphql-tools, node-Influx, faast, v.v.) Tuy nhiên, có một cách giải quyết hoạt động cả với --experimental-modules
và nếu Babel dịch mã của bạn để bạn có thể kiểm tra nó với Jest / Ava / Mocha, v.v.
import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;
Có thể cho là xấu xí, nhưng bằng cách này bạn có thể viết mã mô-đun ES của riêng bạn với import
/ export
và chạy nó với node --experimental-modules
, mà không cần bộ chuyển đổi. Nếu bạn có các phụ thuộc chưa sẵn sàng ESM, hãy nhập chúng như trên và bạn sẽ có thể sử dụng các khung kiểm tra và các công cụ khác thông qua Babel.
Câu trả lời trước cho câu hỏi - hãy nhớ, đừng làm điều này cho đến khi Node giải quyết vấn đề yêu cầu / nhập khẩu, hy vọng vào khoảng tháng 10 năm 2019.
Xuất bản các mô-đun ES6 lên npm, với khả năng tương thích ngược
Để xuất bản một mô-đun ES lên npmjs.org để có thể nhập trực tiếp, không cần Babel hoặc các bộ chuyển đổi khác, chỉ cần trỏ main
trường trong tệp của bạn package.json
vào .mjs
tệp, nhưng bỏ qua phần mở rộng:
{
"name": "mjs-example",
"main": "index"
}
Đó là sự thay đổi duy nhất. Bằng cách bỏ qua phần mở rộng, Node sẽ tìm tệp mjs đầu tiên nếu chạy với --experimental-mô-đun. Nếu không, nó sẽ rơi trở lại tệp .js, vì vậy quy trình dịch mã hiện có của bạn để hỗ trợ các phiên bản Node cũ hơn sẽ hoạt động như trước - chỉ cần đảm bảo trỏ Babel vào .mjs
(các) tệp.
Đây là nguồn cho một mô-đun ES gốc có khả năng tương thích ngược với Node <8.5.0 mà tôi đã xuất bản cho NPM. Bạn có thể sử dụng nó ngay bây giờ, không cần Babel hay bất cứ thứ gì khác.
Cài đặt mô-đun:
npm install local-iso-dt
# or, yarn add local-iso-dt
Tạo một tệp thử nghiệm test.mjs :
import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');
Chạy nút (v8.5.0 +) với cờ --experimental-mô-đun:
node --experimental-modules test.mjs
TypeScript
Nếu bạn phát triển trong TypeScript, bạn có thể tạo mã ES6 và sử dụng các mô-đun ES6:
tsc index.js --target es6 --modules es2015
Sau đó, bạn cần đổi tên *.js
đầu ra thành .mjs
, một vấn đề đã biết hy vọng sẽ được khắc phục sớm để tsc
có thể xuất .mjs
tệp trực tiếp.