gpt4 book ai didi

javascript - 如何有条件地使用带有 ES6 样式导入的内置 Node.js 或浏览器 API 方法?

转载 作者:行者123 更新时间:2023-11-30 13:59:28 27 4
gpt4 key购买 nike

示例上下文

我正在编写一个基于从 native 源获取加密安全随机字节的库。我想让这个库在 Node.js 和浏览器中都可用。这需要在两个环境中使用不同的内置 API。

问题

我正在寻找要使用的通用解决方案

  1. 带有 ES6 风格导入的 Node.js API 方法
  2. 或浏览器 API 方法,

基于环境检测。

应用于上述示例上下文的问题

为了使库在 Node.js 和浏览器环境中都可用,crypto.randomBytes() 在 Node.js 中使用,并且 window.crypto.getRandomValues() 在浏览器中用作随机源的基础。

当前有效的解决方案是基于 Node 的动态 require。 lib检测环境,然后:

  • 在 Node.js 中,它使用 require('crypto'),
  • 在浏览器中,它使用 window.crypto.getRandomValues(),它在全局范围内简单可用,不需要/导入任何内容。

问题

我想知道是否可以使用 ES6 风格的 import { randomFill } from 'crypto'; 进行环境检测,而不是使用 require()。导入仍然会在浏览器中运行,但是浏览器中没有这样的内置模块,所以这是一个问题。

您是否有过转译器(如 babel)和打包器(如 rollup)如何处理此类静态导入问题的经验?


注意:这不是 How can I use an es6 import in node? 的副本.我知道有 ESM 和 --experimental-modules,而且效果很好。我的问题是关于浏览器和 Node.js 环境都是实现目标的情况,但由于环境不同,必须使用不同平台提供的 API。

最佳答案

我不确定这是否回答了你的问题,但我解决这个问题的方法基本上是通过我的 webpack 构建。

我可能有一个导入有点像:

import { base64encode } from './base64';

在这个目录中我有 2 个文件:

base64.js
base64.web.js

可以将 webpack 配置为更喜欢第二个而不是第一个。其他浏览器构建工具也有类似的功能。

这对我来说非常有效,但如果您有“构建步骤”,这只是一个真正的选择。

关于javascript - 如何有条件地使用带有 ES6 样式导入的内置 Node.js 或浏览器 API 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56604547/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com