I have a node.js library lib
written in ES6 (compiled with Babel) in which I export the following submodules:
"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;
If from my main project I include the library like this
import * as lib from 'lib';
console.log(lib);
I can see the proper output and it work as expected { config: ... }
. However, if I try to include the library like this:
import lib from 'lib';
console.log(lib);
it will be undefined
.
Can someone explain what is happening here? Aren't the two import methods supposed to be equivalent? If not, what difference am I missing?
import X from Y;
is a syntax sugar.import lib from 'lib';
is equal to
import {default as lib } from 'lib';
Just adding to Logan's solution because understanding import with brackets, * and without solved a problem for me.
is the equivalent of:
Where the * is similar to a wildcard that imports all of the
export var
from lib.Alternatively, using:
Allows you to only access the default export:
Using {} also only imports specific components from the module, which reduces the footprint with bundlers like Webpack.
While:
would import all modules including
export default storage;
See Dan Abramov's answer: When should I use curly braces for ES6 import?
is asking for an object with all of the named exports of 'lib'.
are named exports, which is why you end up with an object like you did.
is asking for the
default
export oflib
. e.g.would make
lib === 4
. It does not fetch the named exports. To get an object from the default export, you'd have to explicitly do