ไม่สามารถกำหนด () ค่าการส่งออกเริ่มต้นใน Babel 6.x


88

ใน Babel 5.x ฉันสามารถเขียนโค้ดต่อไปนี้:

app.js

export default function (){}

index.js

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

จากนั้นฉันสามารถทำงานได้node index.jsโดยไม่มีข้อผิดพลาด อย่างไรก็ตามการใช้ Babel 6.x เรียกใช้รหัสต่อไปนี้

index.es6.js

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

ส่งผลให้เกิดข้อผิดพลาด

ต้องใช้ (... ) ไม่ใช่ฟังก์ชัน

ฉันอยากรู้ว่าทำไม?


คุณมี.babelrc? คุณกำลังระบุตัวเลือก Babel อยู่ที่ไหนสักแห่งหรือไม่? ฉันถามเพราะ Babel 6 ไม่ได้แสดงอะไรเลยตามค่าเริ่มต้นและคุณไม่ได้ระบุes2015ค่าที่ตั้งไว้ล่วงหน้าในรหัสที่คุณโพสต์ไว้
Igor Raush

@IgorRaush ฉันมีจริงๆ.babelrcสคริปต์ es6 อื่น ๆ ทำงานได้ตามปกติ
XGHeaven

โปรดอ่านคำอธิบายแท็ก babelมีไว้สำหรับคำถามเกี่ยวกับไลบรารี Python ที่มีชื่อดังกล่าว
Felix Kling

อย่าส่งออกฟังก์ชันจากapp.jsแต่เรียกใช้ทันที
Bergi

@FelixKling ขอโทษค่ะไม่รู้ชื่อเดียวกันด้วยใน python ...
XGHeaven

คำตอบ:


158

TL; ดร

คุณต้องใช้

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

คำอธิบาย

บาเบล 5 เคยมีสับเข้ากันได้สำหรับexport default: module.exportsถ้าโมดูลการส่งออกมีเพียงหนึ่งและมันก็ส่งออกค่าเริ่มต้นจะได้รับมอบหมายให้ ตัวอย่างเช่นโมดูลapp.jsของคุณ

export default function () {}

จะถูกถ่ายทอดสู่สิ่งนี้

"use strict";

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

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

module.exports = exports["default"];

นี้ทำอย่างหมดจดเข้ากันได้กับrequireไอเอ็นจีโมดูล Babel-transpiled (เช่นคุณกำลังทำ) มันก็ไม่สอดคล้องกัน; หากโมดูลมีทั้งการเอ็กซ์พอร์ตที่ตั้งชื่อและดีฟอลต์จะไม่สามารถrequire-d

ในความเป็นจริงตามที่ ES6 โมดูลข้อมูลจำเพาะส่งออกเริ่มต้นคือไม่แตกต่างdefaultกว่าการส่งออกที่มีชื่อที่มีชื่อ มันเป็นเพียงแค่น้ำตาลที่เป็นประโยคซึ่งสามารถแก้ไขได้ในเวลาคอมไพล์ดังนั้นสิ่งนี้

import something from './app';

ก็เหมือนกับสิ่งนี้

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

ตามที่กล่าวไว้ดูเหมือนว่า Babel 6 ตัดสินใจที่จะยกเลิกการแฮ็คการทำงานร่วมกันเมื่อทำการขนส่งโมดูล ตอนนี้โมดูลapp.jsของคุณจะปรากฏเป็นไฟล์

'use strict';

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

exports.default = function () {};

อย่างที่คุณเห็นไม่มีการมอบหมายให้module.exportsอีกแล้ว ในrequireโมดูลนี้คุณต้องทำ

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

19
สำหรับฉันrequire('./app').default;ทำงาน default()ส่งคืนundefined
thinklinux

14
@thinklinux require(...).defaultให้การอ้างอิงถึงฟังก์ชันที่ส่งออก default()เรียกมันว่า หากฟังก์ชันของคุณไม่ส่งคืนอะไรเลย (หรือว่างเปล่า) ผลลัพธ์ก็จะเป็นundefinedเช่นนั้น
Igor Raush

10
require('path').default()ใช้ไม่ได้require('path').defaultผลสำหรับฉัน
soulmachine

2
คุณควรใช้require('./app').default;ถ้าคุณส่งออกวัตถุแทนฟังก์ชัน
Tokenyet


3

หากไม่ได้ผล

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

ใช้

require('./app').default

โดยไม่ต้องเรียกฟังก์ชันในตอนท้าย


ตามที่อิกอร์กล่าวไว้ในความคิดเห็นด้านบน ( stackoverflow.com/questions/33704714/… ) ตัวอย่างแรกของคุณจะเรียกใช้ฟังก์ชันในขณะที่อันที่สองจะให้ข้อมูลอ้างอิง
Stefano
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.