当前位置: 首页 > news >正文

common.js和es6中模块引入的区别

common.js

CommonJS 是一种模块系统,主要用于 Node.js 环境。它使用 require 函数来引入模块,并使用 module.exports 来导出模块。

语法:

  • 导出模块:
// moduleA.js
const name = 'Jo';
module.exports = name;// 或者导出一个对象
const person = { name: 'Jo', age: 18 };
module.exports = person;
  • 引入模块:
// main.js
const name = require('./moduleA');
console.log(name); // 'John'// 引入对象
const person = require('./moduleA');
console.log(person.name); // 'Jo'
console.log(person.age);  // 18

CommonJS的特点

  1. 同步加载模块:CommonJS 使用同步的方式加载模块,这意味着当一个模块被加载时,它会阻塞后续代码的执行,直到该模块完全加载并执行完毕。
// 模块A
console.log("Module A is being executed.");
module.exports = "This is module A.";// 入口文件
console.log("Before requiring module A.");
const moduleA = require('./moduleA');
console.log("After requiring module A.")
  1. 模块导出:在 CommonJS 中,使用 module.exports 来导出模块的内容。这可以是任何类型的值,包括对象、函数、类等。
// 模块B
const sum = (a, b) => a + b;
module.exports = sum;// 入口文件
const sumFunction = require('./moduleB');
console.log(sumFunction(2, 3)); // 输出 5
  1. 模块导入:使用 require() 函数来导入其他模块的内容。例如,const moduleA = require(‘./moduleA’) 将会加载 moduleA.js 并将其导出的内容赋值给 moduleA。

  2. 单例模块:在 CommonJS 中,每个模块只会被加载一次,并且在内存中缓存,之后再次导入该模块时,都会返回相同的实例。这样可以减少资源消耗并提高性能。

// 模块C
class MyClass {constructor() {this.counter = 0;}incrementCounter() {this.counter++;}
}module.exports = new MyClass();// 入口文件
const singletonInstance1 = require('./moduleC');
const singletonInstance2 = require('./moduleC');singletonInstance1.incrementCounter();
console.log(singletonInstance2.counter); // 输出 1
  1. 服务器端使用广泛:由于 CommonJS 最初是为服务器端 JavaScript(如 Node.js)设计的,因此在服务器端 JavaScript 开发中得到了广泛应用。

  2. 适用于大型应用:CommonJS 适用于构建大型应用程序,因为它可以帮助将代码组织成模块,并且提供了清晰的模块导入和导出机制,使得代码更易于维护和管理。

总的来说,CommonJS 提供了一种简单而强大的模块化方案,尤其适用于服务器端 JavaScript 开发以及构建大型应用程序。

ES6 模块

ES6 模块系统是 ECMAScript 标准的一部分,使用 import 和 export 语法来定义模块,广泛用于现代前端开发以及一些支持 ES6 的服务器环境。

语法

  • 导出模块:
// moduleA.js
export const name = 'Jo';// 导出默认值
const person = { name: 'Jo', age: 18 };
export default person;
  • 引入模块:
// main.js
import { name } from './moduleA';
console.log(name); // 'Jo'// 引入默认导出
import person from './moduleA';
console.log(person.name); // 'Jo'
console.log(person.age);  // 18

ES6 模块的特点

  1. 静态导入和导出:ES6 模块的导入和导出是静态的,意味着模块的导入和导出关系在代码解析阶段就能确定,而不是在运行时。这使得工具可以更容易地分析和优化模块之间的依赖关系。

  2. 单例导入:与 CommonJS 不同,ES6 模块导入的是模块的绑定值的引用,而不是导出对象本身的副本。这意味着在不同模块中引用相同导出的变量,实际上引用的是同一个内存地址,这种行为被称为单例导入。

  3. 导出方式:ES6 模块的导出方式更加灵活,可以一次导出多个变量或函数,并且支持默认导出和命名导出两种方式。

// moduleA.js
export const name = "John";
export const age = 30;// moduleB.js
const greeting = "Hello";function sayHello() {console.log(`${greeting}, ${name}! You are ${age} years old.`);
}export { greeting, sayHello };
  1. 导入方式:ES6 模块的导入语法使用了 import 关键字,并支持默认导入、命名导入和命名空间导入。
// main.js
import { name, age } from './moduleA';
import { greeting, sayHello } from './moduleB';console.log(`${greeting}, ${name}! You are ${age} years old.`);
sayHello();
  1. 异步加载:ES6 模块支持动态导入,可以在运行时动态加载模块。这种异步加载的方式能够提高应用程序的性能和响应速度。
// main.js
document.getElementById('button').addEventListener('click', async () => {const module = await import('./moduleA');console.log(module.name); // 输出 "John"
});
  1. 编译时优化:由于 ES6 模块的导入和导出关系在代码解析阶段就能确定,因此工具可以进行更有效的编译时优化,例如无用代码删除(tree shaking)等。

  2. 浏览器支持:与 CommonJS 不同,ES6 模块是 ECMAScript 标准的一部分,因此得到了浏览器原生支持,无需使用工具转换成其他格式。

总的来说,ES6 模块具有静态导入和导出、单例导入、灵活的导出方式、异步加载等特点,适用于现代 JavaScript 应用程序的开发,并且在浏览器和 Node.js 等环境中都得到了广泛应用。

CommonJS和ES6的兼容性和转换

CommonJS 是 Node.js 等环境中使用的模块系统,而 ES6 模块是 ECMAScript 2015 引入的新的模块化系统。它们之间存在一些兼容性和转换的问题。

  1. 兼容性
  • 在 Node.js 环境中,通常原生支持 CommonJS 模块,但对于 ES6 模块需要使用 --experimental-modules 标志启用,并且语法上也有一些不同。
  • 在浏览器环境中,原生支持 ES6 模块,但对于 CommonJS 模块,需要使用工具如 Browserify 或 Webpack 进行转换后才能在浏览器中运行。
  1. 转换
  • 使用 Babel 可以将 ES6 模块转换为 CommonJS 或 AMD 格式,以便在不支持 ES6 模块的环境中运行。
  • 对于 Node.js 中的 CommonJS 模块,可以使用工具将其转换为 ES6 模块,以便在支持 ES6 模块的环境中使用。
// ES6 模块
// es6Module.js
export const foo = "Hello";// 转换为 CommonJS 格式
// commonJSModule.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.foo = "Hello";

通过使用 Babel 进行转换,可以让不同模块系统之间的代码在不同环境中运行和使用。在实际开发中,通常会根据目标环境和需求选择合适的模块系统,并使用相应的工具进行转换和兼容性处理。

使用场景

CommonJS 的使用场景:

  1. 服务器端开发:Node.js 原生支持 CommonJS 模块,因此在服务器端开发中,特别是使用 Node.js 进行后端开发时,常常会选择使用 CommonJS 模块。
  2. 同步加载:CommonJS 模块是同步加载的,适合于服务器端的同步加载模块的环境。
  3. 动态加载:CommonJS 允许在运行时动态加载模块,这使得它在某些需要动态加载的情况下更为适用。
  4. 模块化封装:CommonJS 模块更适合于封装和组织代码,尤其是对于那些需要将功能打包为模块并在不同项目中重复使用的情况。

ES6 模块的使用场景:

  1. 浏览器端开发:现代浏览器原生支持 ES6 模块,因此在前端开发中,特别是使用现代浏览器的前端开发时,常常会选择使用 ES6 模块。
  2. 静态加载:ES6 模块是静态加载的,这意味着在解析阶段就已经确定模块的依赖关系,适合于前端项目中对模块依赖有明确要求的情况。
  3. 异步加载:ES6 模块支持异步加载,可以通过 import() 函数实现按需加载,这使得它在前端项目中更适用于动态加载和按需加载的场景。
  4. 模块化打包:使用工具如 Webpack、Rollup 等可以将 ES6 模块打包成浏览器可识别的代码,这样可以将多个模块打包成一个或多个文件,减少网络请求,提高加载效率。

综上所述,CommonJS 更适用于服务器端开发和同步加载的场景,而 ES6 模块更适用于浏览器端开发和静态加载的场景。在选择使用模块系统时,应根据具体的项目需求和目标环境做出合适的选择。

相关文章:

common.js和es6中模块引入的区别

common.js CommonJS 是一种模块系统,主要用于 Node.js 环境。它使用 require 函数来引入模块,并使用 module.exports 来导出模块。 语法: 导出模块: // moduleA.js const name Jo; module.exports name;// 或者导出一个对象…...

关于对pagination.js源代码进行修改且引入项目使用

实现效果 使用定时器对组件进行每秒请求&#xff0c;每过固定时间之后&#xff0c;进行下一页项目请求&#xff0c;进行到最后一页请求的时候返回第一页。 首先引入js插件 <script src"./js/pagination.js" type"text/javascript"></script>…...

《思考总结》

思考总结 ==标题==:卷积操作的作用1. **特征提取**2. **参数共享**3. **降维和数据压缩**4. **提升计算效率**5. **平滑和去噪**卷积操作示例输入图像卷积核卷积过程总结==标题==:上卷积什么是上卷积(反卷积/转置卷积)上卷积的作用上卷积的实现1. **最近邻插值(Nearest Ne…...

使用QT绘制简单的动态数据折线图

两个核心类时QChart和QLineSeries 下面这个示例代码中&#xff0c;定时器每隔一段时间将曲线图中的数据点向右移动 一个单位&#xff0c;同时调整横坐标轴的范围&#xff0c;实现了一次滚动对应移动一个数据点的效果。 QLineSeries最多容纳40961024个点 #include <QtWidg…...

Linux-centos7 nvm使用

NVM下载使用 文件夹创建拉取nvm包在~/.bashrc的末尾&#xff0c;添加如下语句验证nvm是否安装成功 文件夹创建 mkdir /root/home/software/拉取nvm包 cd /root/home/software/ wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.38.0.tar.gz tar xvzf v0.38.0.tar.g…...

【Linux】Linux环境基础开发工具_6

文章目录 四、Linux环境基础开发工具gdb 未完待续 四、Linux环境基础开发工具 gdb 我们已经可以写代码了&#xff0c;也能够执行代码了&#xff0c;但是代码错了该如何调试呢&#xff1f;Linux中可以使用 gdb 工具进行调试。 我们写一个简单的程序&#xff1a; 但是我们尝试…...

Redis宣布商用后,Redis国产化替代方案有那些?

一、背景 Redis作为使用最为广泛的开源缓存中间件&#xff0c;现已成为IT开发中必不可少的核心组件。官方修改协议印证了“开源”不意味着“无偿使用”&#xff0c;相关限制或将对基于开源Redis提供中间件产品的厂商&#xff0c;及提供Redis服务的云厂商产生一定影响。 二、国…...

Go API

Go语言提供了大量的标准库&#xff0c;因此 google 公司也为这些标准库提供了相应的API文档&#xff0c;用于告诉开发者如何使用这些标准库&#xff0c;以及标准库包含的方法。官方位置&#xff1a;https://golang.org Golang中文网在线标准库文档: https://studygolang.com/p…...

基于STM32的简易智能家居设计(嘉立创支持)

一、项目功能概述 1、OLED显示温湿度、空气质量&#xff0c;并可以设置报警阈值 2、设置4个继电器开关&#xff0c;分别控制灯、空调、开关、风扇 3、设计一个离线语音识别系统&#xff0c;可以语音控制打开指定开关、并且可以显示识别命令词到OLED屏上 4、OLED实时显示&#…...

【YOLOv5/v7改进系列】改进池化层为RT-DETR的AIFI

一、导言 Real-Time DEtection TRansformer&#xff08;RT-DETR&#xff09;&#xff0c;是一种实时端到端目标检测器&#xff0c;克服了Non-Maximum Suppression&#xff08;NMS&#xff09;对速度和准确性的影响。通过设计高效的混合编码器和不确定性最小化查询选择&#xf…...

使用Python和Matplotlib绘制复杂数学函数图像

本文介绍了如何使用Python编程语言和Matplotlib库来绘制复杂的数学函数图像。通过引入NumPy库的数学函数,我们可以处理包括指数函数在内的各种复杂表达式。本文详细讲解了如何设置中文字体以确保在图像中正确显示中文标题和标签,并提供了一个完整的代码示例,用户可以通过输入…...

淘宝/1688获得店铺的所有商品(商品列表)

通过以下步骤&#xff0c;可以获得淘宝或1688店铺的所有商品。请注意&#xff0c;具体步骤可能会因为平台的更新而有所改变&#xff0c;可以根据实际情况进行操作。 更多API调用展示以及获取Key和secret请移步 返回数据格式&#xff1a; {"user": null,"ite…...

【MySQL】锁机制

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ …...

LangChain入门学习笔记(一)——Hello World

什么是LangChain LangChain是一个开源&#xff08;github repo&#xff09;的大语言模型应用开发框架&#xff0c;提供了一整套的工具、方法和接口去帮助程序员构建基于大语言模型的端到端应用。LangChain是长链&#xff08;long chain&#xff09;的意思&#xff0c;它的一个…...

[ROS 系列学习教程] 建模与仿真 - 使用 Arbotix 控制机器人

ROS 系列学习教程(总目录) 本文目录 一、Arbotix 简介二、安装Arbotix三、配置Arbotix控制器四、配置launch启动文件五、数据交互接口六、在rviz中仿真控制机器人6.1 直接发topic控制6.2 使用键盘控制6.3 编写代码控制机器人移动 前面讲了机器人的建模&#xff0c;是静态的&…...

java:使用JSqlParser给sql语句增加tenant_id和deleted条件

# 示例代码 【pom.xml】 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-core</artifactId><version>3.4.3.1</version> </dependency>【MyJSqlParserTest.java】 package com.chz.myJSqlParser;pu…...

华三HCL模拟器安装及华三防火墙配置

0、前言 最近跟模拟器杠上了&#xff0c;主要是需要运行防火墙&#xff0c;目前已经成功模拟出华为、山石防火墙&#xff0c;而且模拟出来的设备能与物理网络环境进行互联。现在我又盯上华三防火墙了。 首先下载模拟器&#xff1a; 下载地址&#xff1a;H3C网络设备模拟器官方免…...

MySQL基础---库的操作和表的操作(配着自己的实操图,简单易上手)

绪论​ 勿问成功的秘诀为何&#xff0c;且尽全力做您应该做的事吧。–美华纳&#xff1b;本章是MySQL的第二章&#xff0c;本章主要写道MySQL中库和表的增删查改以及对库和表的备份处理&#xff0c;本章是基于上一章所写若没安装mysql可以查看Linux下搭建mysql软件及登录和基本…...

【6】第一个Java程序:Hello World

一、引言 Java&#xff0c;作为一种广泛使用的编程语言&#xff0c;其强大的跨平台能力和丰富的库函数使其成为开发者的首选。对于初学者来说&#xff0c;编写并运行第一个Java程序是一个令人兴奋的时刻。本文将指导你使用Eclipse这一流行的集成开发环境&#xff08;IDE&#…...

pytorch神经网络训练(AlexNet)

导包 import osimport torchimport torch.nn as nnimport torch.optim as optimfrom torch.utils.data import Dataset, DataLoaderfrom PIL import Imagefrom torchvision import models, transforms 定义自定义图像数据集 class CustomImageDataset(Dataset): 定义一个自…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

无头浏览器技术:Python爬虫如何精准模拟搜索点击

1. 无头浏览器技术概述 1.1 什么是无头浏览器&#xff1f; 无头浏览器是一种没有图形用户界面&#xff08;GUI&#xff09;的浏览器&#xff0c;它通过程序控制浏览器内核&#xff08;如Chromium、Firefox&#xff09;执行页面加载、JavaScript渲染、表单提交等操作。由于不渲…...

2025-06-08-深度学习网络介绍(语义分割,实例分割,目标检测)

深度学习网络介绍(语义分割,实例分割,目标检测) 前言 在开始这篇文章之前&#xff0c;我们得首先弄明白&#xff0c;什么是图像分割&#xff1f; 我们知道一个图像只不过是许多像素的集合。图像分割分类是对图像中属于特定类别的像素进行分类的过程&#xff0c;即像素级别的…...

HarmonyOS-ArkUI 自定义弹窗

自定义弹窗 自定义弹窗是界面开发中最为常用的一种弹窗写法。在自定义弹窗中&#xff0c; 布局样式完全由您决定&#xff0c;非常灵活。通常会被封装成工具类&#xff0c;以使得APP中所有弹窗具备相同的设计风格。 自定义弹窗具备的能力有 打开弹窗自定义布局&#xff0c;以…...

【Redis】Redis 的持久化策略

目录 一、RDB 定期备份 1.2 触发方式 1.2.1 手动触发 1.2.2.1 自动触发 RDB 持久化机制的场景 1.2.2.2 检查是否触发 1.2.2.3 线上运维配置 1.3 检索工具 1.4 RDB 备份实现原理 1.5 禁用 RDB 快照 1.6 RDB 优缺点分析 二、AOF 实时备份 2.1 配置文件解析 2.2 开启…...