2017-03-19 1 views
1

ES6에서 서버 측 (Babel을 사용하는 node.js)에서 클래스의 동적 가져 오기를 수행하는 방법을 파악하려고합니다. Java에서 리플렉션이 제공하는 것과 유사한 기능을 일부 갖고 싶습니다. 아이디어는 특정 폴더의 모든 클래스를 가져 와서 동적으로 인스턴스화하는 것입니다.ES6 동적 가져 오기 및 클래스의 인스턴스화

그래서 예를 들어 여러 개의 클래스는 아래와 같은 폴더에 선언 할 수 :

export default class MyClass { 

    constructor(somevar) { 
     this._somevar = somevar 
    } 

    //... 
    //some more instance level functions here 
} 

후 다른 곳에서 내 응용 프로그램의 코드에서 나는 특정의 모든 클래스를 알게하는 기능을 가질 수 폴더에 넣고 인스턴스화하려고 시도합니다.

//somewhere else in my app 
instanciationFunction(){ 

    //find all the classes in a specific folder 
    var classFiles = glob.sync(p + '/path_to_classes/**/*.js', { 
     nodir: true 
    }); 

    _.each(classFiles, async function (file) { 
     console.log(file); 

     var TheClass = import(file); 
     var instance = new TheClass(); 

     //and then do whatever I want with that new instance 

    }); 
} 

나는 이것을 요구했지만 오류가 발생했습니다. 분명히 생성자는 찾을 수 없습니다.

모든 아이디어는 크게 감사하겠습니다.

감사

+1

동적 가져 오기는 거의 ES6'import'을 위해 설계되었습니다 무엇의 반대입니다. – lonesomeday

+0

그럼 내가 가지고있는 해결책은 무엇입니까? – azpublic

+0

두 번째 발췌 문장에서 사용하고있는'import' 함수는 무엇입니까? – Bergi

답변

1

ES 모듈 정의를 선언적이며, 전류 방향 도구 복용 waaay 실행되는 코드의 전 (정적 분석을 통해) 종속성 파싱 동안 결정되는 경로이다. 이것은 역동적이고 조건부적인 수입이 상기 경로를 거스르는 것을 의미합니다. require을 실행하면 가져 오기가 실행 중에 결정되는 노드와 비슷하지 않습니다.

동적 런타임 임포트를 원하면 SystemJS을 고려하십시오. RequireJS에 익숙하다면 동일한 개념을 취하지 만 ES6을 포함하여 multiple module formats으로 확장됩니다. 그것은 당신이 원하는 것을하는 것처럼 보인 SystemJS.import을 가지고 있으며, 현재 당신이하고있는 경로 해상도를 처리합니다.

또는 초과 코드를 제거하려는 경우 Rollup을 사용해보십시오. 그것은 당신을 위해 코드를 분석하고 실제로 사용되는 코드만을 포함 할 것입니다. 이렇게하면 조건부 로딩을 수동으로 수행 할 필요가 없습니다.

1

당신은 (- 노드가 사용 을 필요로 고정 수입을 그 문제에 대해, 어느 쪽도있다)가 아직 노드의 일부가 아니기 때문에, 바벨과 전처리 필요가 없습니다.

https://github.com/airbnb/babel-plugin-dynamic-import-node

단계 :

사전

npm i -D babel-cli 또는 npm i -D babel

npm i -D babel-plugin-dynamic-import-node

.babelrc,
{ 
    "plugins": ["dynamic-import-node"] 
} 
준비 완료!

babel-node test_import.js 바벨-CLI에 대한, 또는 원시 바벨을 위해 :

(편집) 패키지로 제공된다.JSON
"scripts": { 
    "pretest": "babel test_imports.js -o dist/test_imports.js", 
    "test": "node dist/test_imports.js" 
//... 
B

node test