node.js의 ES6 변수 가져 오기 이름?
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 .
이것은 실제로 동적 가져 오기는 아니지만 (예 : 내 상황에서 아래에서 가져 오는 모든 파일은 런타임에 선택되지 않고 웹팩에 의해 가져 와서 번들로 제공됩니다) 일부 상황에서 도움이 될 수있는 패턴은 다음과 같습니다. :
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()
존재하지 않는 구성된 템플릿 경로를 가져 오려고하면 오류가 발생하는을 사용 하여 쉽게 기본값으로 돌아갈 수 있다고 생각 하지 않습니다.
Good examples and comparisons between require and import can be found here: http://www.2ality.com/2014/09/es6-modules-final.html
Excellent documentation on re-exporting from @iainastacio: http://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles
I'm interested to hear feedback on this approach :)
There is a new specification which is called a dynamic import for ES modules. Basically, you just call import('./path/file.js')
and your good to go. The function returns a promise, which resolves with the module if the import was successful.
async function import() {
try {
const module = await import('./path/module.js');
} catch (error) {
console.error('import failed');
}
}
Use cases
Use-cases include route based component importing for React, Vue etc and the ability to lazy load modules, once they are required during runtime.
Further Information
Here's is an explanation on Google Developers.
Browser compatibility
According to MDN it is supported by every current chromium browser and in Firefox 66 behind a flag.
you can use the non-ES6 notation to do that. this is what worked for me:
let myModule = null;
if (needsToLoadModule) {
myModule = require('my-module').default;
}
I less like this syntax, but it work:
instead of writing
import memberName from "path" + "fileName";
// this will not work!, since "path" + "fileName" need to be string literal
use this syntax:
let memberName = require("path" + "fileName");
I understand the question specifically asked for ES6 import
in Node.js, but the following might help others looking for a more generic solution:
let variableName = "es5.js";
const something = require(`./utils/${variableName}`);
Note if you're importing an ES6 module and need to access the default
export, you will need to use one of the following:
let variableName = "es6.js";
// Assigning
const defaultMethod = require(`./utils/${variableName}`).default;
// Accessing
const something = require(`./utils/${variableName}`);
something.default();
You can also use destructuring with this approach which may add more syntax familiarity with your other imports:
// Destructuring
const { someMethod } = require(`./utils/${variableName}`);
someMethod();
Unfortunately, if you want to access default
as well as destructuring, you will need to perform this in multiple steps:
// 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 would do it like this
function load(filePath) {
return () => System.import(`${filePath}.js`);
// Note: Change .js to your file extension
}
let A = load('./utils/' + variableName)
// Now you can use A in your module
Dynamic import() (available in Chrome 63+) will do your job. Here's how:
let variableName = 'test.js';
let utilsPath = './utils/' + variableName;
import(utilsPath).then((module) => { module.something(); });
참고URL : https://stackoverflow.com/questions/29168433/es6-variable-import-name-in-node-js
'programing tip' 카테고리의 다른 글
CasperJS에서 'Then'은 실제로 무엇을 의미합니까? (0) | 2020.08.24 |
---|---|
std :: queue :: pop이 값을 반환하지 않는 이유는 무엇입니까? (0) | 2020.08.24 |
"2016-02-16"이 "2016-02-16 00:00"과 같지 않은 이유는 무엇입니까? (0) | 2020.08.24 |
Haskell printf는 어떻게 작동합니까? (0) | 2020.08.24 |
Javascript 웹 앱 및 Java 서버, Maven에서 모두 빌드하거나 웹 앱용 Grunt를 사용 하시겠습니까? (0) | 2020.08.24 |