2016-05-16 30 views
7

Molte librerie JavaScript moderne si aggiornano da monoliti a pacchetti npm modularizzati; un paio di esempi sono lodash e d3.È possibile unire o nidificare le importazioni ES6?

Questo è ottimo in termini di riduzione delle dimensioni di build, ma rende un po 'imbarazzante con le importazioni. Quando si carica l'intera libreria, scrivo:

import d3 from 'd3'; 

let csv = d3.csv()... 
let xScale = d3.scale()... 

Quando si caricano singoli moduli invece che l'intero pacchetto, scrivo:

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

let csv = d3_request.csv()... 
let xScale = d3.scale.scaleLinear()... 

C'è una sintassi che mi permettesse di fondere le mie importazioni così ho può effettuare tutte le chiamate di funzione da ogni pacchetto di un singolo oggetto (ad es. d3.csv(), d3.scaleLinear())?

+0

Cosa si otterrebbe se li avessero tutti sullo stesso oggetto? Mantenere separate le cose indipendenti è una specie di punto. – loganfsmyth

+0

Perché "* devi scrivere ... *"? Puoi importare l'intero pacchetto – Amit

+0

@Amit come ho spiegato nella mia domanda, non voglio importare tutto di 'd3' perché è un pacchetto di grandi dimensioni e posso mantenere le dimensioni della mia build solo importandone solo un sottoinsieme. – ericsoco

risposta

5

Mentre stavo scrivendo la domanda ho capito la risposta. Self-gomma ducking.

Il spread operator sembra abbastanza decente qui:

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()... 
}); 
+0

È possibile formattare meglio questo? Cosa c'è nella doppia barra? – Ringo

+4

È 'const d3 = Object.assign ({}, d3_request, d3_scale)'. In ES6 gli spread sono per iterables e gli oggetti non sono quelli. [Object spreads] (https://github.com/sebmarkbage/ecmascript-rest-spread) è la proposta della fase 2. – estus

+0

@estus Va bene, non sto cercando una risposta specifica per ES6, sto cercando una risposta che funzioni nella mia pipeline di build (Babel.js). Quindi le opzioni ES7 funzionano per me. Ma per favore sentitevi liberi di scriverlo come una risposta separata e io inviterò. – ericsoco