Currently imports can be namespaced using import * as:
import * as foo from './fooCrud'
import * as bar from './barCrud'
// bundles:
// 8 functions
// create, read, update & delete x 2
const id1 = foo.create('hello')
const id2 = bar.create('world')
foo.update(id1, 'hello')
bar.update(id2, 'world')Currently selective imports can be used to aid tree shaking at build time (with Webpack 2, Rollup etc):
import {
create as fooCreate,
update as fooUpdate
} from './fooCrud'
import {
create as barCreate,
update as barUpdate
} from './barCrud'
// bundles:
// only 4 functions
// fooCreate, fooUpdate, barCreate, barUpdate
//
// but need to rename each function explicitly
// to avoid namespace collision
const id1 = fooCreate('hello')
const id2 = barCreate('world')
fooUpdate(id1, 'hello')
barUpdate(id2, 'world')It would be nice to not have to choose between namespacing and tree shaking as both are desirable:
import { create, update } as foo from './fooCrud'
import { create, update } as bar from './barCrud'
// bundles:
// only 4 functions
// create, update x 2
// no rename needed
const id1 = foo.create('hello')
const id2 = bar.create('world')
foo.update(id1, 'hello')
bar.update(id2, 'world')Naming things is hard. With proper namespacing we can reuse common short function and constant names in our exports giving a very predictable module interface. We do not need to repeat the module name in functions and remember if it is fooCreate or createFoo.
Treeshaking is very desirable for producing small script downloads for mobile devices.
A symmetrical API would imply we also provide:
export { create, update, delete } as mutations
leebyron/ecmascript-more-export-from#11 (comment)