如何有条件地导入 ES6 module?
IT技术
javascript
module
ecmascript-6
2021-01-26 16:46:25
6个回答
我们现在有 ECMA 的动态导入提案。这是在第 3 阶段。这也可以作为babel-preset 使用。
以下是根据您的情况进行条件渲染的方法。
if (condition) {
import('something')
.then((something) => {
console.log(something.something);
});
}
这基本上返回了一个Promise。Promise的决议有望有module。该提案还具有其他功能,例如多个动态导入、默认导入、js 文件导入等。您可以在此处找到有关动态导入的更多信息。
如果您愿意,可以使用 require。这是一种使用条件 require 语句的方法。
let something = null;
let other = null;
if (condition) {
something = require('something');
other = require('something').other;
}
if (something && other) {
something.doStuff();
other.doOtherStuff();
}
你不能有条件地导入,但你可以做相反的事情:有条件地导出一些东西。这取决于您的用例,因此这种解决方法可能不适合您。
你可以做:
api.js
import mockAPI from './mockAPI'
import realAPI from './realAPI'
const exportedAPI = shouldUseMock ? mockAPI : realAPI
export default exportedAPI
apiConsumer.js
import API from './api'
...
我用它来模拟 mixpanel 等分析库……因为我目前不能有多个构建或我们的前端。不是最优雅的,但有效。根据环境,我在这里和那里只有一些“如果”,因为在 mixpanel 的情况下,它需要初始化。
2020 更新
您现在可以将import
关键字作为函数(即import()
)调用以在运行时加载module。
例子:
const mymodule = await import(modulename);
或者:
import(modulename)
.then(mymodule => /* ... */);
请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Dynamic_Imports
看起来答案是,截至目前,你不能。
http://exploringjs.com/es6/ch_modules.html#sec_module-loader-api
我认为目的是尽可能地启用静态分析,而有条件地导入的module打破了这一点。另外值得一提的是——我正在使用Babel,我猜System
Babel 不支持它,因为module加载器 API 没有成为 ES6 标准。
其它你可能感兴趣的问题