Modules es2015 – comment nommer les exportations dynamiquement

Dans cet exemple, le react-hyperscript est curry et expose un ensemble de fonctions par défaut, donc h('div', props, children) devient div(props, children) .

 import hyperscript from 'react-hyperscript'; import {curry} from 'lodash'; const isString = v => typeof v === 'string' && v.length > 0; const isSelector = v => isString(v) && (v[0] === '.' || v[0] === '#'); const h = curry( (tagName, first, ...rest) => isString(tagName) && isSelector(first) ? hyperscript(tagName + first, ...rest) : hyperscript(tagName, first, ...rest) ); const TAG_NAMES = [ 'a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', // ... ]; TAG_NAMES.forEach(tagName => Object.defineProperty(h, tagName, { value: h(tagName), writable: false, }) ); export default h; 

Dans un autre module:

 import h, {div} from 'lib/h'; console.log( h, // h div, // undefined <- problem! h('div'), // div h.div // div ) 

Cela peut être résolu en ajoutant ceci à l'exemple (zip from lodash):

 const { a, abbr, address, area, // ... } = zip( TAG_NAMES, TAG_NAMES.map(h) ) export { a, abbr, address, area, // ... } 

Mais cette solution n'est pas très élégante, est-ce que quelqu'un connaît une meilleure alternative?

Comment nommer les exportations dynamiquement

Vous ne pouvez pas. import déclarations d' import et d' export sont spécifiquement conçues de cette façon car elles doivent être analytiquement statiques, c'est-à-dire que les noms d'importation et d'exportation doivent être connus avant l'exécution du code.

Si vous avez besoin de quelque chose de dynamique, faites ce que vous faites déjà: Exportez une "carte" (ou objet). Les gens peuvent encore utiliser la déstructuration pour obtenir ce qu'ils veulent:

 const {div} = h;