Non è possibile richiedere il valore di esportazione predefinito () in Babel 6.x


88

In Babel 5.x, posso scrivere il seguente codice:

app.js

export default function (){}

index.js

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

Quindi, posso eseguire node index.jssenza errori. Tuttavia, utilizzando Babel 6.x, eseguendo il codice seguente

index.es6.js

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

si traduce in un errore

require (...) non è una funzione

Voglio sapere perchè?


Hai un .babelrc? Stai specificando le opzioni di Babel da qualche parte? Lo chiedo perché Babel 6 non trasporta nulla di default e non stai specificando il es2015preset nel codice che hai pubblicato.
Igor Raush

@IgorRaush Ne ho davvero uno .babelrc, gli altri script es6 funzionano normalmente
XGHeaven

Si prega di leggere le descrizioni dei tag. babelè per le domande per una libreria Python con detto nome.
Felix Kling

Basta non esportare una funzione da app.js, ma eseguirla subito
Bergi

@FelixKling scusa, non conosco lo stesso nome anche in python ...
XGHeaven

Risposte:


157

TL; DR

Devi usare

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

Spiegazione

Babel 5 aveva un hack di compatibilità per export default: se un modulo conteneva solo un'esportazione, ed era un'esportazione predefinita, veniva assegnato a module.exports. Quindi, ad esempio, il tuo modulo app.js

export default function () {}

sarebbe traslato in questo

"use strict";

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

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

module.exports = exports["default"];

Questo è stato fatto puramente per compatibilità con i requiremoduli transpiled -ing Babel (come stai facendo). Era anche incoerente; se un modulo conteneva sia esportazioni denominate che predefinite, non poteva esserlorequire -d.

In realtà, secondo le specifiche del modulo ES6, un'esportazione predefinita non è diversa da un'esportazione denominata con il nome default. È solo zucchero sintattico che può essere risolto staticamente in fase di compilazione, quindi questo

import something from './app';

è lo stesso di questo

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

Detto questo, sembra che Babel 6 abbia deciso di abbandonare l'hack dell'interoperabilità durante il transpiling dei moduli. Ora, il tuo modulo app.js è traspilato come

'use strict';

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

exports.default = function () {};

Come vedi, niente più incarichi a module.exports. Per requirequesto modulo, devi fare

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

19
Per me ha require('./app').default;funzionato. default()restituitoundefined
thinklinux

14
@thinklinux, require(...).defaultfornisce un riferimento alla funzione esportata. default()lo chiama. Se la tua funzione non restituisce nulla (o è vuota), allora, ovviamente, il risultato sarà undefined.
Igor Raush

10
require('path').default()non funziona, require('path').defaultfunziona per me
soulmachine

2
Dovresti usare require('./app').default;Se esporti un oggetto invece di una funzione.
Tokenyet


3

Se questo non funziona

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

uso

require('./app').default

Senza la chiamata alla funzione alla fine.


Come dice Igor nel commento sopra ( stackoverflow.com/questions/33704714/… ) il primo dei tuoi esempi chiamerà la funzione mentre il secondo le darà un riferimento
Stefano
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.