我们从 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,这使得它相对容易。
基本概念是这样的:
- 将您的包编写为 ES 模块。
- 安装汇总:
npm i -D rollup
- Run
npx rollup index.js --file index.cjs --format cjs
将您的代码转换为 CJS 模块。
- 从 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(使用前将#替换为@)