dynamic引用静态ESNext导入

说我有这些import:

import clearLineReporter from '../modules/clear-line-reporter'; import karmaReporter from '../modules/karma-reporter'; import metaTestReporter from '../modules/meta-test-reporter'; import stdReporter from '../modules/std-reporter'; import tapJSONReporter from '../modules/tap-json-reporter'; import tapReporter from '../modules/tap-reporter'; import webSocketReporter from '../modules/websocket-reporter'; 

这些必须像我上面做的那样引用,换句话说,我显然不能这样做:

 const imports = { stdReporter: import(...), tapJSONReporter: import(...), ... webSocketReporter: import(...) } 

有什么办法可以通过某种forms的reflection来引用导入的文件吗? 因为好像我不能把他们分组在一起,以某种方式引用他们。

我可以使用require() ,而不是import语法,但是我想知道是否有某种方法可以用import语句做一些dynamic的事情,比如dynamic地引用它们,例如,如果我添加或删除一个import,不必更改任何其他代码。

有什么办法可以通过某种forms的reflection来引用导入的文件吗?

答案依赖于环境,意味着在查询中,因为import语句可以是ES本地模块在浏览器中的实现,或者babel -ed在node.js要求语句,或者在webpack编译时parsing的绑定。

所以,在每种情况下都有解决scheme来做一些反思。 在使用babel -ed代码import node.js中,只require包装器,因此任何信息都可用。

在具有本地ES模块的浏览器中,所有对它们的请求都可以通过ServiceWorker提供,因此可以提供有关获取的ES模块的必要信息。 在浏览器ES模块中也可以这样dynamic导入: https : //matthewphillips.info/posts/loading-app-with-script-module

最有趣的部分是webpack :编译时parsing和半reflection可以通过function风格的externalsparsing器( https://webpack.js.org/configuration/externals/#function )和运行时加载模块API( https ://webpack.js.org/api/module-variables/#webpack_modules -webpack-specific- )

这个问题有一个很好的答案,我通过提出一个不同的问题发现,在这里:

使用TypeScript将导入导出为名称空间

例如,创build一个文件名grouped-modules.ts ,你只需要简单地列出模块并导出每个模块。

 export {default as clearLineReporter} from '../modules/clear-line-reporter'; export {default as karmaReporter} from '../modules/karma-reporter'; export {default as metaTestReporter} from '../modules/meta-test-reporter'; ... export {default as stdReporter} from '../modules/std-reporter'; export {default as tapJSONReporter} from '../modules/tap-json-reporter'; 

然后在你的模块中,你可以做:

 import * as mods from './grouped-modules' export {mods} 

它将在名为s的名称空间中导出types和值。 您可以使用以下方式导入它们:

 import {mods} from 'your-module' const anObject: mods.clearLineReporter = ...; 

这使您可以将您的模块dynamic分组到一个variables中。