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.