2014-11-04 1 views
4

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), 
}); 

그러나, 나는 모듈 이름을 알고하지 않습니다. 내가 아는 것은 경로가 항상 같은 문자열로 시작한다는 것입니다. 이 경우 posts입니다.

특정 경로로 시작하는 모든 모듈을 가져 오는 방법이 있습니까? 예를 들어, 내가 어떻게 다음과 같은 뭔가 수행 할 수 있습니다 내가 찾으려는 모듈의

import posts from 'posts/*'; 

// or 

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

    import i from path; 
} 

각을 가져 오는 객체를 수출하고있다.

나는 ES6 module transpiler 문서를 보았지만 많이 찾을 수 없습니다.

+0

'precompiler'는 정확히 무엇을 의미합니까 ?? ember-cli 프리 컴파일러 ??? – thecodejack

+0

'Precompiler'는 트리를 조작하고 특정 파일 확장자에 대한 ES6 모듈로 javacript 오브젝트를 추가하는 ember 애드온으로 작성된 템플리트 프리 컴파일러를 의미합니다. –

답변

5

ES6 사양에서는 import 키워드를 사용하여 모듈을 동적으로 가져올 수 없습니다. 모듈 구문을 사용하여 모든 가져 오기 및 내보내기를 정적으로 수행해야합니다. 그러나 모듈을 동적으로 가져 오는 데 사용할 수있는 프로그래밍 API를 제공합니다. This article에는 ES6 모듈의 나머지 부분에 대한 훌륭한 요약 정보가 요약되어 있습니다.

제 제안은 ESber 호환 래퍼에서 Ember 's 로더 API를 래핑하는 것입니다. 예를 들어, 엠버 - CLI는이 같은 것을 할 수 있도록 모듈을 얻기 위해 require() 함수를 사용하여 내 방법은 단지 가능성이 이벤트는 점에서 당신을 보호, 또한 직접 엠버 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) { 
    // ... 
}); 

를 엠버 모듈 로더를 변경합니다.

+0

답변 주셔서 감사합니다. 그러나 어쨌든 가져 오기에 사용 가능한 모듈이 무엇인지 알고 계십니까? 귀하의 예제에서 나는'postNumber'에 가능한 옵션이 무엇인지 알지 못합니다. –

+1

나는 내 자신의 질문에 대답했습니다 : for (var module in window.require.entries) {}'. –