옵션을 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’);
이것이 누군가를 도울 수 있기를 바랍니다.