Không thể yêu cầu () giá trị xuất mặc định trong Babel 6.x


85

Trong Babel 5.x, tôi có thể viết mã sau:

app.js

export default function (){}

index.js

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

Sau đó, tôi có thể chạy node index.jsmà 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')();

dẫn đến một lỗi

request (...) không phải là một hàm

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


Bạn có một .babelrc? Bạn có đang chỉ định các tùy chọn Babel ở đâu đó không? Tôi hỏi vì Babel 6 không chuyển tải bất cứ thứ gì theo mặc định và bạn không chỉ định es2015giá trị đặt trước trong mã bạn đã đăng.
Igor Raush

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

Vui lòng đọc mô tả thẻ. babeldành cho các câu hỏi cho một thư viện Python có tên đã nói.
Felix Kling

Chỉ cần không xuất một hàm từ app.js, nhưng hãy chạy nó ngay lập tức
Bergi

@FelixKling xin lỗi, tôi không biết cái tên tương tự cũng có trong python ...
XGHeaven

Câu trả lời:


156

TL; DR

Bạn phải sử dụng

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

Giải trình

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

export default function () {}

sẽ được chuyển sang điều này

"use strict";

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

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

module.exports = exports["default"];

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

Trên thực tế, theo thông số kỹ thuật của mô-đun ES6, một bản xuất mặc định không khác gì một bản xuất được đặt tên với tên default. Nó chỉ là đường cú pháp có thể được giải quyết tĩnh tại thời điểm biên dịch, vì vậy điều này

import something from './app';

giống như cái này

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

Điều đó đang được nói, có vẻ như Babel 6 đã quyết định bỏ hack khả năng tương tác khi chuyển đổi các mô-đun. Bây giờ, module app.js của bạn được chuyển thành

'use strict';

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

exports.default = function () {};

Như bạn thấy, không có thêm nhiệm vụ cho module.exports. Đối requirevới mô-đun này, bạn cần làm

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

19
Đối với tôi require('./app').default;đã làm việc. default()đã trở lạiundefined
thinklinux

14
@thinklinux, require(...).defaultcung cấp một tham chiếu đến hàm đã xuất. default()gọi nó. Nếu hàm của bạn không trả về bất kỳ thứ gì (hoặc trống), thì tất nhiên, kết quả sẽ là undefined.
Igor Raush

10
require('path').default()không làm việc, require('path').defaultlàm việc cho tôi
soulmachine

2
Bạn nên sử dụng require('./app').default;Nếu bạn xuất một đối tượng thay vì một hàm.
Tokenyet

7

Chỉ cần theo dõi với câu trả lời chính xác ở trên.

Nếu bạn muốn sử dụng hành vi xuất mặc định của babel@5, bạn có thể thử plugin babel-plugin-add-module-export .

Nó hoạt động khá tốt đối với tôi.


2

Nếu điều này không hiệu quả

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

sử dụng

require('./app').default

Nếu không có lệnh gọi hàm ở cuối.


Như Igor đã nói trong nhận xét ở trên ( stackoverflow.com/questions/33704714/… ), ví dụ đầu tiên của bạn sẽ gọi hàm trong khi ví dụ thứ hai sẽ cung cấp cho nó một tham chiếu
Stefano
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.