【发布时间】:2016-08-25 13:13:20
【问题描述】:
例如。
我们有几个 ES6 模块导入,比如:
import Module1 from './module_1';
import Module2 from './module_2';
我正在使用Babel 将 ES6 转译为 ES5
有另一个函数,它给定一个字符串,返回对导入的 ES6 模块的引用:
getModule(name) {
switch(name) {
case "Module 1":
return Module1;
case "Module 2":
return Module2;
default:
return null;
}
}
命名约定非常简单且一致 那么如何去掉手动switch语句呢?
最初我认为,我们可以摆脱使用 eval。类似:
getModule(name) {
// removes spaces. so "Module 1" to "Module1"
const ref = name.replace(/\s+/g, "");
return eval(ref);
}
但是 Babel 改变了变量名等 还把我脚下的地毯扯掉了。
只是为了演示一个未转译的示例适用于:
var foo = function() { console.log("called foo") }
var bar = function() { console.log("called bar") }
eval("foo")() // logs "called foo"
eval("nope") // throws ReferenceError: Can't find variable: nope
是否可以在名为localImports 的文件中获取导入的哈希值?
这样我们就可以写:
getModule(name) {
// removes spaces. so "Module 1" to "Module1"
const ref = name.replace(/\s+/g, "");
return localImports[ref];
}
如何使用 ES6 和 Babel 实现这样的功能?
另外作为奖励,是否可以不使用 eval ?
【问题讨论】:
-
你能给出你想要这样做的用例吗?
-
@torazaburo 正在使用 react 根据用户输入渲染组件。输入和组件名称具有直接映射。我正在使用
getModule之类的方法来决定要渲染哪个组件。想利用输入模式,以提高表现力,并确保在 big-ish switch 语句中不存在拼写错误。 -
首先想到的是进行中间再导出,如
export Module1 from '/module1'; export Module2 from './module2';。然后将它们导入为import * as Modules from './reexports';。现在您可以将您的模块称为Modules[module_name]。 -
@torazaburo 不错。它自包含在一个单独的文件中,无需手动创建哈希。虽然与stackoverflow.com/questions/39146339/… 有相同的评论。想要从模块引用(例如 Module1)和文件名“module1”自动创建映射。
-
如果我理解你想要做什么,我认为你不能不访问加载器的内部。
标签: ecmascript-6 babeljs