[javascript] ES6 모듈 가져 오기에 옵션 전달

옵션을 ES6 가져 오기로 전달할 수 있습니까?

이것을 어떻게 번역합니까?

var x = require('module')(someoptions);

ES6에?



답변

단일 import명령문으로이를 수행 할 수 있는 방법이 없으며 호출을 허용하지 않습니다.

따라서 직접 호출하지는 않지만 기본적으로 기본 내보내기에서 commonjs와 동일한 작업을 수행 할 수 있습니다.

// module.js
export default function(options) {
    return {
        // actual module
    }
}

// main.js
import m from 'module';
var x = m(someoptions);

또는 monadic promise 를 지원하는 모듈 로더를 사용하면 다음과 같은 작업을 수행 할 수 있습니다.

System.import('module').ap(someoptions).then(function(x) {
    
});

새로운으로 import운영자 가 될 수도

const promise = import('module').then(m => m(someoptions));

또는

const x = (await import('module'))(someoptions)

그러나 동적 가져 오기를 원하지 않고 정적 가져 오기를 원할 것입니다.


답변

개념

ES6을 사용하는 솔루션은 다음과 같습니다.

@Bergi의 응답과 매우 흡사 한, 이것은 class선언을 위해 전달 된 매개 변수가 필요한 가져 오기를 만들 때 사용하는 “템플릿” 입니다. 이것은 내가 쓰고 있어요 동형 프레임 워크를 사용되므로 브라우저와 Node.js를 (내가 사용에 transpiler와 함께 작동합니다 Babel함께 Webpack) :

./MyClass.js

export default (Param1, Param2) => class MyClass {
    constructor(){
        console.log( Param1 );
    }
}

./main.js

import MyClassFactory from './MyClass.js';

let MyClass = MyClassFactory('foo', 'bar');

let myInstance = new MyClass();

위는 foo콘솔에서 출력 됩니다

편집하다

실제 예

실제 예를 들어, 이것을 사용하여 프레임 워크 내의 다른 클래스와 인스턴스에 액세스하기 위해 네임 스페이스를 전달합니다. 단순히 함수를 만들고 객체를 인수로 전달하기 때문에 클래스 선언과 함께 사용할 수 있습니다.

export default (UIFramework) => class MyView extends UIFramework.Type.View {
    getModels() {
        // ...
        UIFramework.Models.getModelsForView( this._models );
        // ...
    }
}

가져 오기는 조금 더 복잡하며 automagical필자의 경우 전체 프레임 워크이므로 기본적으로 이것이 일어나고 있습니다.

// ...
getView( viewName ){
    //...
    const ViewFactory = require(viewFileLoc);
    const View = ViewFactory(this);
    return new View();
}
// ...

이게 도움이 되길 바란다!


답변

es6 을 사용하여 디버그 모듈 을 사용하는 @ Bergi의 대답 을 바탕으로 다음과 같습니다.

// original
var debug = require('debug')('http');

// ES6
import * as Debug from 'debug';
const debug = Debug('http');

// Use in your code as normal
debug('Hello World!');


답변

es6 모듈 로더를 사용할 수 있다고 생각합니다.
http://babeljs.io/docs/learn-es6/

System.import("lib/math").then(function(m) {
  m(youroptionshere);
});


답변

이 두 줄만 추가하면됩니다.

import xModule from 'module';
const x = xModule('someOptions');


답변

나는이 스레드를 다소 유사하게 찾고 적어도 어떤 경우에는 일종의 해결책을 제안하고 싶습니다 (그러나 아래의 설명 참조).

사용 사례

로드하는 즉시 인스턴스화 논리를 실행하는 모듈이 있습니다. 나는 할 수 없습니다 (호출과 동일한 모듈 외부에서이 초기화 로직 전화처럼 new SomeClass(p1, p2)또는 new ((p1, p2) => class SomeClass { ... p1 ... p2 ... })비슷하게을).

이 초기화 로직이 한 번 실행되고 일종의 단일 인스턴스화 흐름이 있지만 특정 매개 변수화 된 컨텍스트마다 한 번씩 실행되는 것을 좋아합니다 .

service.js 매우 기본적인 범위에 있습니다.

let context = null;                  // meanwhile i'm just leaving this as is
console.log('initialized in context ' + (context ? context : 'root'));

모듈 A는 다음을 수행합니다.

import * as S from 'service.js';     // console has now "initialized in context root"

모듈 B는 다음을 수행합니다.

import * as S from 'service.js';     // console stays unchanged! module's script runs only once

지금까지는 좋았습니다. 두 모듈 모두에서 서비스를 사용할 수 있지만 한 번만 초기화되었습니다.

문제

모듈 C에서 다른 인스턴스로 실행하고 다른 컨텍스트에서 다시 초기화하는 방법은 무엇입니까?

해결책?

이것이 내가 생각하는 것입니다 : 쿼리 매개 변수를 사용하십시오. 서비스에서 다음을 추가합니다.

let context = new URL(import.meta.url).searchParams.get('context');

모듈 C는 다음을 수행합니다.

import * as S from 'service.js?context=special';

모듈을 다시 가져 오면 기본 초기화 로직이 실행되고 콘솔에 표시됩니다.

initialized in context special

비고 :이 방법을 많이 연습하지 말고 최후의 수단으로 남겨 두라고 조언합니다. 왜? 모듈을 두 번 이상 가져 오면 규칙보다 예외가 발생하기 때문에 다소 예상치 못한 동작이므로 소비자를 혼동 시키거나 자체 ‘단일’패러다임이있을 수 있습니다 (있는 경우).


답변

다음은 디버그 모듈을 예로 사용하여이 질문에 대해 설명합니다.

이 모듈의 npm 페이지에는 다음이 있습니다.

var debug = require ( ‘디버그’) ( ‘http’)

위 줄에서 문자열은 가져온 모듈로 전달되어 구성됩니다. ES6에서 동일한 작업을 수행하는 방법은 다음과 같습니다.


‘debug’에서 import {디버그로 디버그} const debug = Debug ( ‘http’);


이것이 누군가를 도울 수 있기를 바랍니다.