如何在ES6风格的导入中有条件地使用内置的Node.js或浏览器API方法?

索玛·卢兹(Soma Lucz)

示例上下文

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

问题

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

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

基于环境检测。

该问题适用于以上示例上下文

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

当前工作的解决方案基于Node的dynamic requirelib检测到环境,然后:

  • 在Node.js中,它使用require('crypto')
  • 在浏览器中,它使用window.crypto.getRandomValues(),在全局范围内只是可用,而无需/不需要导入。

问题

而不是使用require(),我想知道是否可以将ES6样式import { randomFill } from 'crypto';与环境检测一起使用。导入仍将在浏览器中运行,但是浏览器中没有这样的内置模块,因此会出现问题。

您是否有任何经验(例如babel)和捆绑器(例如汇总)如何处理静态导入的此类问题?


注意:这不是如何在节点中使用es6导入的重复项我知道有ESM和--experimental-modules,并且效果很好。我的问题是关于浏览器和Node.js环境都是实现的目标的情况,但是由于环境不同,必须使用不同的平台提供的API。

翻转

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

我可能会有点像导入:

import { base64encode } from './base64';

在此目录中,我有2个文件:

base64.js
base64.web.js

可以将webpack配置为首选第一个。其他浏览器构建工具也具有类似的功能。

这对我来说确实很好,但是只有在有“构建步骤”的情况下,这才是真正的选择。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在反应路由器中有条件地导入组件

如何在有条件的js中有条件地应用标题

ES6中有条件分配常量的最佳方法是什么?

从浏览器(使用Express)在Node js中调用方法

使用js加密框架或浏览器的Web加密API?

在现代浏览器中有条件地定义函数?Esp Safari?

如何在反应组件中有条件地渲染加载器微调器?

Node.js在Express 4中有条件地使用csurf

如何在laravel 5中有条件地更改邮件运输器?

如何在bazel中有条件地指定C编译器定义?

如何在 Vue.js 中有条件地渲染元素?

如何在vue js中有条件地启用按钮

如何在React.JS中有条件地添加路由?

如何在php中有条件地链接方法?

是否可以在Vue.js中有条件地导入CSS文件?

是否有 es6 方法来创建数组并有条件地将项目推入其中?

没有浏览器的quickbooks API

如何在Go HTTP服务器中有条件地设置HTTP状态代码?

如何在Ag-Grid中有条件地启用/禁用单元格渲染器?

使用JS刷新浏览器窗口

process.send在Node.js中有条件地定义

如何在头部使用Modernizr来有条件地加载JS-TypeError产生

如何在 Pandas 中使用 .assign 方法有条件地分配计算列?

在 Vue JS 中有条件地禁用数量

通过浏览器上的node.js将音频流传输到Azure语音api

使用ArcGIS JS API在浏览器中显示ArcGIS形状文件(* .shp)

使用来自 API 的 url 使用 map 方法在浏览器上显示图像

在Next JS中有条件地使用React钩子

Node.js将图像从数据库传递到浏览器的最佳方法