Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to import ES2015 modules functions selectively, but with namespacing?

I'm getting started with Rollup and D3 version 4, which is written in ES2015 modules. I've written a some code using the traditional D3 namespace "d3". Now I want to create a custom bundle using Rollup. I want to using tree-shaking, because I'm probably only using about half the functions in d3, and I want to keep things as light as possible.

I'm clear that I can import functions selectively, e.g.:

import {scaleLinear} from "d3-scale";
import {
      event,
      select,
      selectAll
} from "d3-selection";

That is going to get very verbose very fast, because half of d3 is a lot of functions. I can live with that. The bigger problem is that it also would require completely rewriting all my function identifiers without a namespace. I don't much care for that, because I prefer to namespace library code.

I understand that I can import all of the module:

import * as d3 from "d3";

which preserves the d3 object namespace, which is good for my code organization. But then Rollup can't tree-shake the unused functions out of the bundle.

What I'm dreaming of is something like:

import {
      event,
      select,
      selectAll
} as d3 from "d3-selection";

but that sort of feature/syntax doesn't seem to exist in the spec. How can I both selectively target individual parts of a module, and preserve namespacing during an import?

like image 948
Ben Avatar asked Sep 25 '16 17:09

Ben


1 Answers

You need a re-exporting module for that:

export {
      event,
      select,
      selectAll
} from "d3-selection";

import * as d3 from './d3';
like image 85
Estus Flask Avatar answered Nov 18 '22 01:11

Estus Flask