可以合并或嵌套ES6导入?

eri*_*oco 12 javascript import merge ecmascript-6

许多现代JavaScript库正在从单块更新到模块化的npm包; 一些例子是lodashd3.

这在保持构建规模下降方面很好,但是对于导入来说有点尴尬.加载整个库时,我写道:

import d3 from 'd3';

let csv = d3.csv()...
let xScale = d3.scale()...
Run Code Online (Sandbox Code Playgroud)

当加载单个模块而不是整个包时,我写道:

import d3_scale from 'd3-scale';
import d3_request from 'd3-request';

let csv = d3_request.csv()...
let xScale = d3.scale.scaleLinear()...
Run Code Online (Sandbox Code Playgroud)

有没有一种语法允许我合并我的导入,所以我可以从一个对象(例如d3.csv(),d3.scaleLinear())中的每个包中进行所有函数调用?

eri*_*oco 9

当我写这个问题时,我想出了答案.自橡胶回避.

差运算符在这里看起来很不错:

import * as d3_request from 'd3-request';
import * as d3_scale from 'd3-scale';
const d3 = {
    ...d3_request,
    ...d3_scale
};

d3.csv('path/to.csv', (error, data) => {
    let xScale = d3.scale()...
});
Run Code Online (Sandbox Code Playgroud)

  • 它是`const d3 = Object.assign({},d3_request,d3_scale)`.在ES6中,传播是针对可迭代的,而对象不是那些.[对象传播](https://github.com/sebmarkbage/ecmascript-rest-spread)是第2阶段提案. (4认同)

Eri*_*vic 8

另一种方法是这样做

创建文件 d3-modules.js:

export * from 'd3-request';
export * from 'd3-scale';
Run Code Online (Sandbox Code Playgroud)

然后在需要的地方导入该文件:

import * as d3 from "./d3-modules.js";
Run Code Online (Sandbox Code Playgroud)

这实际上是 d3 自己如何做的:https : //github.com/d3/d3/blob/635d44786dd4322d0c89dd98546bff91d7cce0fe/index.js