Vấn đề là với
- mô-đun ES6 được mô phỏng như thế nào trong CommonJS
- cách bạn nhập mô-đun
ES6 đến CommonJS
Tại thời điểm viết bài này, không có môi trường nào hỗ trợ các mô-đun ES6 nguyên bản. Khi sử dụng chúng trong Node.js, bạn cần sử dụng một cái gì đó như Babel để chuyển đổi các mô-đun thành CommonJS. Nhưng chính xác thì điều đó xảy ra như thế nào?
Nhiều người coi module.exports = ...
là tương đương export default ...
và exports.foo ...
tương đương export const foo = ...
. Điều đó không hoàn toàn đúng, hoặc ít nhất không phải là cách Babel làm điều đó.
default
Xuất khẩu ES6 thực sự cũng được đặt tên xuất khẩu, ngoại trừ đó default
là tên "dành riêng" và có hỗ trợ cú pháp đặc biệt cho nó. Hãy xem cách Babel biên dịch xuất khẩu có tên và mặc định:
// 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;
Ở đây chúng ta có thể thấy rằng xuất mặc định trở thành một thuộc tính trên exports
đối tượng, giống như foo
.
Nhập mô-đun
Chúng ta có thể nhập mô-đun theo hai cách: Hoặc sử dụng CommonJS hoặc sử dụng import
cú pháp ES6 .
Vấn đề của bạn: Tôi tin rằng bạn đang làm một cái gì đó như:
var bar = require('./input');
new bar();
hy vọng rằng nó bar
được gán giá trị của xuất mặc định. Nhưng như chúng ta có thể thấy trong ví dụ trên, xuất mặc định được gán cho thuộc default
tính!
Vì vậy, để truy cập vào xuất mặc định, chúng tôi thực sự phải làm
var bar = require('./input').default;
Nếu chúng ta sử dụng cú pháp mô-đun ES6, cụ thể là
import bar from './input';
console.log(bar);
Babel sẽ biến đổi nó thành
'use strict';
var _input = require('./input');
var _input2 = _interopRequireDefault(_input);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log(_input2.default);
Bạn có thể thấy rằng mọi quyền truy cập bar
được chuyển đổi thành quyền truy cập .default
.