Javascript 如何在ES6样式的导入中有条件地使用内置Node.js或浏览器API方法?
示例上下文 我正在编写一个基于从本机源获取加密安全随机字节的库。我想使lib在Node.js和浏览器中都可用。这需要在两个环境中使用不同的内置API 问题 我正在寻找通用的解决方案Javascript 如何在ES6样式的导入中有条件地使用内置Node.js或浏览器API方法?,javascript,node.js,Javascript,Node.js,示例上下文 我正在编写一个基于从本机源获取加密安全随机字节的库。我想使lib在Node.js和浏览器中都可用。这需要在两个环境中使用不同的内置API 问题 我正在寻找通用的解决方案 带有ES6风格导入的Node.js API方法 或浏览器API方法 基于环境检测 应用于上述示例上下文的问题 为了使库在Node.js和浏览器环境中都可用,Node.js中使用了crypto.randomBytes(),浏览器中使用了window.crypto.getRandomValues()作为随机源的基础 当前
crypto.randomBytes()
,浏览器中使用了window.crypto.getRandomValues()
作为随机源的基础
当前工作的解决方案基于节点的动态要求
。lib检测环境,然后:
- 在Node.js中,它使用
require('crypto')
- 在浏览器中,它使用
,这在全局范围内很简单,不需要任何东西/导入任何东西window.crypto.getRandomValues()
require()
,我想知道是否可以使用ES6风格的import{randomFill}从'crypto'导入代码>带有环境检测。导入仍将在浏览器中运行,但浏览器中没有此类内置模块,因此这将是一个问题
您是否有过Transpiler(如babel)和Bundler(如rollup)如何处理静态导入的此类问题的经验
注意:这不是的副本。我知道有ESM和--实验模块
,而且运行良好。我的问题涉及浏览器和Node.js环境都是实现目标的情况,但由于环境不同,必须使用不同的平台提供的API。我不确定这是否回答了您的问题,但我解决这一问题的方法基本上是通过我的网页构建
我可能会有一个类似的导入:
import { base64encode } from './base64';
在此目录中,我有2个文件:
base64.js
base64.web.js
可以将webpack配置为首选第二个而不是第一个。其他浏览器构建工具也有类似的功能
这对我来说非常有效,但只有在您有“构建步骤”的情况下,这才是一个真正的选项。可能重复我认为不可能执行有条件的es6导入。。。“但也许现在有办法了?”阿尔法辛谢谢你的回答。这不是那个问题的重复。我编辑了我的并解释了原因。刚刚发现有动态ESM导入,但它们不是同步的。使用require
或导入具有统一接口的模块,该接口本身会根据环境进行替换。这是正确的方法。不要执行环境检测和动态模块导入,但是让模块加载程序/绑定程序适当地解析加密
导入。