【Node.js入门笔记11---模块化】
Node.js入门笔记11
- Node.js---模块化
- 一、Node.js模块化学习指南
- 1. CommonJS模块使用
- 2. ES6模块使用
- 3. 混合使用CommonJS与ES6模块
- 4. 核心模块与第三方模块
- 5. 模块解析机制
Node.js—模块化
什么是模块化?
将代码拆分为独立的功能块,每个模块负责特定功能,提高可维护性和复用性。编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块。
把代码进行模块化拆分的好处:大家都遵守同样的模块化规范写代码,降低了沟通的成本,极大方便了各个模块之间的相互调用利人利己。
① 提高了代码的复用性
② 提高了代码的可维护性
③ 可以实现按需加载
Node.js 中模块的分类
Node.js 中根据模块来源的不同,将模块分为了 3 大类,分别是:
内置模块(内置模块是由 Node.s 官方提供的,例如 fs、path、http 等)
自定义模块(用户创建的每个 .js 文件,都是自定义模块)
第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)
一、Node.js模块化学习指南
1. CommonJS模块使用
Node.js 遵循了 CommonJS 模块化规范,CommonJS 规定了模块的特性和各模块之间如何相互依赖.
CommonJS 规定:
① 每个模块内部,module 变量代表当前模块。
② module 变量是一个对象,它的 exports 属性(即 module.exports)是对外的接口,
③ 加载某个模块,其实是加载该模块的 module.exports 属性。
导出模块
导出模块:
// math.js
const add = (a, b) => a + b;
module.exports = { add }; // 导出对象
// 或直接导出单个函数
// exports.add = add;
导入模块:
// app.js
const math = require('./math.js');
console.log(math.add(2, 3)); // 输出: 5
模块拆分与复用:
// config.js
module.exports = {
port: 3000,
dbUrl: 'mongodb://localhost:27017/mydb'
};
// server.js
const { port, dbUrl } = require('./config');
console.log(`Server running on port ${port}`);
2. ES6模块使用
- 启用ES6模块
方法1:文件后缀名为 .mjs
// utils.mjs
export const capitalize = (str) => str.toUpperCase();
方法2:在 package.json 中设置
{
"type": "module"
}
- 导出与导入
// app.mjs
import { capitalize } from './utils.mjs';
console.log(capitalize('hello')); // 输出: HELLO
- 默认导出
// logger.mjs
const log = (message) => console.log(`[INFO] ${message}`);
export default log;
// app.mjs
import logger from './logger.mjs';
logger('Module loaded'); // 输出: [INFO] Module loaded
3. 混合使用CommonJS与ES6模块
- 在CommonJS中引入ES6模块
// 需使用动态导入(异步)
import('./utils.mjs').then(({ capitalize }) => {
console.log(capitalize('hello'));
});
- 在ES6模块中引入CommonJS
// utils.cjs
exports.add = (a, b) => a + b;
// app.mjs
import { add } from './utils.cjs';
console.log(add(2, 3)); // 输出: 5
- CommonJS vs ES6模块
4. 核心模块与第三方模块
- 使用Node.js内置模块
const fs = require('fs'); // CommonJS
// 或
import fs from 'fs'; // ES6
- 安装与使用第三方模块
npm install lodash # 安装lodash
const _ = require('lodash'); // CommonJS
// 或
import _ from 'lodash'; // ES6
console.log(_.chunk([1, 2, 3, 4], 2)); // 输出: [[1,2], [3,4]]
5. 模块解析机制
-
查找顺序
内置模块(如 fs、path) → node_modules → 文件路径模块。
示例:require(‘my-module’) 会依次查找:
Node.js核心模块
./node_modules/my-module
上级目录的 node_modules(递归查找) -
文件夹模块
若路径指向文件夹,Node.js会查找:
package.json 中的 main 字段指定文件
默认查找 index.js