节点中的 ES6 变量导入名称.js?

2022-08-30 04:35:08

是否可以在使用ES6导入时将某些内容导入到提供变量名称的模块中?

即,我想根据配置中提供的值在运行时导入一些模块:

import something from './utils/' + variableName;

答案 1

不是用语句。 并且以静态可分析的方式进行定义,因此它们不能依赖于运行时信息。importimportexport

您正在寻找加载程序API(polyfill),但我对规范的状态有点不清楚:

System.import('./utils/' + variableName).then(function(m) {
  console.log(m);
});

答案 2

虽然这实际上不是动态导入(例如,在我的情况下,我在下面导入的所有文件都将由webpack导入和捆绑,而不是在运行时选择),但我一直在使用的模式在某些情况下可能会有所帮助:

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()

可以在此处找到需求和导入之间的良好示例和比较:http://www.2ality.com/2014/09/es6-modules-final.html

关于从@iainastacio再出口的优秀文件:http://exploringjs.com/es6/ch_modules.html#sec_all-exporting-styles

我很想听听关于这种方法的反馈:)