@jarringslee
Node.js支持两种模块化标准。CommonJS是为nodejs打包js代码的原始方式。Nodejs还支持浏览器和其他JS运行时使用的ECMAScript模块标准。在nodejs中,每个文件都被视为一个单独的模块。
概念: 项目是由多个文件模块组成的
我们创建了一个js文件,可以在这个文件中引入多个nodejs模块 比如fs path http query string 甚至自定义js模块文件如utils.js
好处: 提高了代码的复用性、按需加载、独立作用域(相互独立,不用担心变量名冲突等问题)
用法: 通过标准语法导出或导入进行使用,来实现每个独立模块之间的联系
这样的标准被称为 CommonJS标准
如: 定义一个 utils.js 模块,封装基地址和求数组总和的函数
方法:
导出: module.exports = {}
在一个文件中,我们编写了一个网址,一个求数组总和函数,现在将其进行封装并对外使用:
const baseURL = 'https://pvp.qq.com'
const getArraySum = arr => arr.reduce((sum, val) => sum += val, 0)
module.exports = {
对外属性名1: baseURL,
对外属性名2: getArraySum
}
导入: require('模块名或路径')
在别的文件中,我们通过require和文件路径来获取文件。
// 导入
const obj = require('./7-CommonJS语法.js')
console.log(obj)
const sum = obj.getSum([4, 5, 6, 7, 8])
console.log(sum)
终端中控制台打印信息:
PS C:\Users\lenovo\Desktop\ljlvscode\nodejs> node 8-使用模块.js
{ name1: 'https://pvp.qq.com', name2: [Function: getArraySum] }
30
依旧定义一个模块,封装并导出一个基地址url和一个求数组元素总和的函数
默认标准使用方法:
导出: export default {}
const baseURL = 'https://pvp.qq.com'
const getArraySum = arr => arr.reduce((sum, val) => sum += val, 0)
export defult = {
对外属性名1: baseURL,
对外属性名2: getArraySum
}
导入: import 变量名 from '模块名或路径'
import obj from '模块名或路径'
// obj就等于export defult导出的对象
注意: Node.js默认支持的是Commonjs语法,如果想使用ECMSAScript标准,需要在运行模块所在的文件夹新建 package.json 文件,并设置 :
注意,文件夹中若有了这个文件,将无法使用nodejs默认的commonjs模块体系(如fs、path等)
{ "type" : "module" }
import obj from './9-ECMAScript标准.js'
console.log(obj)
const sum = obj.ljlsum([4, 5, 6, 7, 8])
console.log(sum)
输出:
PS C:\Users\lenovo\Desktop\ljlvscode\nodejs> node 10-使用模块2.js
{ ljlurl: 'https://pvp.qq.com', ljlsum: [Function: getArraySum] }
30
依旧定义一个模块,封装并导出一个基地址url和一个求数组元素总和的函数
命名标准的使用:
导出: export 修饰定义语句 直接在想要导出的常量前加export修饰词即可
export const baseURL = 'https://pvp.qq.com'
export const getArraySum = arr => arr.reduce((sum, val) => sum += val, 0)
导入: import { 同名变量 } from '模块名或路径'
import { baseURL, getArraySum } from '模块名或路径'
如何选择命名还是默认: 当我们需要按需加载 即只需要某个文件中的某几个变量的时候用命名。
命名和默认的导入导出可以同时使用。
包的概念 将模块、代码、其他资料聚合成一个文件夹
一个包里面可以包含很多模块和其他资料
包的分类:
要求:在每个包的根目录中,必须有package.json文件,记录包的清单信息
注意:倒入软件包时,你入的默认是index.js文件 / main属性指定的模块文件
{
"name": "czutils", // 软件包名称
"version": "1.0.0", // 软件包当前版本
"description": "一个数组和字符串常用工具方法的包", // 软件包简短描述
"main": "index.js", // 软件包入口点
"author": "lijialin", // 软件包作者
"license": "LJL" // 软件包许可证(商用后可以用作者名字宣传)
}
再写一个需求:
封装:数组求和函数的模块、判断用户名和密码长度函数的模块,形成一个软件包
文件路径概览:
简单封装并运用一个包/
├── sever.js (主入口文件,导入工具包并使用其中的方法)
└── utils/ (自定义工具包的总目录)
├── index.js (工具包的入口文件,用于统一导出各功能模块)
├── package.json (工具包的配置文件,声明包信息或类型)
└── lib/ (工具模块文件夹,用于分类存放具体功能)
├── arr.js (数组相关工具函数)
└── str.js (字符串相关工具函数)
构造两个基本模块并初步封装
首先分别构造两个存放不同模块的js文件:
// arr.js
// 封装一个包:模块一:数组求和函数
const getArraySum = arr => arr.reduce((sum, val) => sum += val, 0)
module.exports = {
getArraySum
}
// str.js
// 封装一个包:模块二:校验用户名和密码长度的函数
// 要求:用户名至少8位,密码最少6位
const checkUserName = username => {
return username.length >= 8
}
const checkPassword = password => {
return password.length >= 6
}
module.exports = {
cUser: checkUserName,
cPwd: checkPassword
}
将这两个js文件统一放进一个文件夹(lib/)中,便于管理。
构造工具包入口index.js文件和配置package.json文件
创建index文件作为唯一出口模块,导入所有工具模块
// index.js
// 本文件时utils工具包的唯一出口,该文件夹中封装的所有方法都在此文件进行导出导入 / 对外暴露
// 作用:把所有工具模块集中起来,统一向外暴露
const { getArraySum: ljlsum } = require('./lib/arr.js')
// 解构赋值:大括号中,冒号左边为等号右边模块中的任意变量明名,冒号右边时获取过来时取的别名
const { cUser, cPwd } = require('./lib/str.js')
// 获取多个用逗号隔开,原名和新名相同时可以简写成一个
// 统一导出所有函数
module.exports = {
ljlsum,
cUser,
cPwd
}
创建配置文件并进行简单配置:
注意,json文件中通常不允许有注释
{
"name": "utils", // 包名(必须唯一,如果发布到 npm)
"version": "1.0.0", // 版本号,格式为 主.次.补丁
"description": "一个自定义的Node.js工具包,封装了数组与字符串处理方法",
"main": "index.js", // 包的入口文件,没有这一行的话默认是index文件(require('./utils') 实际导入的文件)
"author": "李佳林", // 作者,可选
"license": "MIT", // 开源协议
"keywords": ["utils", "node", "toolkit"], // 搜索关键词(可选)
"dependencies": {}, // 项目依赖(目前可以为空)
"devDependencies": {} // 开发依赖(目前可以为空)
}
将index文件、package文件和模块文件夹lib/统一封装进工具包文件夹utils/
在工具包外的js文件中进行可以进行导入并调用
// sever.js
// 导入封装好的utils软件包
const obj = require('./utils')
// 这里也可以用绝对路径:
// const path = require('path')
// const obj = require(path.join(__dirname, 'utils'))
console.log(obj)
console.log(obj.ljlsum([10, 22, 345]))
console.log(obj.cUser('d23d2W'))
console.log(obj.cPwd('213wqe213'))
终端输出结果:
PS C:\Users\lenovo\Desktop\ljlvscode\nodejs\13-简单的包> node sever.js
{
ljlsum: [Function: getArraySum],
cUser: [Function: checkUserName],
cPwd: [Function: checkPassword]
}
377
false
true
npm是nodejs标准的软件包管理器,起初是作为下载和管理nodejs包依赖的方式(即下载软件包、管理版本),但是其现在已经成为前端js中使用的工具。
使用:
初始化清单文件: 注意尽量用全英文路径名
npm init -y 即得到package.json文件,如果已有该文件就略过此命令
下载软件包:
npm i 软件包名称
使用软件包。
例如:需求:使用dayjs文件包来格式化日期时间
// 1. (可选)初始化项目清单文件 npm init -y
// 2. 下载软件包到当前项目 npm i dayjs
// 3. 使用软件包
const dayjs = require('dayjs')
const nowDateStr1 = dayjs().format('YYYY-MM-DD')
console.log(nowDateStr1)
const nowDateStr2 = dayjs().format('DD-MM-YYYY')
console.log(nowDateStr2)
PS C:\Users\lenovo\Desktop\ljlvscode\nodejs\14-npm-init> node sever.js
2025-11-11
11-11-2025
如果包的项目中不含node_modules文件,能否正常运行?
不能:缺少依赖的本地软件包
解决方法:终端输入命令:npm i
下载package.json记录的所有软件包
为什么给你传递的时候不含node_modules文件?
下载npm比传递快的多
两个小软件包介绍:
dayjs —— 轻量级日期时间处理库
作用与特点
dayjs是一个轻量、高效的日期处理库,用来格式化、计算、解析时间。
它的语法与moment.js相似,但体积更小(只有 2KB 左右)。常用于:
- 获取当前时间
- 格式化日期字符串
- 计算时间差
- 处理时间加减运算
安装方法
npm install dayjs或简写:
npm i dayjs使用方法
// 导入 dayjs const dayjs = require('dayjs') // 获取当前日期并格式化 const nowDate1 = dayjs().format('YYYY-MM-DD') console.log(nowDate1) // 输出示例:2025-10-29 const nowDate2 = dayjs().format('DD-MM-YYYY') console.log(nowDate2) // 输出示例:29-10-2025 // 获取当前时间 console.log(dayjs().format('HH:mm:ss')) // 22:15:08
lodash —— 实用工具函数库
作用与特点
lodash是一个功能非常强大的 JavaScript 实用工具库,
提供了大量用于操作数组、对象、字符串、函数等数据的便捷方法。常用于:
- 数组求最大/最小值
- 去重、排序、过滤
- 深拷贝对象
- 节流、防抖函数
- 对象属性处理
安装方法
npm install lodash或简写:
npm i lodash使用方法
// 导入 lodash const _ = require('lodash') // 数组最大值 console.log(_.max([1, 3, 5, 9, 2])) // 输出:9 // 数组去重 console.log(_.uniq([1, 2, 2, 3, 3, 4])) // 输出:[1, 2, 3, 4] // 对象深拷贝 const obj = { a: 1, b: { c: 2 } } const newObj = _.cloneDeep(obj) newObj.b.c = 999 console.log(obj.b.c) // 2(说明深拷贝成功)
软件包的区别:
nodemon作用:替代node命令,监测代码更改,自动重启程序
使用:
安装: npm i nodemon -g “-g”代表安装到全局环境中
PS C:\Users\lenovo\Desktop\ljlvscode\nodejs\14-npm-init> npm i nodemon -g
added 29 packages in 10s
4 packages are looking for funding
run `npm fund` for details
运行:nodemon执行带执行的js文件 注意带上终端所在文件夹组成路径
nodemon 14-npm-init/sever.js
PS C:\Users\lenovo\Desktop\ljlvscode\nodejs\14-npm-init> nodemon 14-npm-init/sever.js
[nodemon] 3.1.11
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,cjs,json
[nodemon] starting `node 14-npm-init/sever.js sever.js`
2025-11-13
13-11-2025
8
[nodemon] clean exit - waiting for changes before restart
需求:启动准备好的项目,修改代码保存后,观察自动重启应用程序
文件夹尽量用英文名
nodejs常用命令:
| 功能 | 命令 |
|---|---|
| 执行js文件 | node xxx.js |
| 初始化package.json | npm init -y |
| 下载本地软件包 | npm i 软件包名 |
| 下载全局软件包 | npm i 软件包名 -g |
| 删除软件包(全局加上-g) | npm uni 软件包名 |
nodejs模块化:
概念:每个文件都是独立模块,独立作用域,按需加载
使用:采用特定的标准语法导入导出进行使用
Commonjs标准: 一般用于Nodejs项目环境中
ECMAScript标准:一般用于前端工程化项目中
包:
概念:把模块文件、代码文件、其他资料聚合成一个文件夹