在Ember CLI中导入动态模块

时间:2014-11-04 05:00:28

标签: ember.js ember-cli ecmascript-6

我在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个文档,但找不到多少。

1 个答案:

答案 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更改模块加载器的情况下保护您。