ปัญหาอยู่กับ
- วิธีการจำลองโมดูล ES6 ใน CommonJS
- วิธีที่คุณนำเข้าโมดูล
ES6 ถึง CommonJS
ในขณะที่เขียนสิ่งนี้ไม่มีสภาพแวดล้อมรองรับโมดูล ES6 เมื่อใช้พวกมันใน Node.js คุณต้องใช้บางอย่างเช่น Babel เพื่อแปลงโมดูลเป็น CommonJS แต่มันเกิดขึ้นได้อย่างไร
หลายคนพิจารณาmodule.exports = ...
ที่จะเทียบเท่ากับexport default ...
และที่จะเทียบเท่ากับexports.foo ...
export const foo = ...
แม้ว่าจะไม่เป็นความจริง แต่อย่างน้อยหรือไม่ใช่วิธีที่บาเบลทำ
การdefault
ส่งออกES6 นั้นจริง ๆ แล้วชื่อการส่งออกยกเว้นว่าdefault
เป็นชื่อ "สงวน" และมีการสนับสนุนไวยากรณ์พิเศษสำหรับมัน มาดูกันว่า Babel รวบรวมชื่อและการส่งออกเริ่มต้นอย่างไร:
// input
export const foo = 42;
export default 21;
// output
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var foo = exports.foo = 42;
exports.default = 21;
ที่นี่เราจะเห็นได้ว่าการส่งออกเริ่มต้นจะกลายเป็นสถานที่ให้บริการเกี่ยวกับการที่วัตถุเช่นเดียวกับexports
foo
นำเข้าโมดูล
เราสามารถนำเข้าโมดูลได้สองวิธี: อาจใช้ CommonJS หรือใช้import
ไวยากรณ์ES6
ปัญหาของคุณ:ฉันเชื่อว่าคุณกำลังทำสิ่งที่ชอบ:
var bar = require('./input');
new bar();
คาดว่าbar
จะได้รับการกำหนดค่าของการส่งออกเริ่มต้น แต่อย่างที่เราเห็นในตัวอย่างข้างต้นการส่งออกเริ่มต้นจะถูกกำหนดให้กับdefault
ทรัพย์สิน!
ดังนั้นเพื่อเข้าถึงการส่งออกเริ่มต้นเราต้องทำจริง
var bar = require('./input').default;
ถ้าเราใช้ไวยากรณ์โมดูล ES6 ได้แก่
import bar from './input';
console.log(bar);
บาเบลจะเปลี่ยนให้เป็น
'use strict';
var _input = require('./input');
var _input2 = _interopRequireDefault(_input);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log(_input2.default);
คุณจะเห็นว่าการเข้าถึงทุกแปลงเป็นเข้าถึงbar
.default