ES6 가져 오기를 사용하는 동안 변수 이름을 제공하는 모듈로 무언가를 가져올 수 있습니까?
즉, 구성에 제공된 값에 따라 런타임에 일부 모듈을 가져오고 싶습니다.
import something from './utils/' + variableName;
ES6 가져 오기를 사용하는 동안 변수 이름을 제공하는 모듈로 무언가를 가져올 수 있습니까?
즉, 구성에 제공된 값에 따라 런타임에 일부 모듈을 가져오고 싶습니다.
import something from './utils/' + variableName;
답변:
import
성명서가 아닙니다 . import
그리고 export
그들은 정적 분석 가능한 것을 그들이 런타임 정보에 의존하지 수 같은 방식으로 정의된다.
loader API (polyfill)를 찾고 있지만 사양 상태에 대해 약간 불분명합니다.
System.import('./utils/' + variableName).then(function(m) {
console.log(m);
});
Felix의 답변 외에도 ECMAScript 6 문법 에서 현재 허용되지 않는다는 점을 분명히 밝힙니다 .
ImportDeclaration :
import ImportClause FromClause;
import ModuleSpecifier;
FromClause :
- 에서 ModuleSpecifier
ModuleSpecifier :
- StringLiteral
ModuleSpecifier은 단지가 될 수 StringLiteral , 같은 표현이 아닌 다른 종류의 AdditiveExpression .
const
string literal
s 를 포함하도록 확장되지 않은 것은 유감 입니다. 정적으로 분석 가능하지 않습니까? 종속성의 위치를 재사용 할 가능성이 있습니다. (예 : 템플릿을 가져오고 템플릿과 템플릿의 위치를 모두 사용할 수 있습니다).
이것은 실제로 동적 가져 오기는 아니지만 (예 : 내 상황에서 아래에서 가져 오는 모든 파일은 런타임에 선택되지 않고 웹팩에 의해 가져 와서 번들로 제공됩니다) 일부 상황에서 도움이 될 수있는 패턴은 다음과 같습니다. :
import Template1 from './Template1.js';
import Template2 from './Template2.js';
const templates = {
Template1,
Template2
};
export function getTemplate (name) {
return templates[name];
}
또는 대안으로 :
// index.js
export { default as Template1 } from './Template1';
export { default as Template2 } from './Template2';
// OtherComponent.js
import * as templates from './index.js'
...
// handy to be able to fall back to a default!
return templates[name] || templates.Template1;
require()
존재하지 않는 구성된 템플릿 경로를 가져 오려고하면 오류가 발생하는을 사용 하여 쉽게 기본값으로 돌아갈 수 있다고 생각 하지 않습니다.
require와 import 간의 좋은 예와 비교는 여기에서 찾을 수 있습니다 : http://www.2ality.com/2014/09/es6-modules-final.html
@iainastacio에서 다시 내보내기에 대한 우수한 문서 : http://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles
이 접근법에 대한 피드백을 듣고 싶습니다. :)
Object.values(templates)
.
ES 모듈에 대한 동적 가져 오기 라는 새로운 사양이 있습니다. 기본적으로 전화 만하면 import('./path/file.js')
됩니다. 함수는 가져 오기가 성공하면 모듈로 해결되는 promise를 반환합니다.
async function importModule() {
try {
const module = await import('./path/module.js');
} catch (error) {
console.error('import failed');
}
}
사용 사례에는 React, Vue 등에 대한 경로 기반 구성 요소 가져 오기 및 런타임 중에 필요한 경우 모듈 을 지연로드 하는 기능이 포함 됩니다.
다음은 Google 개발자 에 대한 설명입니다 .
MDN 에 따르면 현재 모든 주요 브라우저 (IE 제외)에서 지원되며 caniuse.com 은 전 세계 시장 점유율에서 87 %의 지원을 보여줍니다. IE 또는 non-chromium Edge에서는 다시 지원되지 않습니다.
import
Node.js의 ES6 에 대해 구체적으로 묻는 질문을 이해 하지만 다음은 더 일반적인 솔루션을 찾는 다른 사람들에게 도움이 될 수 있습니다.
let variableName = "es5.js";
const something = require(`./utils/${variableName}`);
ES6 모듈을 가져 오는 중이고default
내보내기 에 액세스 해야하는 경우 다음 중 하나를 사용해야합니다.
let variableName = "es6.js";
// Assigning
const defaultMethod = require(`./utils/${variableName}`).default;
// Accessing
const something = require(`./utils/${variableName}`);
something.default();
다른 가져 오기에 더 많은 구문 친숙성을 추가 할 수있는이 접근 방식으로 구조 해제를 사용할 수도 있습니다.
// Destructuring
const { someMethod } = require(`./utils/${variableName}`);
someMethod();
안타깝게도 액세스 default
및 구조 해제를 원할 경우 여러 단계로이 작업을 수행해야합니다.
// ES6 Syntax
Import defaultMethod, { someMethod } from "const-path.js";
// Destructuring + default assignment
const something = require(`./utils/${variableName}`);
const defaultMethod = something.default;
const { someMethod, someOtherMethod } = something;
덜이 같은 문법 I,하지만 작동 :
대신 작성
import memberName from "path" + "fileName";
// this will not work!, since "path" + "fileName" need to be string literal
다음 구문을 사용하십시오.
let memberName = require("path" + "fileName");
require()
초기 버전 인 파일을로드하는 Node.JS 메소드입니다. import
statement는 이제 공식 언어 구문의 일부인 최신 버전입니다. 그러나 대부분의 경우 브라우저는 이전 브라우저를 사용합니다 (과학 뒤에). require 문은 또한 파일을 현금화하므로 파일이 두 번째로로드되면 메모리에서로드됩니다 (성능 향상). WebPack을 사용하는 경우 가져 오기 방식에는 고유 한 이점이 있습니다. 그러면 웹팩이 죽은 참조를 제거 할 수 있습니다 (이 스크립트는 클라이언트에 다운로드되지 않습니다).
동적 import () (Chrome 63 이상에서 사용 가능)가 작업을 수행합니다. 방법은 다음과 같습니다.
let variableName = 'test.js';
let utilsPath = './utils/' + variableName;
import(utilsPath).then((module) => { module.something(); });