🔥第2节:Node.js 基础语法与模块系统
🌟 引言
大家好,我是老曹。上一节课我们学习了 Node.js 的安装与第一个程序的运行,今天我们将深入探讨 Node.js 的核心——模块化开发。模块化是现代编程的灵魂,Node.js 采用 ***monJS 规范来组织代码,帮助开发者实现清晰、高效的项目结构。本节课我们将全面解析 require、module.exports 的使用方法,并介绍 Node.js 内置模块的功能。最后,我还会分享 10 道高频面试题,助你轻松应对技术面试!
📚 课程目标
- 掌握 ***monJS 模块机制的核心概念。
- 熟悉
require和module.exports的用法。 - 学习 Node.js 内置模块的基本功能。
- 通过 10 道高频面试题巩固知识点。
🎯 教学内容
🔹 1. 什么是模块化?
🌟 模块化是一种将代码分割为独立、可复用单元的编程思想。在 Node.js 中,每个文件都被视为一个独立的模块,模块之间通过 require 导入和 module.exports 导出。
-
优势:
- 提高代码可维护性。
- 减少命名冲突。
- 支持代码复用。
🔹 2. ***monJS 模块机制
📦 Node.js 使用 ***monJS 规范来管理模块,主要包括以下几个关键点:
✅(1) require 导入模块
-
require是用于加载模块的函数,支持以下几种导入方式:const fs = require('fs'); // 加载内置模块 const math = require('./math.js'); // 加载自定义模块 const lodash = require('lodash'); // 加载第三方模块
✅(2) module.exports 导出模块
-
module.exports是模块的导出对象,可以导出变量、函数或类:// math.js const add = (a, b) => a + b; const subtract = (a, b) => a - b; module.exports = { add, subtract }; -
在其他文件中使用:
const math = require('./math.js'); console.log(math.add(2, 3)); // 输出 5 console.log(math.subtract(5, 2)); // 输出 3
✅(3) exports 快捷方式
-
exports是module.exports的快捷引用,适用于单个导出项:// utils.js exports.greet = () => 'Hello, World!'; -
使用时:
const utils = require('./utils.js'); console.log(utils.greet()); // 输出 "Hello, World!"
注意:
exports只能添加属性,不能直接赋值。如果需要完全替换导出对象,请使用module.exports。
🔹 3. 内置模块介绍
📦 Node.js 提供了许多强大的内置模块,以下是常用的几个模块及其功能:
✅(1) fs(文件系统)
- 用于操作文件和目录:
const fs = require('fs'); fs.readFile('file.txt', 'utf8', (err, data) => { if (err) throw err; console.log(data); });
✅(2) path(路径处理)
- 处理文件路径:
const path = require('path'); console.log(path.join(__dirname, 'file.txt')); // 合并路径
✅(3) os(操作系统信息)
- 获取系统信息:
const os = require('os'); console.log(os.cpus()); // 查看 CPU 信息 console.log(os.totalmem()); // 查看总内存
✅(4) http(创建 HTTP 服务器)
- 创建基础的 HTTP 服务:
const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello, Node.js!'); }); server.listen(3000, () => console.log('Server running at http://localhost:3000/'));
🔹 4. 实战案例:封装工具模块
📝 我们来封装一个简单的数学工具模块 math.js,并在主文件中使用它。
✅步骤 1:创建模块
// math.js
const add = (a, b) => a + b;
const multiply = (a, b) => a * b;
module.exports = { add, multiply };
✅步骤 2:使用模块
// main.js
const math = require('./math.js');
console.log(math.add(2, 3)); // 输出 5
console.log(math.multiply(4, 5)); // 输出 20
🔹 5. 10 大高频面试题
🎯 以下是关于 Node.js 模块化的常见面试问题及答案:
-
问:Node.js 中的模块是什么?
- 答:模块是 Node.js 中独立的代码单元,每个文件就是一个模块,模块之间通过
require和module.exports进行交互。
- 答:模块是 Node.js 中独立的代码单元,每个文件就是一个模块,模块之间通过
-
问:***monJS 和 ES Module 的区别是什么?
- 答:***monJS 使用
require和module.exports,主要用于 Node.js;ES Module 使用import和export,是标准化的模块规范。
- 答:***monJS 使用
-
问:如何导出多个函数或变量?
- 答:可以通过
module.exports或exports导出多个成员,例如:module.exports = { func1, func2 };
- 答:可以通过
-
问:
require是同步还是异步的?- 答:
require是同步的,因此不适合动态加载模块。
- 答:
-
问:Node.js 的核心模块有哪些?
- 答:常见的核心模块包括
fs、path、http、os、util等。
- 答:常见的核心模块包括
-
问:如何加载 JSON 文件?
- 答:直接使用
require即可,例如:const data = require('./data.json');
- 答:直接使用
-
问:
__dirname和__filename分别表示什么?- 答:
__dirname表示当前文件所在目录路径,__filename表示当前文件的完整路径。
- 答:
-
问:如何避免循环依赖问题?
- 答:尽量减少模块间的强耦合,确保模块的依赖关系是单向的。
-
问:
exports和module.exports的区别是什么?- 答:
exports是module.exports的快捷引用,只能添加属性;如果需要完全替换导出对象,需使用module.exports。
- 答:
-
问:如何动态加载模块?
- 答:可以使用
require动态拼接模块路径,例如:const moduleName = './dynamicModule'; const module = require(moduleName);
- 答:可以使用
📝 练习任务
- 封装一个工具模块
utils.js,包含以下函数:-
greet(name):返回欢迎语。 -
random(min, max):生成指定范围内的随机数。
-
- 在主文件中导入并测试该模块。
🔁 拓展建议
✨ 如果你想进一步提升,可以尝试以下拓展任务:
- 学习 ES Module 的用法,并将其与 ***monJS 对比。
- 阅读 Node.js 官方文档,深入了解内置模块的功能。
🏆 总结
🎉 本节课我们学习了 Node.js 的模块化开发,掌握了 require 和 module.exports 的用法,并了解了常用内置模块的功能。通过实战案例和高频面试题,相信你已经对模块化有了更深刻的理解!下一节课我们将进入异步编程的世界,学习回调函数、Promise 和 async/await 的使用。期待与大家再次见面!
希望老曹这节课对你有所帮助,我们下节课见! 😊