我在Ember CLI应用程序中定义了一堆模块,每个模块都以相同的路径开头。我想将模块导入应用程序中的模块。例如,我可以写:
import post1 from 'posts/1';
import post2 from 'posts/2';
import post3 from 'posts/3';
export default Em.ObjectController.extend({
posts: Em.A(post1, post2, post3),
});
但是,我不知道模块名称,因为它们是由预编译器即时创建/命名的。我所知道的是路径总是以相同的字符串开头。在这种情况下,posts
。
有没有办法导入所有以特定路径开头的模块?例如,我如何执行某些,如下所示:
import posts from 'posts/*';
// or
registry['posts'].forEach(postId, i) {
var path = 'posts/' + postId;
import i from path;
}
我想要查找和导入的每个模块都导出了一个对象。
我已浏览ES6 module transpiler个文档,但找不到多少。
答案 0 :(得分:5)
ES6规范不允许您使用import
关键字动态导入模块。使用模块语法的所有导入和导出必须静态完成。但是,它确实提供了一个可用于动态导入模块的编程API。 This article对它有一个很好的总结(以及其余ES6模块的一个很好的总结)。
我的建议是将Ember的加载器API包装在符合ES6的包装器中。例如,Ember-CLI使用require()
函数来获取模块,因此您可以执行以下操作:
window.System = window.System || {};
window.System['import'] = function(moduleName) {
return Ember.RSVP.Promise.resolve(window.require(moduleName));
}
// ...
System.import('my-app/posts/' + postNumber).then(function(postModule) {
// ...
});
您也可以直接使用Ember require()
函数,我的方式只是在Ember更改模块加载器的情况下保护您。