Javascript 如何在ES6样式的导入中有条件地使用内置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()作为随机源的基础 当前

示例上下文

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

问题

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

  • 带有ES6风格导入的Node.js API方法
  • 或浏览器API方法
  • 基于环境检测

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

    为了使库在Node.js和浏览器环境中都可用,Node.js中使用了
    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
    或导入具有统一接口的模块,该接口本身会根据环境进行替换。这是正确的方法。不要执行环境检测和动态模块导入,但是让模块加载程序/绑定程序适当地解析
    加密
    导入。