TechBlog
首页分类标签搜索关于

© 2025 TechBlog. All rights reserved.

Node.js基础模块化与包

11/23/2025

Node.js基础:模块化与包

Node.js基础:模块化与包

@jarringslee

模块化

Node.js支持两种模块化标准。CommonJS是为nodejs打包js代码的原始方式。Nodejs还支持浏览器和其他JS运行时使用的ECMAScript模块标准。在nodejs中,每个文件都被视为一个单独的模块。

概念: 项目是由多个文件模块组成的

我们创建了一个js文件,可以在这个文件中引入多个nodejs模块 比如fs path http query string 甚至自定义js模块文件如utils.js

CommonJS标准

好处: 提高了代码的复用性、按需加载、独立作用域(相互独立,不用担心变量名冲突等问题)

用法: 通过标准语法导出或导入进行使用,来实现每个独立模块之间的联系

这样的标准被称为 CommonJS标准

如: 定义一个 utils.js 模块,封装基地址和求数组总和的函数

方法:

  1. 导出: module.exports = {}

    在一个文件中,我们编写了一个网址,一个求数组总和函数,现在将其进行封装并对外使用:

    const baseURL = 'https://pvp.qq.com'
    const getArraySum = arr => arr.reduce((sum, val) => sum += val, 0)
    
    module.exports = {
    	对外属性名1: baseURL,
    	对外属性名2: getArraySum
    } 
    
    
  2. 导入: require('模块名或路径')

    • 内置模块:直接写名字(如 fs, path, http)
    • 自定义模块:写模块文件的路径(如./utils.js)

    在别的文件中,我们通过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
    
    

ECMAScript 标准 - 默认导出和导入

依旧定义一个模块,封装并导出一个基地址url和一个求数组元素总和的函数

默认标准使用方法:

  1. 导出: export default {}

    const baseURL = 'https://pvp.qq.com'
    const getArraySum = arr => arr.reduce((sum, val) => sum += val, 0)
    
    export defult = {
    	对外属性名1: baseURL,
    	对外属性名2: getArraySum
    } 
    
    
  2. 导入: 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

ECMAScript 标准 - 命名导出和导入

依旧定义一个模块,封装并导出一个基地址url和一个求数组元素总和的函数

命名标准的使用:

  1. 导出: export 修饰定义语句 直接在想要导出的常量前加export修饰词即可

    export const baseURL = 'https://pvp.qq.com'
    export const getArraySum = arr => arr.reduce((sum, val) => sum += val, 0)
    
    
  2. 导入: 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 软件包

npm是nodejs标准的软件包管理器,起初是作为下载和管理nodejs包依赖的方式(即下载软件包、管理版本),但是其现在已经成为前端js中使用的工具。

使用:

  1. 初始化清单文件: 注意尽量用全英文路径名

    npm init -y 即得到package.json文件,如果已有该文件就略过此命令

  2. 下载软件包:

    npm i 软件包名称

  3. 使用软件包。

例如:需求:使用dayjs文件包来格式化日期时间

  • 创建项目所在文件夹
  • 创建主文件sever.js
  • 打开终端:
    • 输入 npm init -y 初始化
    • 输入 npm i dayjs
  • 以此获取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

软件包的区别:

  • 本地软件包(dayjs、lodash等):当前项目内使用,封装属性和方法,存在于node_moudules
  • 全局软件包(nodemon等):本机所有项目使用,封装命令和工具,存在于系统设置的位置

nodemon作用:替代node命令,监测代码更改,自动重启程序

使用:

  1. 安装: 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
    
    
  2. 运行: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
    
    

需求:启动准备好的项目,修改代码保存后,观察自动重启应用程序

Node.js基础总结

文件夹尽量用英文名

  • nodejs常用命令:

    功能命令
    执行js文件node xxx.js
    初始化package.jsonnpm init -y
    下载本地软件包npm i 软件包名
    下载全局软件包npm i 软件包名 -g
    删除软件包(全局加上-g)npm uni 软件包名
  • nodejs模块化:

    概念:每个文件都是独立模块,独立作用域,按需加载

    使用:采用特定的标准语法导入导出进行使用

    Commonjs标准: 一般用于Nodejs项目环境中

    • 导出:module.exports = {}
    • 导入:require(‘模块名或路径’)

    ECMAScript标准:一般用于前端工程化项目中

    • 默认导出:export default {}
    • 默认导入:import 变量名 from ‘模块名或路径’
    • 命名导出:export 定义修饰语句
    • 命名导入:import { 同名变量 } from ‘模块名或路径’
  • 包:

    概念:把模块文件、代码文件、其他资料聚合成一个文件夹

    • 项目包:编写项目需求和业务逻辑的文件夹
    • 软件包:封装工具和方法来进行使用的文件夹(一般用npm管理)
      • 本地软件包(dayjs、lodash等):当前项目内使用,封装属性和方法,存在于node_moudules
      • 全局软件包(nodemon等):本机所有项目使用,封装命令和工具,存在于系统设置的位置