JS模块化总结 | CommonJS、ES6
BV13W42197jR 个人笔记
目录
- JS模块化基础知识
- 1. 概述
- 1.1 什么是模块化
- 1.2 为什么需要模块化?
- 2 模块化规范
- 3 导入&导出
- 4 CommonJS规范
- 4.1 初步体验
- 4.2 导出数据
- 4.3 导入数据
- 4.4 扩展理解
- 4.5 浏览器端运行
- 5 ES6模块化规范
- 5.1 初步体验
- 5.2 Node中运行ES6
- 5.3 导出数据
- ①分别导出
- ②统一导出
- ③默认导出
- 5.4 导入数据
- 练习题
- 6 AMD
- 7 CMD
JS模块化基础知识
1. 概述
1.1 什么是模块化
- 将程序文件依据一定规则拆分成多个文件,这种编码方式就是模块化的编码方式。简单来说就是一个 .js文件太大了,把它拆成几个js文件
- 拆分出来每个文件就是一个模块,模块中的数据都是私有的,模块之间互相隔离。
- 同时也能通过一些手段,可以把模块内的指定数据“交出去”,供其他模块使用。
1.2 为什么需要模块化?
随着应用的复杂度越来越高,其代码量和文件数量都会急剧增加,会逐渐引发以下问题:
1.全局污染问题
2.依赖混乱问题 比如script标签引入有顺序问题
3.数据安全问题
2 模块化规范
历史背景(了解即可): 2009年,随着Node.js的出现,JavaScript 在服务器端的应用逐渐增多,为了让Node.js 的代码更好维护,就必须要制定一种Node.,js环境下的模块化规范,来自Mozilla的工程师Kevin Dangoor提出了CommonJS规范(CommonJS初期的名字叫ServerJS,随后Node.js 社区采纳了这一规范。
随着时间的推移,针对JS的不同运行环境(浏览器、服务端),相继出现了多种模块化规范,按时间排序,分别为:
1. CommonJS —— 服务端应用广泛
2. AMD
3. CMD
4. ES6模块化 —— 浏览器端应用广泛
3 导入&导出
模块化的核心思想就是:模块之间是隔离的,通过导入和导出进行数据和功能的共享。
- 导出(暴露):模块公开其内部的一部分(如变量、函数等),使这些内容可以被其他模块使用。
- 导入(引入):模块引用和使用其他模块导出的内容,以重用代码和功能。

4 CommonJS规范
一般用在node环境下
4.1 初步体验
导入 require

- school.js
const name = '大学'
const slogan = '厚德载物'function getTel() {return '0101010'
}function getCities() {return ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
}exports.name = name
exports.slogan = slogan
exports.getTel = getTel
- student.js
const name = '李三'
const motto = '加油'function getTel() {return '13555555'
}function getHobby() {return ['swimming', 'badminton', 'football', 'basketball']
}exports.name = name
exports.motto = motto
exports.getTel = getTel
- index.js
const school = require('./school.js')
const student = require('./student.js')
console.log(school);
console.log(student);
- 入口文件运行

4.2 导出数据
在CommonJS标准中,导出数据有两种方式
第一种方式:module.exports = value //赋值为新对象
第二种方式:exports.name = value
- 示例
***第二种方式*******************
exports.name = name
exports.slogan = slogan
exports.getTel = getTel***第一种方式*******************
module.exports = {name: name,slogan: slogan,getTel: getTel
}***简写*******************
module.exports = {name,slogan,getTel
}
注意点:
① 每个模块内部的: this,exports, modules.exports 在初始时,都指向同一个空对象,该
空对象就是当前模块导出的数据,如下图:

② 无论如何修改导出对象,最终导出的都是 module.exports 的值。
③ exports是对 module.exports 的初始引用,仅为了方便给导出象添加属性,所以不能使用exports = value 的形式导出数据,但是可以使用module.exports = xxxx导出数据。
4.3 导入数据
导入语法 const school = require('./school.js')
常搭配对象解构使用 const {name, slogan, getTel} = require('./school.js')
- 出现的问题:多个require可能导致变量名冲突
- 解决方法:重命名
const {name: stuName, motto , getTel: stuTel} = require('./student.js')
4.4 扩展理解
怎么做到模块之间是隔离的?
怎么能直接使用module?exports?
一个JS模块在执行时,是被包裹在一个内置函数中执行的,所以每个模块都有自己的作用域
可以通过下面的语句打印验证 console.log(arguments.callee.toString())
内置函数的大致形式如下:function(exports, require, module, __filename, __dirname) {}
4.5 浏览器端运行
CJS设计之初就是为了在浏览器中运行的,以前的名字叫serverJS,但是通过引入JS却无法在浏览器上运行。
Node.js 默认是支持CommonJS规范的,但浏览器端不支持,所以需要经过编译,步骤如下:
第一步:全局安装browserify npm i browserify -g
第二步:编译 browserify index.js -o build.js 注:index.js是源文件,build.js是输出的目标文件
第三步:在页面中引入使用<script type="text/javascript" src="./build.js"> </script>
5 ES6模块化规范
ES6模块化规范是一界官方标准的规范,它是在语言标准的层面上实现了模块化功能,是目前最流行的模块化规范,且浏览器与服务端均支持该规范。
5.1 初步体验

- school.js 导出
export const name = '大学'
export const slogan = '厚德载物'export function getTel() {return '0101010'
}//没导出
function getCities() {return ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
}
- index.js导入
import * as school from './school.js'
console.log(school);
- index.html 注意ES6要在页面中运行
这里一定要写为type="module"
<body><script type="module" src="./index.js"></script>
</body>
5.2 Node中运行ES6
-
方法一
如果node版本是12及以上,可以直接把js文件后缀名改成 .mjs,这样node+index.js就可以运行了 -
方法二
在工程文件中新增一个 package.json

package.json里面加这一句话
{"type": "module"
}
运行成功:

5.3 导出数据
ES6模块化提供3种导出方式
①分别导出
②统一导出
③默认导出
备注:「上述多种导出方式,可以同时使用」
①分别导出
export const name = '大学'
export const slogan = '厚德载物'export function getTel() {return '0101010'
}export function getCities() {return ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
}
②统一导出
export {name,slogan,getTel} 这个不是对象
const name = '大学'
const slogan = '厚德载物'function getTel() {return '0101010'
}function getCities() {return ['beijing', 'shanghai', 'guangzhou', 'shenzhen']
}//统一导出
export {name,slogan,getTel} //这个不是对象
③默认导出
默认的英文名是default export default name
这里是对象
export default {name:name,slogan:slogan,getTel:getTel
}
- 用了三种导入方式后:

5.4 导入数据
对于ES6模块化来说,使用何种导入方式,要根据导出方式决定。
(1)导入全部 (通用)
import * as school from './school.js'
(2)命名导入:对应导出方式——分别导出、统一导出
import {name, slogan, getTel} from './school.js'
console.log(name);
console.log(slogan);
console.log(getTel);
可以改名 import {name as schoolName} from './school.js'


(3)默认导入:对应导出方式——默认导出

(4)命名导入 & 与默认导入可以混合使用

(5)动态导入 (通用)
现在不想用,以后用到的时候再导入

(6)import可以不接收任何数据
import './log.js' 这个JS模块可能是打印随机数的
- 解决了全局污染问题,神奇的 type=“module”
<script type="module" src="./index.js"></script>
练习题
- 打印什么(答案:1 1)

- 思考2:使用CommonJS规范,编写如下代码,输出结果是什么?
let sum = 1
function increment() {sum += 1
}
module.exports = {sum, increment}
const {sum, increment} = require('./data.js')
console.log(sum)
increment()
increment()
console.log(sum)
答案:1, 1
- 思考3:使用ES6模块化规范,编写上述代码,输出结果是什么?

答案:1 ,3
是编写代码中很重要的部分,export交出去就要只读了,所以sum要用const修饰
ES6 import和export共用一块内存,但CJS是复制
6 AMD
7 CMD
相关文章:
JS模块化总结 | CommonJS、ES6
BV13W42197jR 个人笔记 目录 JS模块化基础知识1. 概述1.1 什么是模块化1.2 为什么需要模块化? 2 模块化规范3 导入&导出4 CommonJS规范4.1 初步体验4.2 导出数据4.3 导入数据4.4 扩展理解4.5 浏览器端运行 5 ES6模块化规范5.1 初步体验5.2 Node中运行ES65.3 导出数据①分别…...
25考研计算机组成原理复习·3.5高速缓冲存储器
高速缓冲存储器Cache 工作原理:将某些主存块复制到Cache中,缓和CPU与主存之间的速度矛盾局部性原理 时间局部性:现在访问的地址,不久之后也很可能被再次访问空间局部性:现在访问的地址,其附近的地址也很可…...
餐厅管理系统
目录 一、 系统简介 1.1需求分析 1.2 编程环境与工具 二、 系统总体设计 2.1 系统的功能模块图。 2.2 各功能模块简介。 三、 主要业务流程 (1)用户及管理员登录流程图 (2)信息添加流程 (3…...
杭州百腾教育科技 TiDB 6.5 to 7.5 升级记录
作者: reAsOn2010 原文来源: https://tidb.net/blog/612103f3 背景 使用 TiDB 作为我们的全量数据库已经有六七年了,当时还是 2.0 版本。早期TiDB的迭代和新特性的发布对于实际使用的影响还是很大的,所以从那个时候开始就有每…...
Redis的缓存穿透、击穿、雪崩
目录 缓存穿透 定义: 解决方法: 缓存击穿 定义: 解决方案: 缓存雪崩 定义: 解决方案: 缓存穿透、缓存击穿和缓存雪崩的区别 缓存穿透 定义: 查询一个不存在的数据,数据库未…...
【Django开发】前后端分离django美多商城项目第1篇:欢迎来到美多 项目主要页面介绍【附代码文档】
本教程的知识点为: 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计: 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送 判断帐号是否存在 1. 判断用户名是否存在 后…...
【软件造价咨询】信息化项目预算评审看什么?
在信息化项目预算评审中,各方往往只重视预算金额部分,而忽视了项目建设的全局性和整体性把关,导致信息系统的重复建设、分散建设、业务和系统两张皮、重功能轻数据、重投资轻方案等问题频出,从而大幅降低财政投资效益。 例如&…...
第37讲:Cephfs文件系统的正确使用姿势
文章目录 1.Cephfs文件系统简介2.Cephfs文件系统细节介绍2.1.Cephfs文件系统多客户端隔离挂载2.2.Ceph集群中多个Cephfs如何单独使用 3.挂载多个Cephfs文件系统4.Cephfs文件系统多客户端隔离挂载实战4.1.创建一个Cephfs文件系统4.2.将Cephfs文件系统挂载到本地路径4.3.在Cephfs…...
单片机烧录
在设计芯片的时候,关于烧录的环节是一个不得不考虑的问题。 我们首先排除掉,由外部直接硬件操控FLASH 的方案,这个方案有很多缺点。 1、每个IC使用的FLASH型号是各不相同的,每种型号的FLASH的烧录命令和流程都有差别,这…...
mysql实现分布式锁
利用数据库的悲观锁实现分布式锁,实际应用中要考虑mysql的高可用。 DistributedLock.h #ifndef DistributedLock_H_ #define DistributedLock_H_// // DistributedLock.h: // #include "base/MySQLDriver.h" class CDistributedLock { public://// Construction/D…...
MySQL快速使用
关系型数据库(RDBMS):建立在关系模型基础上,由多张相互连接的二维表组成的数据库 特点:使用表存储数据,格式统一方便维护;使用SQL语言操作,标准统一使用方便 通用语法: …...
LeetCode41.缺失的第一个正数
1. 题目大意 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 2. 思路分析 示例 1: 输入:nums [3,4,-1,1] 输出:2 解释࿱…...
ee trade:黄金投资与股票投资的区别
黄金和股票, 是金融市场中两种常见的投资工具, 它们拥有截然不同的特点和风险, 了解它们的差异, 可以帮助投资者制定更合理的投资策略。 一、 投资性质: 避险与成长, 两种投资方向 黄金: 被视…...
AI视频创作原理
重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...
idea vue项目删除node_modules时报文件损坏且无法读取,导致删除失败
解决办法,查看node_modules所在盘,右击点击属性-工具,点击检查驱动,查完后修复即可, 就能够成功删除损坏的文件了...
Linux下编译安装-单机模式
1.1 Linux下编译安装-单机模式 1.1.1 安装 (1).把安装包放在Linux文件系统下 (2).解压缩 tar -zxf redis-4.0.2.tar.gz (3).切换到解压后的目录 cd redis-4.0.2(4).编译 make(5).进入到src目录 cd src(6).执行安装 make install(7) .返回上级目录 cd .. (8) .修改配置&…...
RSSI定位算法
文章目录 一、定位算法简介1.1. 定位技术原理1.2. 定位算法二、RSSI测距原理2.1. 建模与测量终端到基站的距离三、定位3.1. 三边定位算法3.2. 加权三边定位算法3.3. 加权三角形质心定位算法3.4. 程序定位算法的执行流程一、定位算法简介 1.1. 定位技术原理 定位终端接收到iBe…...
布局管理(Layouts)-Qt-思维导图-学习笔记
布局管理(Layouts) Qt 提供了非常丰富的布局类,主要包括以下基本布局管理类 QBoxLayout 提供了水平和垂直的布局管理,可以将子部件按行或列排列。根据排列方向的不同,QBoxLayout 分为 QHBoxLayout(水平布局)和 QVBox…...
《区块链赋能游戏业:破解虚拟资产交易与确权难题》
在当今数字化的时代,游戏行业正以前所未有的速度发展,虚拟资产在游戏中的重要性日益凸显。然而,虚拟资产的交易和确权问题一直困扰着游戏开发者和玩家。随着区块链技术的引入,为解决这些问题带来了新的曙光。 首先,我…...
机器学习第十一章-特征选择与稀疏学习
11.1子集收集与评价 属性称为"特征" ,对当前学习任务有用的属性称为"相关特征" 、没什么用的属性称为"无关特 征" . 从给定的特征集合中选择出相关特征于集的过程,称为"特征选择"。 特征选择是一个重要的"…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...
