2015-11-14 17 views
54

Trong Babel 5.x, tôi có thể viết đoạn mã sau:Can not require() kim ngạch xuất khẩu mặc định trong Babel 6.x

app.js

export default function(){} 

index.js

require('babel/register'); 
require('./app')(); 

Sau đó, tôi có thể chạy node index.js không có lỗi. Tuy nhiên, sử dụng Babel 6.x, chạy đoạn mã sau

index.es6.js

require('babel-core/register'); 
require('./app')(); 

kết quả trong một lỗi

yêu cầu (...) không phải là một chức năng

Tôi muốn biết tại sao?

+0

Bạn có '.babelrc' không? Bạn có đang chỉ định tùy chọn Babel ở đâu đó không? Tôi yêu cầu vì Babel 6 không transpile bất cứ điều gì theo mặc định và bạn không chỉ định cài đặt trước 'es2015' trong mã bạn đã đăng. –

+0

@IgorRaush Tôi thực sự có '.babelrc', tập lệnh es6 khác đang chạy bình thường – XGHeaven

+0

Vui lòng đọc mô tả thẻ. 'babel' dành cho các câu hỏi cho một thư viện * * * * * * với tên đã nói. –

Trả lời

92

TL; DR

Bạn phải sử dụng

require('./app').default(); 

Giải thích

Babel 5 sử dụng để có một hack tương thích cho export default: nếu một module chứa chỉ có một xuất khẩu, và đó là một lần xuất mặc định, nó được gán cho module.exports. Vì vậy, ví dụ, mô-đun của bạn app.js

export default function() {} 

sẽ được transpiled này

"use strict"; 

Object.defineProperty(exports, "__esModule", { 
    value: true 
}); 

exports["default"] = function() {}; 

module.exports = exports["default"]; 

này được thực hiện hoàn toàn để tương thích với require -ing module Babel-transpiled (giống như bạn đang làm). Nó cũng không phù hợp; nếu một mô-đun có chứa cả tên và mặc định xuất, nó không thể là require -d.

Thực tế, theo thông số mô-đun ES6, xuất mặc định là không khác nhau so với xuất có tên với tên default. Nó chỉ là cú pháp đường có thể được tĩnh giải quyết tại thời gian biên dịch, vì vậy đây

import something from './app'; 

cũng giống như thế này

import { default as something } from './app'; 

đó đang được nói, dường như Babel 6 quyết định thả các khả năng tương tác Hack khi transpiling module. Bây giờ, bạn mô-đun app.js được transpiled như

'use strict'; 

Object.defineProperty(exports, "__esModule", { 
    value: true 
}); 

exports.default = function() {}; 

Như bạn thấy, nhiệm vụ không để module.exports.Để require mô-đun này, bạn cần phải làm

require('./app').default(); 
+1

Cảm ơn, bạn giải quyết câu hỏi của tôi ... – XGHeaven

+6

Đối với tôi 'require ('./ app'). Mặc định;' làm việc. 'default()' trả về 'undefined' – thinklinux

+5

@thinklinux,' require (...). default' cho tham chiếu đến hàm được xuất. 'default()' gọi nó. Nếu hàm của bạn không trả về bất cứ thứ gì (hoặc trống), thì dĩ nhiên, kết quả sẽ là 'undefined'. –

Các vấn đề liên quan