如何同时支持es模块和commonjs模块

2023-12-29

我们从 npm 安装的一些包同时支持 commonjs 和 es 模块,

这些包可以按如下方式导入:

import express from 'express'
// or
const express = require('express')

我创建了一个包我已经发布到 npm https://www.npmjs.com/package/stack-player使用 es 模块。

因为我正在开发的另一个项目是用 commonjs 构建的,所以我意识到我不能require它使用以下语法:

const stackPlayer = require('stack-player')

我如何支持我的包中的两个模块系统堆栈播放器 https://www.npmjs.com/package/stack-player让世界各地的每个人都可以使用它?

  • 除了将我的所有项目转换为 es 模块之外,还有其他方法吗(这太复杂了,因为该项目已有 1 年历史,而且足够大,无法拒绝这个想法)。 ?

主要有两种场景:

1.你的包是使用 CommonJS (CJS) 模块加载编写的

这意味着你的包使用require()加载依赖项。对于这种包不需要特殊的工作来支持在 ES 和 CJS 模块中加载包。 ES 模块能够通过以下方式加载 CJS 模块import声明,但需要注意的是仅支持默认导入语法。 CJS 模块能够通过以下方式加载其他 CJS 模块require()功能。所以ES模块和CJS模块都能够加载CJS模块。

2.你的包是使用ES模块加载编写的

这意味着你的包使用import加载依赖项。但不要被愚弄 - 有时,特别是在使用 TypeScript 时,您可能会编写import在你的代码中,但它被编译为require()在幕后。

不幸的是,CommonJS 模块不支持加载ES模块除了(在 Node.js 中)使用import()函数(这有点痛苦,而且不是一个很好的解决方案)。

为了在这种情况下支持 CommonJS,最好的选择是将包转换为 CommonJS 模块,并同时提供包的 CommonJS 和 ESM 版本。

我这样做是在我自己的包裹数量 https://github.com/mistval/unofficial-jisho-api主要是使用 Rollup,这使得它相对容易。

基本概念是这样的:

  1. 将您的包编写为 ES 模块。
  2. 安装汇总:npm i -D rollup
  3. Run npx rollup index.js --file index.cjs --format cjs将您的代码转换为 CJS 模块。
  4. 从 package.json 中导出两者:
{
  "name": "my-package",
  "version": "1.0.0",
  "main": "index.js",
  "type": "module",
  "exports": {
    "import": "./index.js",
    "require": "./index.cjs"
  }
}

这样,CJS 模块加载器就知道加载您的index.cjs文件,而 ESM 加载程序知道加载您的index.js文件,双方都很高兴。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何同时支持es模块和commonjs模块 的相关文章

  • Javascript:使用 IIFE 和块语句之间的区别

    IIFE主要用于封装作用域 function let myVar 10 not global 但为什么不直接使用块语句呢 let myVar 10 also not global 除了范围封装之外 进一步使用 IIFE 是否还有其他好处 块
  • NPM 安装错误:解析“...nt-webpack-plugin”附近时 JSON 输入意外结束:“0”

    创建新的 Angular 5 项目时 节点版本 8 9 2 npm 版本 5 5 1 我的命令是 npm install g angular cli 错误是 npm ERR Unexpected end of JSON input whil
  • 多次训练brain.js?

    在第一次训练后 如何将新信息 仅新信息 而不是所有信息 因为这会花费太多性能 训练到我的用 Brain js 制作的神经网络 它有点粗糙 但您可以使用以下结构来实现 如果我们加入 2 个训练数据集 旧数据集与新数据集 然后重新训练keepN
  • JS文件中的System.register是什么意思?

    在 Angular 2 中使用指令时 JS 文件中的 System register 是什么意思 我认为这个问题并不特定于 Angular2 中的指令 它是关于 ES6 TypeScript 和其他使用 SystemJS 的现代编译器的一般
  • 每n秒执行一次函数

    我制作了这个在 10 秒后点击链接的代码片段 function timeout window setTimeout function img left click 1000 setTimeout timeout 1000 timeout 我
  • 在 Cordova 中合并文件的多个部分

    在我的 Cordova 应用程序中 我正在下载任意文件 例如图像或视频文件 这是通过 Cordova 文件传输插件和 Range 标头完成的 因为我需要分段下载文件 我的问题是 我想将几 个小 字节 文件合并回原来的文件中 他们曾经在其中使
  • 根据 MVC,哪种项目结构是正确的? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我注意到诸如flask通常有一个名为views容纳 app route def index return render template ind
  • 如何强制 tsc 忽略 node_modules 文件夹?

    我正在使用 tsc 构建任务 不幸的是 我总是从节点模块文件夹中收到相同的错误 Executing task node modules bin tsc cmd watch p tsconfig json lt node modules ty
  • Twitter Bootstrap - 下拉菜单 - 箭头键不适用于 Firefox 中的输入标签

    要求 我想在带有用户名和密码字段的下拉菜单中放置一个登录表单 我可以做到这一点 除了以下问题之外 一切正常 Issue 打字时我无法使用箭头键 上 下 firefox 当输入位于下拉代码之外时 这很有效 这适用于其他浏览器 例如 googl
  • 在 UIWebView 中禁用复制和粘贴

    几乎 我已经尝试了一切方法来禁用复制 粘贴UIWebView但对我来说没有任何作用 我正在加载我的UIWebView来自字符串 字符串数组 如下所示 webView loadHTMLString NSString stringWithFor
  • 只保留 A-Z 0-9 并使用 javascript 从字符串中删除其他字符

    我正在尝试验证字符串以使它们成为有效的网址 我只需要保留 A Z 0 9 并使用以下命令从字符串中删除其他字符javascript or jquery 例如 贝儿餐厅 我需要将其转换为 百丽餐厅 所以字符被删除 只保留 A Z a z 0
  • 在需要时初始化模块

    我有一个模块 里面有一些初始化代码 加载模块时应执行 init 目前我正在这样做 in the module exports init function config do it in main var mod require myModu
  • 使用 JavaScript 防止网页导航离开

    如何使用 JavaScript 防止网页导航离开 Using onunload允许您显示消息 但不会中断导航 因为为时已晚 然而 使用onbeforeunload将中断导航 window onbeforeunload function re
  • Angular 2 将字符串转换为 md5 哈希

    我找到了ts md5 https www npmjs com package ts md5包 但在示例中它有一个hashStr方法 但现在不行了 类型上不存在属性 hashStr Md5 使用该错误后 该错误会记录在我的控制台中 我怎样才能
  • 在 javascript 中实现固定位置会导致 Safari 滚动时出现抖动

    固定位置不适用于我的用例 因为它固定在浏览器窗口上 您可能会处于文本在屏幕右侧之外且无法到达的状态 无论如何 我尝试使用绝对定位 然后调整javascript中的 顶部 它在 Firefox 和 Chrome 中运行良好 但在 Safari
  • 为什么我的 D3 SVG 图上的轴不会更新?

    I have 简单的 D3 散点图 http www raxacoricofallapatorius com test scattertest html我在显示数据的几个不同属性之间切换 但是虽然我可以更改数据点 并按照我想要的方式进行转换
  • 猫鼬中的数组过滤器

    将查询转换为节点 arrayfilter 在 mongoose 中工作的版本或者如何在节点应用程序中运行它们 db getCollection student update id ObjectId 5a377d62d21a3025a3c3a
  • 根据文本内容从 jquery 对象中过滤元素

    我正在尝试使用contains带有 this 关键字 但它给出了错误 JS function var check ul find li filter function return this contains two css color r
  • 在 Firestore 文本字段中存储文本文件并删除换行符

    我正在尝试将 CSV 文件存储在 Cloud Firestore 内的文本字段中 然而 Firestore 正在删除所有换行符并将整个 CSV 文件存储为一行 这Firestore 数据类型文档 https firebase google
  • 使用
    元素作为 JavaScript 代码的输入。这是最好的方法吗?

    各位 显然 我是编码新手 所以最近完成了一些有关 HTML 和 Javascript 的 Lynda 课程后 我的简单 HTML 页面遇到了困难 基本上 我想要的是使用 JavaScript 进行基本计算 让用户使用 HTML 输入两个数字

随机推荐

  • IE 9 和 Firefox 13 中的内容处置被忽略

    我正在尝试动态创建一个内联 PDF 当用户选择保存它时 会提示我的自定义文件名 根据文档 http help adobe com en US ColdFusion 9 0 CFMLRef WSc3ff6d0ea77859461172e081
  • 获取应用程序的第一个 Key Vault 机密值时出现异常

    在我的应用程序中 当我的应用程序获取第一个密钥保管库机密的值时 我遇到异常 仅当我从异常设置中打开 公共语言运行时异常 时 才会出现异常 我得到的例外是 Microsoft Rest TransientFaultHandling HttpR
  • java.lang.ClassFormatError:类中的字段修饰符非法

    我正在尝试使用实现一个简单的 TabGroup环境服务 http tapestry apache org environmental services html 我的代码如下所示 public class TabPanel Inject p
  • 如何仅使用 SwiftUI 从 @main App 访问 NSWindow?

    At this answer https stackoverflow com a 60359809 4307080该解决方案适用于 Scene 和 swiftUI 但是使用 main 像 main struct MyApp App Stat
  • 如何指定 postgres 表的主键种子?

    我有一个 postgres 表 其中包含数据 其中主键已由注入数据的代码设置 假设主键是 0 49 如何指示 postgres 在下一次插入的主键列上以 50 开头 目前 所有没有设置主键的插入都会导致重复的 ID 问题 因为它从 0 开始
  • 尽管 magic_quotes 已关闭,但仍转义字符串?

    我在 php ini 中禁用了 magic quotes 但我的表单中仍然会出现转义字符串 注意 我在 WordPress 的主题中运行它 我实际上已经弄清楚了这一点 只是想将我的解决方案留在这里 以防其他人可能会发现它有用 WordPre
  • 访问对话流履行中先前的后续意图参数

    我使用内联编辑器中提供的默认对话流代码 基于dialogflow fulfillment 0 5 0 来整理多个后续意图中给出的所有参数 我有一个设置 其中后续意图提出问题 从而产生提出所有问题的最终意图 从对话框流控制台内以前的意图中提取
  • 为什么 element.click() 在 Cefsharp 中不起作用?

    我尝试执行下面的脚本Cefsharp单击 DIV 元素 但不起作用 private static string ClickUnreads function let chatsEl document querySelectorAll infi
  • 简化的行梯形形式

    R中是否有一个函数可以产生reduced row echelon form的矩阵 This http cran r project org doc contrib Hiebeler matlabR pdf参考文献说没有 你同意 I don
  • Objectify 库可以在 GAE 之外使用吗?

    我想使用 Google Cloud 数据存储区 不过 我没有使用GAE 我还可以使用 Objectify 库吗 如果是这样怎么办 该文档没有说明如何配置它以针对数据存储进行身份验证 不 你不能 这里有一个来自创作者的评论 https gro
  • 如何在 C# 中基于现有委托类型创建新的委托类型?

    有什么方法可以基于现有的委托类型创建新的委托类型吗 就我而言 我想创建一个委托MyMouseEventDelegate其功能与EventHandler
  • 如何隐藏 Mac/OSX 拖放 JTable 选择框

    在 JTable 上执行拖放操作时 拖动时会出现所选单元格 选择框 的轮廓 我怎样才能覆盖该行为并且除了特殊光标之外不显示任何内容 在 Windows 和 OSX 中运行以下代码显示了我想要覆盖的行为 import java awt Bor
  • ASP.NET 身份检查用户角色不起作用

    我有一个 ASP NET MVC 5 应用程序 我使用标准 ASP NET 身份提供程序进行用户和角色管理 重要的是我使用自己的存储库项目中的 IdentityUser 但这似乎没问题 我可以注册 登录 编辑用户并管理他们的角色 我使用以下
  • Azure Devops - 按代理池 ID 获取发布定义

    我试图使用 NET 客户端库查找配置为使用特定代理池的所有构建和版本 假设agentPoolId 我可以得到所有的构建定义 如下所示 connection is of type VssConnection using var buildCl
  • 配置 EMR 以使用 s3a 而不是 s3 进行 Spark.sql 调用

    我对 Spark sql 的所有调用都失败 并在堆栈跟踪中出现错误 1 below 更新 2我已经把注意力集中在这个问题上 它是 sts AssumeRule 的 AccessDenied 任何线索都值得赞赏 User arn aws st
  • 在 Spark 2.3.0 的结构化流中禁用 _spark_metadata

    我的结构化流应用程序正在写入镶木地板 我想摆脱它创建的 spark metadata 文件夹 我使用了下面的属性 看起来不错 conf spark hadoop parquet enable summary metadata false 当
  • 如何从 Java 中的套接字获取客户端名称?

    抱歉 简单的问题 但我无法使用谷歌或教科书在任何地方找到答案 我有一个简单的服务器 用户通过 java 中的套接字连接到该服务器 我想使用这个 Java 套接字来检索用户客户端名称 这可能吗 我知道我可以使用 getInetAddress
  • 数据绑定到以编程方式创建的数据表

    假设我有一个这样的数据表 DataTable dt new DataTable Woot dt Columns AddRange new DataColumn new DataColumn ID typeof System Guid new
  • 使用 JavaScript 对 DIV 进行动画处理会在 Chrome 上呈现工件

    作为一个实验 我尝试在 JavaScript 中复制 AS3 的 Sprite 功能 而不使用画布对象 我认为使用绝对定位的 div 并操作它们的 css 属性是理所当然的 但是在 Chrome 中 动画引入了奇怪的工件 似乎是因为重绘问题
  • 如何同时支持es模块和commonjs模块

    我们从 npm 安装的一些包同时支持 commonjs 和 es 模块 这些包可以按如下方式导入 import express from express or const express require express 我创建了一个包我已经