javascript - 如何使用条件导入编写在浏览器和 Node 中都可以使用的 ESM 模块
问题描述
我有一个应该在浏览器和节点中运行的代码库。它需要根据它是在节点还是浏览器中运行来切换一些功能。
以前我以 CommonJS 格式编写模块。我有一个“shim”模块,我可以在其中测试环境的特性,并基于它导出东西。所以所有条件行为都包含在这个 shim 文件中。
现在,我尝试创建“shim”ESM 模块。我不知道怎么做。某些切换行为取决于检查是否存在其他 ESM 模块。但是您只能在异步的动态 ESM 导入中进行这样的测试。而且因为export
语句必须在顶层,所以我无法导出结果,除非顶层 await 可用。但这在浏览器中不可用。
在我当前的 hack 中,我导出了一个类似延迟的对象,并await
在需要的地方导出。但是这让我的很多不必要的包裹在了(async()=>{...})
。
那么我该怎么做呢?
我宁愿不使用捆绑器,我的浏览器目标保证是相当新的。
解决方案
有一个类似的问题是让一个模块performance.now()
用于在节点和浏览器中工作。
这有效:
const P = typeof performance !== 'undefined' ? performance
: (await import('perf_hooks')).performance
顶级等待挽救了这一天,但是:
- 截至目前,仅适用于 chrome、node 和 firefox canary
- 正式地,仍然只是第 3 阶段的提案
推荐阅读
- java - 您可以在您获取()的不同线程上调用 java.util.concurrent.Semaphore.release() 吗?
- javascript - slick 在滑块的末尾有空幻灯片
- google-cloud-platform - Docker 日志驱动程序 gcplogs:如何格式化日志以便它们在 Stackdriver 中正确显示?
- x509certificate - TLS 客户端如何处理中间证书的两个副本
- .htaccess - 带有动态 GET 参数的 410 重定向 url
- azure - 什么时候创建物理分区?
- phpdocx - 如何使用 php jquery 创建 docx 文件
- python-3.x - 通过 corpora.csvcorpus 在 gensim LDA 中输入 CSV
- python - 使用 login_required 对烧瓶应用程序进行单元测试
- linux - 我在将 mod_ssl 安装到我的 AWS Apache 实例时遇到问题