javascript - 如何使用条件导入编写在浏览器和 Node 中都可以使用的 ESM 模块

标签 javascript node.js es6-modules commonjs

我有一个应该在浏览器和 Node 中运行的代码库。它需要根据它是在 Node 还是浏览器中运行来切换一些功能。
以前我以 CommonJS 格式编写模块。我有一个“shim”模块,我会在其中测试环境的功能,并基于此导出内容。所以所有条件行为都包含在这个 shim 文件中。
现在,我尝试创建“shim”ESM 模块。我不知道怎么做。某些切换行为取决于检查是否存在其他 ESM 模块。但是您只能在异步的动态 ESM 导入中进行这样的测试。因为export语句必须在顶层,我无法导出结果,除非顶层等待可用。但这在浏览器中不可用。
在我当前的 hack 中,我导出了一个类似延迟的对象,并且 await它在需要的地方。但这使我的很多不必要的包裹在 (async()=>{...}) 中。 .
那么我该怎么做呢?
我宁愿不使用捆绑器,我的浏览器目标保证是相当新的。

最佳答案

使用 performance.now() 获取模块时遇到类似问题在 Node 和浏览器中工作。
这有效:

const P = typeof performance !== 'undefined' ? performance
  : (await import('perf_hooks')).performance
顶级等待挽救了这一天,但是:
  • 截至目前,仅适用于 chrome、node 和 firefox canary
  • 正式地,仍然只是第 3 阶段的提案
  • 关于javascript - 如何使用条件导入编写在浏览器和 Node 中都可以使用的 ESM 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63801223/

    相关文章:

    node.js - 如何使用 Mocha 测试集群 Express 应用程序?

    javascript - 我在 Vue.js 项目中作为模块导入导入的图像时遇到问题

    javascript - 使用 Next.js 中的 getStaticProps 对公共(public)文件夹中的静态图像进行编码

    javascript - 捕获自动更改元素的属性更改

    javascript - 在表单中按回车键时 Kube 模态关闭

    javascript - 损坏的 Javascript 代码

    node.js - Fortran 中的生成进程

    python - 在Electron中执行Unix可执行文件(python)

    Webpack 运行时条件模块解析

    node.js - 将代码转换为 ES6 Discord.js 时出现问题