2016-02-20 10 views
8

Sono abbastanza nuovo su JavaScript e ho avuto recentemente problemi con le importazioni. C'è stata una cosa che non posso avvolgere nella mia testa.Cosa importa l'importazione del modulo da 'modulo' quando non viene definita l'esportazione predefinita e perché è diversa dall'importazione * come modulo?

Nei vecchi moduli di nodo (principalmente quelli che sono venuti a vedere la luce prima di ES6), che possono essere installati utilizzando il npm, come ad esempio express, in genere non viene definita alcuna esportazione predefinita.

Il mio IDE (WebStorm) contrassegna la riga seguente con L'esportazione predefinita non è dichiarata nella notifica del modulo importato.

import express from 'express'; 

Questo messaggio può essere aggirato tentando di importare l'intero modulo come un alias utilizzando

import * as express from 'express'; 

implicitamente raccontare la mia IDE di importare proprio tutto e il nome express, però così facendo poi porta ad un express non è una funzione errore quando si tenta di creare un'istanza dell'applicazione nella riga seguente.

const app = express(); 

Peculiaramente l'importazione originale (senza alias) funziona.

Cosa viene importato esattamente utilizzando la dichiarazione di importazione senza l'alias, quando non è definita l'esportazione predefinita? Penso che sia l'intero modulo, ma non sembra così.

+1

Questo è più probabilmente un problema con il tuo IDE che non sa come i moduli pre-ES6 dei gestori del caricatore di moduli. Se funziona, dovresti usarlo e disattivare la notifica o trovare un modo per dichiarare le esportazioni dei moduli collegati. – Bergi

+0

@Bergi Anche la notifica IDE non è un problema, non è la questione della domanda. Sono più interessato a ciò che viene importato come predefinito quando non viene dichiarata alcuna importazione, come ha fatto notare il mio IDE. Probabilmente avrei dichiarato che sto usando webpack e babel con es-2015 preimpostato per imballare i moduli in un pacchetto. Non ho tempo solo ora, ma modifico la domanda quando lo faccio. –

+0

@DavidPacker WebStorm smette di lamentarsi dopo aver scaricato e abilitato i file di definizione del tipo (ad esempio 'express.d.ts') da [github.com/DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) in * Impostazioni> Lingue e Frameworks> JavaScript> Librerie> Download> express> Download e installazione * –

risposta

6

Cosa importa import Module from 'module' quando non è definita l'esportazione predefinita?

Niente. Infatti, instantiating the module genererà uno SyntaxError quando qualcosa viene importato che non viene esportato o esportato più volte dal modulo importato.

Perché è diverso da import * as Module?

Perché import * importa appena un module namespace object che ha le esportazioni come proprietà. Se non esporti nulla, sarà un oggetto vuoto.

Nei moduli di nodo pre-ES6 in genere non viene definita alcuna esportazione predefinita.

Ciò significa che non è possibile importarli come modulo ES6. Il tuo IDE sembra aspettarsi che però e mette l'avviso.

Quindi cosa succede se ci si riferisce ad essi in una dichiarazione import? Il tuo caricatore di moduli potrebbe fare qualsiasi cosa con esso, e HostResolveImportedModule restituirà un module record che non è un source text "ES6 module" record - cioè potrebbe fare qualsiasi cosa dipende dall'implementazione con i moduli CommonJS.

+0

Quindi importare un modulo pre-ES6 usando una sintassi ES6 invece di plain 'require' semplicemente non funzionerebbe e probabilmente l'unico motivo per cui lo fa a causa della transormazione babel? Ho capito correttamente la tua risposta? –

+1

No, funziona perché il tuo modulo loader/bundler (webpack nel tuo caso) tratta i moduli pre-ES6 in modo appropriato. Non tutti i caricatori/bundler potrebbero supportarlo, dipende dall'implementazione. Ma dato quanto sia utile importare i vecchi moduli commonjs, questo non si romperà. Il problema del tuo IDE è che non lo sa. – Bergi