在Ember CLI中导入动态模块

Dun*_*ker 4 ember.js ecmascript-6 ember-cli

我在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),
});
Run Code Online (Sandbox Code Playgroud)

但是,我不知道模块名称,因为它们是由预编译器即时创建/命名的.我所知道的是路径总是以相同的字符串开头.在这种情况下,posts.

有没有办法导入以特定路径开头的所有模块?例如,我该怎么办的东西像下面这样:

import posts from 'posts/*';

// or

registry['posts'].forEach(postId, i) {
  var path = 'posts/' + postId;

  import i from path;
}
Run Code Online (Sandbox Code Playgroud)

我想要查找和导入的每个模块都导出了一个对象.

我已经通过ES6模块转换器文档,但找不到多少.

GJK*_*GJK 5

ES6规范不允许您使用import关键字动态导入模块.使用模块语法的所有导入和导出必须静态完成.但是,它确实提供了一个可用于动态导入模块的编程API.本文对它有一个很好的总结(以及其余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) {
    // ...
});
Run Code Online (Sandbox Code Playgroud)

您也可以require()直接使用Ember 功能,我的方式只是在Ember更改模块加载器的情况下保护您.