Babel 6.x'te () varsayılan dışa aktarma değeri gerekli olamaz


88

Babel 5.x'de şu kodu yazabilirim:

app.js

export default function (){}

index.js

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

O zaman node index.jshatasız çalışabilirim . Ancak, Babel 6.x kullanarak aşağıdaki kodu çalıştırıyor

index.es6.js

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

bir hatayla sonuçlanır

gerekli (...) bir işlev değil

Neden olduğunu bilmek istiyorum?


Var mı .babelrc? Babel seçeneklerini bir yerde mi belirliyorsunuz? Soruyorum çünkü Babel 6 varsayılan olarak hiçbir şeyi aktarmıyor ve es2015gönderdiğiniz kodda ön ayarı belirtmiyorsunuz.
Igor Raush

@IgorRaush Bende gerçekten var .babelrc, diğerleri es6 betiği normal çalışıyor
XGHeaven

Lütfen etiket açıklamalarını okuyun. adı babelverilen bir Python kitaplığı için sorular içindir .
Felix Kling

Bir işlevi dışa app.js
Bergi

@FelixKling üzgünüm, python'da da aynı ismi bilmiyorum ...
XGHeaven

Yanıtlar:


157

TL; DR

Kullanmak zorundasın

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

Açıklama

Babel 5, şunlar için bir uyumluluk hackine sahipti export default: bir modül yalnızca bir dışa aktarma içeriyorsa ve bu, varsayılan bir dışa aktarmaysa, atanmıştı module.exports. Örneğin, modül app.js kodunuz

export default function () {}

buna aktarılacak

"use strict";

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

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

module.exports = exports["default"];

Bu tamamenrequire Babel'e aktarılmış modüllerle uyumluluk için yapıldı (sizin yaptığınız gibi). Aynı zamanda tutarsızdı; bir modül hem adlandırılmış hem de varsayılan dışa aktarımları içeriyorsa, require-d olamaz .

Gerçekte, ES6 modül spesifikasyonuna göre, varsayılan bir dışa aktarma, ada sahip adlandırılmış bir dışa aktarmadan farklı değildir default. Derleme zamanında statik olarak çözülebilen sadece sözdizimsel şekerdir, yani bu

import something from './app';

bununla aynı

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

Bununla birlikte, Babel 6'nın modülleri aktarırken birlikte çalışabilirlik hackini kaldırmaya karar verdiği anlaşılıyor. Şimdi, app.js modülünüz şu şekilde aktarılır:

'use strict';

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

exports.default = function () {};

Gördüğünüz gibi, artık görevlendirmek yok module.exports. To requireBu modül, yapmanız gereken

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

19
Benim için require('./app').default;çalıştı. default()geri döndüundefined
thinklinux

14
@thinklinux, require(...).defaultdışa aktarılan işleve bir referans verir. default()diyor. İşleviniz hiçbir şey döndürmezse (veya boşsa), sonuç elbette olacaktır undefined.
Igor Raush

10
require('path').default()çalışmıyor, require('path').defaultbenim için çalışıyor
soulmachine

2
require('./app').default;Bir işlev yerine bir nesneyi dışa aktarırsanız kullanmalısınız .
Tokenyet

7

Sadece yukarıdaki doğru cevabı takip etmek için.

Varsayılan dışa aktarma davranışını kullanmak babel@5istiyorsanız babel-plugin-add-module- export eklentisini deneyebilirsiniz .

Benim için oldukça iyi çalışıyor.


3

Bu işe yaramazsa

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

kullanım

require('./app').default

Sonunda işlev çağrısı olmadan.


Igor'un yukarıdaki yorumda dediği gibi ( stackoverflow.com/questions/33704714/… ), örneklerinizden ilki işlevi çağırırken, ikincisi ona bir referans verecektir
Stefano
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.