模块化简介

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

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

好处:提高代码复用性,按需加载独立作用域

使用:需要标准语法导出和导入进行使用

image-20230331150407659.png

CommonJS标准

因为模块内的属性和函数都是私有的,如果对外使用,需要使用标准语法导出和导入才可以,而这个标准叫 CommonJS 标准

使用

  1. 导出:module.exports = {}
  2. 导入:require('模块名或路径')

模块名或路径

  • 内置模块:直接写名字(例如:fs,path,http)
  • 自定义模块:写模块文件路径(例如:./utils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
// 自定义模块,封装求数组和的函数,并导出
const URL = 'https://m78alien.github.io/'
const getArraySum = arr => arr.reduce((sum, val) => sum += val, 0)

module.exports = {
    url: URL,
    sum: getArraySum
}

// 导入自定义模块,使用函数
const obj = require('./nodeutil02.js')
console.log(obj)
console.log(obj.sum([1, 5, 7, 2]));

image.png

ECMAScript标准

默认导出和导入

默认标准使用

  1. 导出:export default {}
  2. 导入:import 变量名 from '模块名或路径'

注意:Node.js 默认支持 CommonJS 标准语法 如需使用 ECMAScript 标准语法,在运行模块所在文件夹新建 package.json 文件,并设置 { "type" : "module" }

image.png

1
{"type": "module"}
1
2
3
4
5
6
7
8
9
10
// ECMAScript标准导出
export default {
    url: URL,
    sum: getArraySum
}

// ECMAScript标准导入
import obj from './nodeutil02.js'
console.log(obj)
console.log(obj.sum([1, 5, 7, 2]));

命名导出和导入

命名标准使用

  1. 导出:export 修饰定义语句
  2. 导入:import { 同名变量 } from '模块名或路径'

如何选择:

  • 按需加载,使用命名导出和导入
  • 全部加载,使用默认导出和导入
1
2
3
4
5
6
7
8
// 命名导出
export const URL = 'https://m78alien.github.io/'
export const getArraySum = arr => arr.reduce((sum, val) => sum += val, 0)

//命名导入
import {URL, getArraySum} from './nodeutil02.js'
console.log(URL)
console.log(getArraySum([1, 5, 7, 2]));

包的概念

:将模块,代码,其他资料聚合成一个文件夹

包分类

  • 项目包:主要用于编写项目和业务逻辑
  • 软件包:封装工具和方法进行使用

要求:根目录中,必须有 package.json 文件(记录包的清单信息)

注意:导入软件包时,引入的默认是 index.js 模块文件 / main 属性指定的模块文件

image-20230331154639881.png

image-20230331154702306.png

  • util文件夹是自定义的包
  • lib文件夹将相关代码封装
  • index.js是统一出口,将所以的方法都导出
  • package.json是记录包的信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// index.js导出所有函数方法
const { getArraySum } = require('./lib/arr.js')
const { checkUser, checkPwd } = require('./lib/str.js')
// 统一导出所有函数
module.exports = {
    getArraySum,
    checkUser,
    checkPwd
}

// 外部调用时,只需要导入包名即可
const obj = require('./utils')
console.log(obj)
const result = obj.getArraySum([10, 20, 30])
console.log(result)

npm软件包管理器

定义: npm是Node.js标准的软件包管理器,用于下载和管理Node.js环境中的软件包

使用

  1. 初始化清单文件 :npm init -y(得到 package.json 文件,有则跳过此命令)
  2. 下载软件包 :npm i 软件包名称
  3. 使用软件包

注意-y 就是所有选项用默认值,所在文件夹不要有中文/特殊符号,建议英文和数字组成,因为 npm 包名限制建议用英文和数字或者下划线中划线

image-20230331155537983.png

  1. npm init -y:初始化清单文件package.json文件,如果已经定义可以跳过
1
2
3
4
5
6
7
8
9
10
11
12
{
  "name": "demo01",
  "version": "1.0.0",
  "description": "",
  "main": "nodetest01.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
  1. npm i 软件包名:下载软件包,会生成node_modulespackage-lock.json文件和文件夹
  • npm会将记录到的包信息写入package.json文件
  • package-lock.json固化软件包的版本
  • node_modules是软件包的源码
  1. 导入使用
1
2
3
4
const dayjs = require('dayjs')
const nowDate = dayjs().format('YYYY-MM-DD')
console.log(dayjs);
console.log(nowDate);

安装所有依赖

问题:当下载别人的项目时,没有node_modules文件夹,不能正常调用软件包

原因:通常项目当中不放node_modules文件夹,是因为自己用npm下载比磁盘拷贝快,所以需要自己下载

解决

  1. package.json文件当中包含使用的包信息,package-lock.json固化软件包的版本
  2. 项目终端输入命令: npm i,就可以下载全部记录的软件包了

全局软件包 nodemon

软件包区别

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

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

使用

  1. 安装:npm i nodemon -g(-g 代表安装到全局环境中)
  2. 运行:nodemon 待执行的目标 js 文件

注意

  • 可能出现下图错误,是因为系统禁止运行脚本导致的,通过设置执行策略为RemoteSigned,可以解决脚本运行的限制。
  • 在终端管理员模式中,输入一下命令:set-ExecutionPolicy RemoteSigned

image.png