Tengo una biblioteca lib de node.js escrita en ES6 (compilada con Babel ) en la que exporto los siguientes submódulos:
"use strict"; import * as _config from './config'; import * as _db from './db'; import * as _storage from './storage'; export var config = _config; export var db = _db; export var storage = _storage;Si de mi proyecto principal incluyo la librería así
import * as lib from 'lib'; console.log(lib); Puedo ver el resultado adecuado y funciona como se esperaba { config: ... } . Sin embargo, si intento incluir la biblioteca de esta manera:
import lib from 'lib'; console.log(lib); será undefined .
¿Alguien puede explicar qué está pasando aquí? ¿No se supone que los dos métodos de importación son equivalentes? Si no, ¿qué diferencia me estoy perdiendo?
import * as lib from 'lib';está solicitando un objeto con todas las exportaciones nombradas de 'lib'.
export var config = _config; export var db = _db; export var storage = _storage;se denominan exportaciones, razón por la cual terminas con un objeto como lo hiciste.
import lib from 'lib'; está solicitando la exportación default de lib .
p.ej
export default 4; haría lib === 4 . No obtiene las exportaciones nombradas. Para obtener un objeto de la exportación predeterminada, tendría que hacer explícitamente
export default { config: _config, db: _db, storage: _storage };Simplemente agregando a la solución de Logan porque entender la importación con corchetes, * y sin resolver un problema para mí.
import * as lib from 'lib';es el equivalente de:
import {config, db, storage} as lib from 'lib'; Donde * es similar a un comodín que importa todas las export var de lib.
export var config; export var db; export var storage;Alternativamente, usando:
import lib from 'lib';Le permite acceder solo a la exportación predeterminada:
// lib.js export default storage;El uso de {} también solo importa componentes específicos del módulo, lo que reduce el espacio ocupado con paquetes como Webpack.
Mientras:
import storage, { config, db } from './lib' importaría todos los módulos, incluido export default storage;
Vea la respuesta de Dan Abramov: ¿Cuándo debo usar llaves para importar ES6?
import X from Y; es un azúcar de sintaxis.
import lib from 'lib';
es igual a
import { default as lib } from 'lib';