CommonJs规范和ES 模块系统

news/2024/11/25 21:18:15/

一、CommonJs规范

CommonJS 是一种模块化规范,用于在 JavaScript 应用程序中组织和管理代码的模块。它定义了模块的导入和导出机制,使得开发者可以将代码分割成可复用的模块,并在不同的文件中引用和使用这些模块。

CommonJS 规范有以下几个主要特点用途

  1. 模块化组织代码:CommonJS 允许将代码按功能或逻辑分类成独立的模块,每个模块只负责特定的功能,使代码更加可维护和可复用。
  2. 隔离命名空间:每个模块都有自己独立的作用域,不会与其他模块中的变量和函数冲突,有效避免命名冲突。
  3. 代码加载管理:CommonJS 规范提供了模块的加载和缓存机制,可以确保模块只会被加载一次,避免重复加载和执行,提高性能。
  4. 跨平台使用:CommonJS 规范不限于在浏览器中使用,也可以在其他 JavaScript 运行环境中使用,如 Node.js 等。

在开发中,我们可以使用 CommonJS 规范来创建和使用模块。下面是一个使用 CommonJS 规范的示例

  1. 创建模块
    假设我们有一个 “math.js” 的模块,用于封装常用的数学函数。我们可以创建一个 “math.js” 文件,并在其中定义我们的模块代码。
// math.jsfunction add(a, b) {return a + b;
}function subtract(a, b) {return a - b;
}module.exports = {add,subtract
};

在上述代码中,我们定义了两个函数 addsubtract,并使用 module.exports 将它们导出为模块的接口。

  1. 导入模块
    我们可以在其他文件中导入并使用 “math.js” 模块的代码。
// main.jsconst math = require('./math.js');console.log(math.add(5, 3));  // 输出结果: 8
console.log(math.subtract(10, 4));  // 输出结果: 6

在上述代码中,我们使用 require 函数导入 “math.js” 模块,并将其赋值给 math 变量。然后,我们就可以通过 math 对象使用模块中的函数。

以上就是使用 CommonJS 规范在开发中创建和使用模块的简要示例。通过使用 CommonJS 规范,我们可以更好地组织代码,提高代码的可维护性和可复用性。

二、ES 模块系统

ES 模块系统是 ECMAScript(JavaScript)的官方模块系统。它允许开发者将代码分割为多个模块,并且可以通过导入和导出语法来共享模块之间的代码。

ES 模块系统有以下几个优点

  1. 模块化:ES 模块系统采用了显式的导入和导出语法,可以将代码分割为多个模块,使代码结构更加清晰和可维护。

  2. 作用域:每个模块都有自己的作用域,模块内部的变量和函数不会被外部访问,从而避免了全局命名冲突和污染。

  3. 异步加载:ES 模块系统支持动态导入,可以在需要的时候异步加载模块,提高了应用的性能。

  4. 静态分析:ES 模块系统能够在编译时进行静态分析,使得工具和编译器可以更好地优化代码。

如何使用?

  1. 默认导入和导出

默认导出允许一个模块只导出一个变量、函数或者类,而不需要指定一个具体的名字。可以使用export default语法进行默认导出,其他模块可以通过import语法来导入默认导出的内容。

示例代码中,假设有一个名为math.js的模块,它默认导出了一个计算两个数之和的函数:

// math.js
export default function add(a, b) {return a + b;
}// main.js
import add from './math.js';console.log(add(2, 3)); // 输出 5
  1. 多个变量或函数的导入导出

在一个模块中,可以导出多个变量或函数,其他模块可以通过import语法导入其中的某个或全部导出的变量或函数。

示例代码中,假设有一个名为math.js的模块,它导出了两个函数addsubtract

// math.js
export function add(a, b) {return a + b;
}export function subtract(a, b) {return a - b;
}// main.js
import { add, subtract } from './math.js';console.log(add(2, 3)); // 输出 5
console.log(subtract(5, 2)); // 输出 3
  1. 默认和多个变量一起导入导出的情况

在一个模块中,既可以进行默认导出,也可以导出多个变量或函数。其他模块可以通过import语法同时导入默认导出和其他的变量或函数。

示例代码中,假设有一个名为math.js的模块,它默认导出了一个函数add,同时导出了一个函数subtract

// math.js
export default function add(a, b) {return a + b;
}export function subtract(a, b) {return a - b;
}// main.js
import defaultAdd, { subtract } from './math.js';console.log(defaultAdd(2, 3)); // 输出 5
console.log(subtract(5, 2)); // 输出 3

这样,开发者可以根据需要选择使用默认导入导出、多个变量或函数的导入导出,以满足不同的开发需求。

三、CommonJs规范和ES 模块系统的对比

CommonJSES 模块系统
常用场景服务器端、命令行工具、后端开发前端开发、浏览器环境
引入方式require()import
导出方式module.exportsexport
静态解析不支持静态解析,只能在运行时加载和解析模块支持静态解析,可以在编译时进行模块解析
模块的加载方式同步加载,阻塞执行异步加载,非阻塞执行
模块的绑定方式模块加载返回的是一个对象,可以动态地修改和扩展其属性模块加载返回的是一个只读对象,无法动态修改其属性
循环依赖解决方式只能通过在运行时检测到循环依赖并返回未完全加载的模块对象来解决支持动态导入,可以在需要时请求模块的加载,解决循环依赖问题
导入导出的方式是否统一导入和导出的方式不统一,导入是直接引用整个模块对象,导出是赋值对象上的属性导入和导出的方式统一,都是通过标准的 import 和 export 关键字来实现
代码的可读性和可维护性代码可读性较差,需要通过查看模块对象上的属性来确定导入的内容代码可读性较好,导入导出的部分直观明了,更易于理解和维护
兼容性在服务器端和命令行工具中广泛使用,但在浏览器端需要依赖额外的打包工具进行转换浏览器端支持较好,不需要额外的打包工具来进行转换
执行顺序模块会按照导入的顺序依次加载和执行,但加载和执行是同步的模块的加载和执行是异步的,执行顺序可以根据依赖关系来确定
动态导入不支持动态导入,导入的路径必须是静态字符串支持动态导入,可以在运行时根据条件来决定导入哪些模块

以上是CommonJS规范和ES 模块系统的一些优劣对比。在具体应用中,可以根据场景和需求选择合适的模块系统。


http://www.ppmy.cn/news/741689.html

相关文章

charles 如何获取电脑端微信小程序接口

安装证书 设置代理端口 即可抓取美团酒店小程序的数据 从charles 可以抓取出header 请求,没有所谓的通过遍历循环能简单的得到数据,请求包含加密信息 随便改下数据就是 所以如果要得到这些数据,还非得通过小程序模拟人滑动获取数据&…

VR全景拍摄的具体张数

安装调节好相机之后即可开始全景拍摄。 以Canon 10D和Sigma 8mm加JTS-Rotator SPH云台为例,这套设备得到的图片是drum鱼眼图,需要水平拍摄4张,也可以加上天地。 以Nikon D50和Nikkor 10.5mm镜头为例,这套设备得到的是full frame鱼…

OPT液态镜头上市,视觉检测实现瞬时对焦

为满足客户提质增效需求,OPT自研的液态镜头全新上市,与智能读码器、工业相机搭配应用,性能优势突出,实现瞬时对焦,工作距离更加灵活,可以更好地适用于3C、物流等行业 液态镜头技术,基于仿生科学…

科普一下:拍抖音需要什么设备,可能用到的设备合集

大家好,我是我赢助手短视频运营,抖音是现在最火的短视频平台之一,几乎每个人都在用它,抖音视频的发展离不开手机。 但你知道吗?手机拍摄有很多方面的限制,比如手持稳定程度、快门速度以及光圈大小等&#…

抖音镜头怎么运用,如何拍摄出爆款视频。

抖音短视频拍摄中除了多种景别的变换给视频带来不同的层次感之外,各式各样的抖音短视频拍摄手法也会让整个视频变得丰富多彩。不同拍摄手法所表达的意思也各不相同,学会之后就能在剧本的基础上为视频添加更多色彩。 我们在影视剧短视频里看到的画面都是…

产品运动动画用什么软件做的_3C产品渲染用什么软件好?Keyshot,工业设计必备!...

“ 最近 看到一组很不错的3C产品渲染图 想跟大家分享 ” 这组作品,来自 专业商业渲染师--许胜达 ,他 专注3C类目产品方向, 擅长产品打光、材质表现、场景搭建渲染等。

小程序蓝牙通信

蓝牙通信能力封装 一开始是根据uniapp提供的蓝牙api写的蓝牙方法,之后发现复用性,以及一些状态的监听存在缺陷,之后整理成了类。这样复用性以及状态监听的问题就解决了。 蓝牙组件 创建蓝牙组件的类 单例模式是为了保证蓝牙长连接&#xff0…

MySQL体系结构及各结构的功能

MySQL体系结构 MySQL的体系结构实际就是MySQL数据库是由那些部分构成,每个部分的具体作用是什么。 Connectors: 用于不同的编程语言连接MySQL数据库,即对外提供的API。 Management Service &Utilities: 用于管理系统&…