死磕Node模块兼容性,ESM和CJS我全都要!

news2024/11/26 8:40:40

目录

前言

一些概念

CJS(CommonJS)

ESM(ECMAScript Modules)

兼容操作

效果演示

总结


前言

在Node版本13.2.0(2019年)之前,我们一般使用CJS(CommonJS)模式在代码中引入包,它的加载是同步的,在整个模块加载完成后,才会执行后续代码。而ESM(ECMAScript Modules)最早在2015年就被使用在浏览器中,在script标签中增加type="module"这个属性,然后引入模块进行使用。

在Node 13.2版本后,Node也支持使用ESM进行导入模块的操作,那么在发布npm包时如何对其二者进行兼容?请接着往下看

想直接看解决方式的同学空降这里

一些概念

上面提到的两种模式,需要简单介绍一下

CJS(CommonJS)

CJS (CommonJS)是一种在 JavaScript 中实现模块系统的规范。CJS模块是单独的JavaScript文件,每个模块可以导出一个或多个值,其他模块可以使用require()函数导入这些值。CJS比较适合在服务端使用,因为它可以访问文件系统并直接加载模块,但是由于无法异步加载和编译的关系,使其不适合运行在浏览器中

以下是使用CJS模式导入,导出模块的示例

params.js

module.exports = {
  a: 1,
  b: 2,
};

index.js

const params = require("./params");
const fn = function (params) {
  const { a, b } = params;
  console.log(a + b);
};
fn(params);

此外,CJS还支持exports的方式导出

exports.params = {
  a: 1,
  b: 2,
};

ESM(ECMAScript Modules)

说完了CJS,我们来看看ESM

ECMAScript(ES)模块是JavaScript的一种模块系统,是从ECMAScript6(ES6)开始引入的。与CJS不同,ES模块是异步加载的,CJS在运行时加载模块,而ESM是静态的,其在编译时就定义了模块

用法示例

export default {
  a: 1,
  b: 2,
};
import params from "./params.js";
const fn = function (params) {
  const { a, b } = params;
  console.log(a + b);
};
fn(params);

除此之外,ESM还支持以下语法:

  • export const a :将一个模块导出

  • import a from :导入模块所有内容

  • import() :动态导入模块

  • export * from :导出模块中所有导出的内容

  • import { a, b } from :模块中的部分内容

  • import { a as c } from :将导入的内容重命名

注意:在node中使用ESM需要把package中的type属性改成module

那么由于上述的操作,导致在node环境下只能使用ESM或者CJS,有没有什么方法可以得二者求其全?

兼容操作

首先我们需要明确:在一个文件夹下新建一个package.json文件,该文件夹下的文件都会遵循这个json的配置

那么有了上述的概念,我们就可以在打包时新建两个文件夹分别用来编译CJS和ESM了

举个例子:

我需要写一个工具包发布到npm上,由于两种模式的局限性,我不得不使用esm或者cjs其中一种进行打包,此时可以进行如下操作:

新建如下文件夹

具体配置如下:其中主目录的package.json是工具包的默认配置,不写type默认取commonjs,esm目录下则会读取package配置,获得module

具体配置可以参考utils-lib-js这个工具包

效果演示

在未配置时,工具包中的type是module,使用require引入会报错

Error [ERR_REQUIRE_ESM]: require() of ES Module xxxxxxxxxx.js from xxxxxxx.js not supported.

而工具包中的type如果使用commonjs或者不写,使用import引入时会报

Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
(Use `node --trace-warnings ...` to show where the warning was created)

此时我们试试在主目录下将type设置为module,在cjs中新建package将type设置成commonjs后就可以解决上述兼容问题

使用ESM的import

使用CJS的require 

总结

文章介绍了两种模块系统,并且实现了在同一个项目中同时使用二者进行引入,在保证功能的前提下进行兼容。

以上就是文章所有内容了,希望对你有帮助,感谢你看到最后,喜欢文章的朋友还请点赞支持一下,感谢!

相关代码:utils-lib-js: JavaScript工具函数,封装的一些常用的js函数

参考代码:Wechaty | Wechaty

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/365032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java JDBC详解

1、JDBC概念、本质、好处 概念: JDBC 就是使用Java语言操作关系型数据库的一套API 全称:( Java DataBase Connectivity ) Java 数据库连接 本质: 官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口…

展现AI与自动化测试技术之间的神奇化学反应

目录 零:前言 一、介绍 1.1、什么是自动化测试技术 1.2、痛点 1.3、几款优秀的自动化测试工具介绍 1.3.1、Selenium 1.3.2、龙测AI-TestOps云平台 1.3.3、TestCafe 二、实操 2.1、主要功能模块介绍 2.2、实战演练 2.2.1、创建web项目 2.2.2、录制流程图…

Taro3.x 容易踩坑的点(阻止滚动穿透,弹框蒙层父级定位)

解决弹框滚动的时候,下层也会滚动问题》阻止滚动穿透(react,vue)案例描述:页面展示时需要滚动条才可以显示完整,但是当我们显示弹框的时候,即使不需要滚动条,但是页面仍然可以滚动,并且下层内容会随着滚动变…

MES助力灯具照明行业从制造到”智造”

现如今,LED照明行业产品更新换代太快,一个产品一两年不更新一下外观、材料,就会被对手超越。这直接导致LED产品标准化程度不够高,LED下游制造类厂家智能化生产程度普遍偏低。 加之大多属于劳动密集型产业,传统的依靠买…

Hive分区表与分桶表的使用具体说明

目录 一、分区表 (一)分区表基本语法 1.创建分区表 2.往分区表中写入数据的两种方法 (1)load装载本地数据 (2)insert...select...(常用) 3.读取分区表数据 4. Hive分区表的存储路径规划:分区字段分区值 5.分区表基本操作 (1)查看所有分区信息 (2)新增分区…

C#使用MQTT通信 .Net实现MQTT通信 java使用MQTT通信 java实现MQTT通信

MQTT是一种轻量级、基于发布/订阅模式的通信协议,通常用于物联网设备间的通信。MQTT协议采用简单的二进制消息格式,能够在不占用过多网络带宽的情况下进行高效的通信。以下是使用MQTT进行通信的一些基本概念:BrokerMQTT通信中的中间件&#x…

机器学习算法: AdaBoost 详解

1. 集成学习概述 1.1. 定义 集成学习(Ensemble learning)就是将若干个弱分类器通过一定的策略组合之后产生一个强分类器。 弱分类器(Weak Classifier)指的就是那些分类准确率只比随机猜测略好一点的分类器,而强分类器&…

住宅防雷接地的选择要求和施工方法

在您家的布线系统中,防雷接地系统是一项至关重要的安全功能。如果系统发生某种故障,接地系统提供电阻最小的路径,确保电流安全地流回大地本身。因此,它减少了短路导致火灾或危及生命的电击的可能性。家庭接地系统的最后一个也是最…

成都的Java培训机构有哪些?

强烈自荐 二十三年教学实力积累 "课工场是专注互联网教育的生态平台,汇聚中国和北美数百位来自互联网企业的行业大咖,向寻求技术提升和想进入IT行业的人群提供直播、录播、线下面授等多模式教学服务,并通过全国线下服务中心提供更加成熟…

【JVM】内存结构

【JVM】内存结构 文章目录【JVM】内存结构1. 程序计数器1.1 定义1.2 作用2. 虚拟机栈2.1 定义2.2 栈内存溢出2.3 线程运行诊断3. 本地方法栈4. 堆4.1 定义4.2 堆内存溢出4.3 堆内存诊断5. 方法区5.1 定义5.2 组成5.3 方法区内存溢出5.4 运行时常量池5.5 StringTable特性1. 程序…

Hadoop集群模式安装(Cluster mode)

1、Hadoop源码编译 安装包、源码包下载地址 Index of /dist/hadoop/common/hadoop-3.3.0为什么要重新编译Hadoop源码? 匹配不同操作系统本地库环境,Hadoop某些操作比如压缩、IO需要调用系统本地库(*.so|*.dll) 修改源码、重构源码 如何…

电子墨水屏的应用场景

电子纸挺好个东西,大家都把注意力集中在商超场景,其实还有更多有趣的场景方案可用,价值也不小,比如: 仓库场景:通过亮灯拣选,提高仓库作业效率。 仓库循环使用标签:做NFC类发卡式应…

CnOpenData专精特新“小巨人”企业工商注册基本信息数据

一、数据简介 “专精特新”一词最早来源于2011年7月,由时任工信部总工程师朱宏任在《中国产业发展和产业政策报告(2011)》新闻发布会上首次提出。“专精特新”是指具备专业化、精细化、特色化、创新型四大优势的企业。根据工信部的定义&#…

content-type几种常见类型区别

Content-Type叫做MIME(mediaType)类型,使用Content-Type来表示请求和响应中的媒体类型信息。如果是请求头,它用来告诉服务端如何处理请求的数据,如果是响应头,它用来告诉客户端(一般是浏览器)如…

numpy的常见数据类型

常见数据类型介绍Python 原生的数据类型相对较少, bool、int、float、str等。这在不需要关心数据在计算机中表示的所有方式的应用中是方便的。然而,对于科学计算,通常需要更多的控制。为了加以区分 numpy 在这些类型名称末尾都加了“_”。类型…

【ESP32+freeRTOS学习笔记-(九)事件组】

目录1、概述2、事件组的特性2.1 事件组、事件标志和事件位2.2 事件组位长的设置2.3 多任务访问3、使用事件组管理事件3.1 xEventGroupCreate()3.2 xEventGroupSetBits()3.3 xEventGroupGetBits()3.4 xEventGroupWaitBits()3.5 示例4、使用事件组同步任务4.1 xEventGroupSync()4…

MobaXterm安装与使用

MobaXterm安装与使用 我们首先进入MobaXterm官网,其提供了收费版和免费版,我们使用免费版即可 随后便是安装过程了,很简单。解压后运行该文件一路next即可。 安装完成后我们便可以使用了点击session 选择SSH连接方式,输入服务器…

vue项目——获取指定日期是周几和第几周的信息——表格展示

最近在写后台管理系统,遇到以下的要求,就是要展示 年月日和周几和第几周的情况。 下面记录一下用到的函数: 1.跟据日期获取第几周 //根据日期获取第几周 getWeek(dateTime) {let temptTime new Date(dateTime);//周几let weekday temptT…

浏览器用一行JS代码导出cookies.txt,Python的requests库导入cookies格式化为字典格式

在Python进行爬虫时,如果仅使用requests库打开某个网页,requests的session.cookies保存的cookies信息少得可怜,有时cookies甚至是空白!但浏览器里打开同一个网页,cookies信息非常详尽,比如浏览器的cookies保…

2023-02-22 学习记录--TS-邂逅TS(二)

TS-邂逅TS(二) 不积跬步,无以至千里;不积小流,无以成江海。💪🏻 一、接口(interface) 在 ts 中,子类只能继承一个父类,不可多继承,但是…