在node.js ES6variables导入名称?
是否有可能在使用ES6导入时将某些东西导入到提供variables名称的模块中?
也就是说,我想在运行时导入一些模块,具体取决于configuration中提供的值:
import something from './utils/' + variableName;
不与import
声明。 import
和export
是以静态可分析的方式定义的,所以它们不能依赖运行时信息。
你正在寻找加载器API(polyfill) ,但是我对规范的状态有点不清楚:
System.import('./utils/' + variableName).then(function(m) { console.log(m); });
除了Felix的回答 ,我会明确地注意到ECMAScript 6语法目前不允许这样做:
导入声明 :
导入 ImportClause FromClause;
导入 ModuleSpecifier;
FromClause :
- 来自 ModuleSpecifier
ModuleSpecifier :
- string字面量
一个ModuleSpecifier只能是一个StringLiteral ,而不能像AdditiveExpression这样的其他types的expression式。
虽然这实际上不是一个dynamic导入(例如,在我的情况下,下面导入的所有文件都将被导入并绑定到webpack,而不是在运行时select),我一直在使用的模式可能有助于某些情况:
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;
如果我尝试导入一个不存在的构造的模板path,我不认为我可以像require()
那样简单地回退到默认值。
要求和导入之间的好例子和比较可以在这里find: http : //www.2ality.com/2014/09/es6-modules-final.html
有关从@iainastacio重新导出的出色文档: http ://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles
我很想听到关于这个方法的反馈:)
您可以使用非ES6表示法来做到这一点。 这是什么对我有用:
let myModule = null; if (needsToLoadModule) { myModule = require('my-module').default; }
我不喜欢这个语法,但它的工作:
而不是写作
import memberName from "path" + "fileName"; // this will not work!, since "path" + "fileName" need to be string literal
使用这个语法:
let memberName = require("path" + "fileName");
我会这样做
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
使用ES6模板string我成功地导入了dynamicvariables,这里是我的样板 – 这是关于通用JavaScript,但它应该在不同的configuration上工作:
const myImg = './cute.jpg' <img src={require(`${myImg}`)} />