繁体   English   中英

使用 ES 模块进行条件导入( fetch / node-fetch )

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM