[英]Conditional import with ES Module ( fetch / node-fetch )
我正在编写一个 JS 代码,它可以用于Node
应用程序或JavaScript
web 浏览器应用程序。
从 Node 17.5 开始,现在可以使用来自 JavaScript 的本机fetch API
API。
我想知道是否有一种方法可以为 ES Module 使用一种条件导入,如下所示:
if fetch exist => use fetch
else import fetch from node-fetch
我试过这样的事情:
if(!fetch) {
import fetch from 'node-fetch'
}
...
fetch(url).then(res => ...)
...
但它会引发错误,因为fetch is undefined
。 注意:我使用节点进行了测试
有人有解决我问题的想法吗?
回答:
感谢@Positivity 的回答,找到了解决方案:
let fetcher = fetch ?? await import('node-fetch');
然后我使用fetcher
作为 fetch。
如果我重命名变量以fetch
它,则会引发错误:
Cannot access 'fetch' before initialization
Finnaly 找到了解决此错误的方法:
if(!fetch) {
const fetch = await import('node-fetch');
}
// else => fetch is already declared
import() 调用,通常称为动态导入,是一个类似函数的表达式,它允许将 ECMAScript 模块异步动态加载到潜在的非模块环境中。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/import
所以这应该对支持的节点版本进行有条件的导入:
let fetch = fetch ?? await import('node-fetch')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.