TL; DR - อย่าจนกระทั่ง ~ ตุลาคม 2019 ทีมโมดูล Node.js ได้ถาม :
โปรดอย่าเผยแพร่แพคเกจโมดูล ES ใด ๆ ที่มีไว้เพื่อการใช้งานโดย Node.js จนถึง [ตุลาคม 2019]
2019 พ.ค. อัพเดท
ตั้งแต่ปี 2015 เมื่อมีการถามคำถามนี้การสนับสนุน JavaScript สำหรับโมดูลได้ครบกำหนดแล้วและหวังว่าจะมีเสถียรภาพอย่างเป็นทางการในเดือนตุลาคม 2019 คำตอบอื่น ๆ ทั้งหมดนั้นล้าสมัยหรือซับซ้อนเกินไป นี่คือสถานการณ์ปัจจุบันและแนวทางปฏิบัติที่ดีที่สุด
รองรับ ES6
99% ของ ES6 (aka 2015) ได้รับการสนับสนุนจาก Node ตั้งแต่รุ่น 6 Node เวอร์ชันปัจจุบันคือ 12 เบราว์เซอร์ที่เขียวตลอดปีรองรับคุณสมบัติ ES6 ส่วนใหญ่ ECMAScript ตอนนี้เป็นรุ่น 2019และรูปแบบการกำหนดเวอร์ชันสนับสนุนตอนนี้ใช้เวลาหลายปี
ES Modules (aka โมดูล ECMAScript) ในเบราว์เซอร์
เบราว์เซอร์เอเวอร์กรีนทั้งหมดได้รับการสนับสนุน import
โมดูล ES6 ตั้งแต่ปี 2017 การสนับสนุนการนำเข้าแบบไดนามิกได้รับการสนับสนุนโดย Chrome (+ forks เช่น Opera และ Samsung Internet) และ Safari รองรับ Firefox มีกำหนดไว้สำหรับรุ่นถัดไป 67
คุณไม่จำเป็นต้องใช้ Webpack / rollup / Parcel ฯลฯ เพื่อโหลดโมดูลอีกต่อไป อาจยังมีประโยชน์สำหรับวัตถุประสงค์อื่น แต่ไม่จำเป็นต้องโหลดรหัสของคุณ คุณสามารถนำเข้า URL ที่ชี้ไปยังรหัสโมดูล ES โดยตรง
โมดูล ES ในโหนด
โมดูล ES ( .mjs
ไฟล์ที่มีimport
/ export
) ได้รับการสนับสนุนตั้งแต่ Node v8.5.0 โดยเรียกnode
ด้วย--experimental-modules
แฟล็ก โหนด v12 วางจำหน่ายในเดือนเมษายน 2019 เขียนการสนับสนุนโมดูลทดลองใหม่ การเปลี่ยนแปลงที่มองเห็นได้มากที่สุดคือค่าเริ่มต้นที่ต้องระบุนามสกุลไฟล์เมื่อนำเข้า:
// lib.mjs
export const hello = 'Hello world!';
// index.mjs:
import { hello } from './lib.mjs';
console.log(hello);
บันทึก.mjs
นามสกุลที่จำเป็นตลอด ทำงานเป็น:
node --experimental-modules index.mjs
โหนด 12 เปิดตัวเป็นเมื่อทีมโมดูลถามนักพัฒนาที่จะไม่เผยแพร่แพคเกจโมดูล ES ไว้สำหรับการใช้งานโดย Node.jsจนวิธีการแก้ปัญหาที่พบในการใช้แพคเกจทั้งทางและrequire('pkg')
import 'pkg'
คุณยังคงสามารถเผยแพร่โมดูล ES ดั้งเดิมได้สำหรับเบราว์เซอร์
การสนับสนุนระบบนิเวศของโมดูล ES ดั้งเดิม
ตั้งแต่เดือนพฤษภาคม 2019 การสนับสนุนระบบนิเวศสำหรับโมดูล ES ยังไม่สมบูรณ์ ยกตัวอย่างเช่นกรอบการทดสอบเช่นเจ็ทและAva--experimental-modules
ไม่สนับสนุน คุณต้องใช้ transpiler และจะต้องตัดสินใจระหว่างการใช้import { symbol }
ไวยากรณ์import ( ) ที่มีชื่อ(ซึ่งยังไม่สามารถใช้งานได้กับแพคเกจ npm ส่วนใหญ่) และไวยากรณ์การนำเข้าเริ่มต้น ( import Package from 'package'
) ซึ่งใช้งานได้แต่ไม่ใช่เมื่อ Babel แยกวิเคราะห์มันสำหรับแพ็คเกจที่เขียนใน TypeScript (graphql-tools, node-infux, faast เป็นต้น) มีวิธีแก้ไขที่ใช้ได้ทั้งกับ--experimental-modules
และถ้า Babel transpiles รหัสของคุณเพื่อให้คุณสามารถทดสอบกับ Jest / Ava / Mocha เป็นต้น:
import * as ApolloServerM from 'apollo-server'; const ApolloServer = ApolloServerM.default || ApolloServerM;
เนื้อหาน่าเกลียด แต่วิธีนี้คุณสามารถเขียนโค้ดโมดูล ES ของคุณเองด้วยimport
/ export
และรันด้วยnode --experimental-modules
โดยไม่มี transpilers หากคุณมีการพึ่งพาที่ยังไม่พร้อม ESM ให้นำเข้าดังกล่าวข้างต้นและคุณจะสามารถใช้กรอบการทดสอบและเครื่องมืออื่น ๆ ผ่าน Babel
คำตอบของคำถามก่อนหน้านี้ - อย่าเพิ่งทำเช่นนี้จนกว่าโหนดจะแก้ปัญหาปัญหาการนำเข้า / นำเข้าหวังว่าประมาณเดือนตุลาคม 2019
การเผยแพร่โมดูล ES6 ถึง npm พร้อมความเข้ากันได้ย้อนหลัง
หากต้องการเผยแพร่โมดูล ES ไปที่ npmjs.org เพื่อให้สามารถนำเข้าโดยตรงโดยไม่ต้อง Babel หรือ transpilers อื่น ๆ เพียงแค่ชี้main
ฟิลด์ในไฟล์ของคุณpackage.json
ไปยัง.mjs
ไฟล์ แต่ไม่ต้องใส่นามสกุล:
{
"name": "mjs-example",
"main": "index"
}
นั่นคือการเปลี่ยนแปลงเท่านั้น โดยการข้ามส่วนขยายโหนดจะค้นหาไฟล์ mjs ก่อนหากรันด้วย --experimental-modules มิฉะนั้นจะย้อนกลับไปที่ไฟล์. js ดังนั้นกระบวนการถ่ายโอนข้อมูลที่มีอยู่ของคุณเพื่อสนับสนุนโหนดรุ่นเก่าจะทำงานเหมือนก่อน - เพียงตรวจสอบให้แน่ใจว่าได้ชี้ Babel ไปที่.mjs
ไฟล์
นี่คือแหล่งที่มาสำหรับโมดูล ES ดั้งเดิมที่มีความเข้ากันได้ย้อนหลังสำหรับโหนด <8.5.0ที่ฉันเผยแพร่ไปยัง NPM คุณสามารถใช้งานได้ทันทีโดยไม่ต้องใช้ Babel หรืออย่างอื่น
ติดตั้งโมดูล:
npm install local-iso-dt
# or, yarn add local-iso-dt
สร้างไฟล์ทดสอบtest.mjs :
import { localISOdt } from 'local-iso-dt/index.mjs';
console.log(localISOdt(), 'Starting job...');
Run node (v8.5.0 +) ด้วยแฟล็ก --experimental-modules:
node --experimental-modules test.mjs
สิ่งที่พิมพ์ด้วยพิมพ์ดีด
หากคุณพัฒนาใน TypeScript คุณสามารถสร้างรหัส ES6 และใช้โมดูล ES6:
tsc index.js --target es6 --modules es2015
จากนั้นคุณต้องเปลี่ยนชื่อ*.js
เอาต์พุต.mjs
เป็นปัญหาที่ทราบแล้วซึ่งหวังว่าจะได้รับการแก้ไขในไม่ช้าเพื่อให้tsc
สามารถส่งออก.mjs
ไฟล์ได้โดยตรง