首页 > 其他分享 >ESM(ESModule)和CJS(CommonJS)的区别

ESM(ESModule)和CJS(CommonJS)的区别

时间:2024-07-09 17:56:04浏览次数:15  
标签:输出 age ESModule js CJS ESM 加载

ESM和CJS的区别

1.CJS

Node.js模块加载规范.js或.cjs文件,使用require加载,module.exports/exports导出。
CJS(CommonJS),主要用于服务器端,主要使用如下:

// 导出
const obj = {a: 1};
module.exports = obj;

// 引入
const obj = require('./test.js');

2. EMS

TC39新的加载规范,.mjs文件,使用import加载,export导出。
ESM是ESModule,是ECMAScript自己的模块体系,于ES6引入,主要使用如下:

// 导出:export命令
export const obj = {name: 'E1e'};

// 默认导出 export default命令
export default {name: 'E1e'};


// 引入接口:import命令

// 引入普通导出
import { obj } from './test.js';

// 引入默认导出
import obj from './test.js';

3 ESM 与 CJS 的区别

3.1 ESM输出的是值的引用,CJS输出的是值得拷贝

ESM:

// a.mjs(Node环境中进行测试,必须修改后缀名为mjs,这是Node的强制规定)
export let age = 18;

export function addAge() {
  age++;
}

// b.mjs
import { age, addAge } from "./a.mjs";

addAge();

console.log(age); // 19

CJS:

// a.js(Node环境中进行测试,必须修改后缀名为mjs,这是Node的强制规定)
let age = 18;

module.exports = {
  age,
  addAge: function () {
    age++;
  },
};


// b.js
const { age, addAge } = require("./a.js");

addAge();

console.log(age); // 18

从上面的例子可以看出,ESM在调用方法修改模块中的值后,引用这个值的地方也随着改变;而CJS在调用方法后,并没有随着改变;就是因为CJS输出的是一个值的拷贝,而ESM输出的是值的引用;
由于ESM是输出值的引用,所以不允许在外部直接修改值(对象修改或新增属性除外),否则报错;

3.2 CJS的输出是运行时加载,而ESM是编译时输出接口

因为CJS输出的是一个对象,该对象需要在脚本运行完成后才生成,而ESM的输出是静态的,在编译时就能生成。

3.3 CJS是同步加载,ESM是异步加载

由于CJS是用于服务器端的模块体系,需要加载的模块都在本地,所以采用同步加载也不会出问题,但是ESM用于浏览器端时,可能涉及到一些异步请求,所以需要采用异步加载。

标签:输出,age,ESModule,js,CJS,ESM,加载
From: https://blog.csdn.net/qq_65665724/article/details/140301950

相关文章

  • Elasticsearch数据迁移工具之ESM
    Elasticsearch数据迁移工具之ESMESM版本:0.5.0上传esm的tar包并解压查看一下帮助文档并确认安装成功ESM各个参数用法简介在使用Elasticsearch的时候不可避免的会涉及到集群的升级或者是业务的迁移等场景,此时就需要对数据进行迁移,es数据迁移的工具有很多比如reindex、esm、elas......
  • cJSON:解析JSON
    解析数组将JSON数组解析并存储到自定义的结构体组合的单链表中,打印单链表中所有的结点数据。例如:[{"name":"Zhao","age":18},{"name":"Qian","age":19},{"name":"Sun","ag......
  • cJSON:构建JSON
    使用cJSON库构建比较简单的JSON类型:create_json.c#include<stdio.h>#include<string.h>#include<stdlib.h>#include"cJSON.h"staticintcreate_json_type_1(void){char*json_str=NULL;cJSON*root=NULL;root=cJSON_Cre......
  • 基于cJSON及心知天气模块化实现获取城市气象信息(现在、未来)
    V1.02024年6月14日发布于博客园目录序言功能描述运行结果示范注意!代码weather_api.hweather_api.cdemo.ccJSON.hcJSON.c参考链接序言功能描述用于请求心知天气的信息,现在的信息,未来n天的气象信息(免费版仅能3天).使用域名通过TCP连接到心知天气服务器,采用cJSON进......
  • 利用某些平台(聚合API、百度AI、科大讯飞API)的API接口,利用HTTP协议向服务器发送请求,并
    要使用C语言通过HTTP协议向服务器发送请求并接收响应,你可以使用如libcurl这样的库来发送HTTP请求。libcurl是一个免费且易于使用的客户端URL传输库,支持多种协议,包括HTTP。同时,为了解析服务器响应中的JSON数据,你可以使用cJSON库,这是一个轻量级的JSON解析库。以下是一个简单的示例......
  • python运行js代码拿到逆向数据-execjs库
    #前提安装了node.js并且设置环境变量https://blog.csdn.net/bestyellow/article/details/119820509importsubprocessfromfunctoolsimportpartialsubprocess.Popen=partial(subprocess.Popen,encoding='utf-8')importexecjs#如果funcs_name是js代码里面的函数名字var代......
  • 利用cJSON库解析http返回参数
    利用cJSON库解析http返回参数在C语言中,使用cJSON库来解析HTTP响应返回的JSON参数通常涉及几个步骤:发送HTTP请求(可以利用soket库进行http请求)接收HTTP响应的数据将接收到的数据作为字符串传递给cJSON库进行解析使用cJSONAPI访问和提取JSON数据以下是一个示例,展示了如何使......
  • 基于HTTP传输协议、cJSON库的网络天气获取程序
    基于HTTP传输协议、cJSON库的网络天气获取程序#include<stdio.h>#include<string.h>#include<strings.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<stdlib.h>#include<errno.h>#include......
  • http与cJSON练习
    http与cJSON练习/*****************************************************************************************************weather_test.c*练习tcp连接,与http协议,调用服务器接口,实现获取特定城市的天气信息,并用cJSO......
  • 利用聚合API平台的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJ
    目录题目分析代码结果题目利用聚合API平台的API接口,利用HTTP协议向服务器发送请求,并接受服务器的响应,要求利用cJSON库对服务器的响应数据进行解析,并输出到终端分析1.需从源代码网站GitHub或SourceForge代码网站下载cJSON库及阅读下载的README相关手册如何使用cJSON库;2.使用......