Appearance
Node.js 基础面试题
1. 什么是 Node.js?
问题:什么是 Node.js?它有什么特点?
答案: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,让 JavaScript 可以在服务器端运行。
主要特点:
- 事件驱动:使用事件驱动架构,适合高并发场景
- 非阻塞 I/O:异步 I/O 操作,不会阻塞主线程
- 单线程:使用单线程模型,通过事件循环处理并发
- 跨平台:支持 Windows、Linux、macOS 等多种平台
- 丰富的生态:拥有 npm 包管理器,生态丰富
2. Node.js 的应用场景
问题:Node.js 适合哪些应用场景?
答案:
适合的场景:
- 实时应用:聊天室、在线游戏、实时推送
- API 服务:RESTful API、GraphQL API
- 微服务:轻量级微服务架构
- 工具链:构建工具、CLI 工具
- 流式处理:文件处理、数据转换
- 单页应用:SPA 的服务端渲染
不适合的场景:
- CPU 密集型任务:视频编码、图像处理、复杂计算
- 内存密集型应用:大数据处理、内存数据库
3. Node.js 的优缺点
问题:Node.js 有哪些优缺点?
答案:
优点:
- 高并发处理能力
- 开发效率高,前后端使用同一种语言
- 活跃的社区和丰富的模块
- 适合 I/O 密集型应用
- 部署简单,启动快速
缺点:
- 不适合 CPU 密集型任务
- 单线程模型,一个错误可能导致整个进程崩溃
- 回调地狱问题(可以通过 Promise/async-await 解决)
- 类型安全较弱(可以使用 TypeScript 改善)
4. CommonJS 和 ES Module 的区别
问题:CommonJS 和 ES Module 有什么区别?
答案:
| 特性 | CommonJS | ES Module |
|---|---|---|
| 语法 | require/module.exports | import/export |
| 加载方式 | 运行时同步加载 | 编译时静态加载 |
| 加载时机 | 运行时动态加载 | 编译时确定依赖 |
| 循环依赖 | 支持,但可能有问题 | 支持,有更好的处理 |
| 使用方式 | Node.js 默认 | 需要 .mjs 或 type: module |
| 顶级 await | 不支持 | 支持 |
5. Node.js 的全局对象
问题:Node.js 中有哪些重要的全局对象?
答案:
全局对象:
global:全局命名空间对象process:当前进程信息Buffer:二进制数据处理console:控制台输出__dirname:当前文件所在目录__filename:当前文件路径setTimeout/setInterval:定时器
process 对象常用属性:
javascript
process.argv // 命令行参数
process.env // 环境变量
process.pid // 进程 ID
process.cwd() // 当前工作目录
process.exit() // 退出进程6. Node.js 的模块加载机制
问题:Node.js 是如何加载模块的?
答案:
模块加载流程:
- 路径分析:确定模块路径
- 文件定位:查找具体的文件
- 编译执行:编译并执行模块代码
模块查找顺序:
- 核心模块(如 fs、http)
- 相对路径模块(以 ./ 或 ../ 开头)
- 绝对路径模块
- 第三方模块(从 node_modules 查找)
文件扩展名查找顺序:
- .js
- .json
- .node
- 目录(查找 package.json 的 main 字段或 index.js)
7. package.json 的作用
问题:package.json 文件有什么作用?
答案:
主要作用:
- 项目描述:名称、版本、描述、作者等信息
- 依赖管理:dependencies、devDependencies
- 脚本命令:scripts 字段定义命令
- 入口文件:main 字段指定入口
- 模块类型:type 字段指定模块系统
- 引擎要求:engines 字段指定 Node.js 版本
常用字段:
json
{
"name": "my-project",
"version": "1.0.0",
"main": "index.js",
"type": "module",
"scripts": {
"start": "node index.js",
"test": "jest"
},
"dependencies": {
"express": "^4.18.0"
},
"devDependencies": {
"nodemon": "^2.0.0"
}
}8. npm 和 yarn 的区别
问题:npm 和 yarn 有什么区别?
答案:
| 特性 | npm | yarn |
|---|---|---|
| 安装速度 | 较慢 | 较快(并行下载) |
| 锁定文件 | package-lock.json | yarn.lock |
| 安全性 | 需要额外配置 | 默认更安全 |
| 离线模式 | 不支持 | 支持 |
| 工作区 | 支持 | 原生支持更好 |
常用命令对比:
bash
# 安装依赖
npm install # yarn
yarn install # yarn
# 添加依赖
npm install express # yarn add express
npm install -D jest # yarn add -D jest
# 运行脚本
npm run start # yarn start
npm run test # yarn test9. Node.js 的错误处理
问题:Node.js 中有哪些错误处理方式?
答案:
错误处理方式:
- try-catch:同步代码错误处理
javascript
try {
const data = fs.readFileSync('file.txt');
} catch (err) {
console.error('读取文件失败:', err.message);
}- 错误回调:异步回调错误处理
javascript
fs.readFile('file.txt', (err, data) => {
if (err) {
console.error('读取文件失败:', err.message);
return;
}
console.log(data);
});- Promise catch:Promise 错误处理
javascript
readFilePromise('file.txt')
.then(data => console.log(data))
.catch(err => console.error('读取文件失败:', err.message));- async/await + try-catch:现代异步错误处理
javascript
async function readData() {
try {
const data = await readFilePromise('file.txt');
console.log(data);
} catch (err) {
console.error('读取文件失败:', err.message);
}
}- process.on('uncaughtException'):捕获未处理的异常
javascript
process.on('uncaughtException', (err) => {
console.error('未捕获的异常:', err.message);
process.exit(1);
});- process.on('unhandledRejection'):捕获未处理的 Promise 拒绝
javascript
process.on('unhandledRejection', (reason, promise) => {
console.error('未处理的 Promise 拒绝:', reason);
});10. Node.js 的调试方法
问题:Node.js 有哪些调试方法?
答案:
调试方法:
- console.log:最简单的调试方式
javascript
console.log('调试信息:', variable);
console.dir(object, { depth: null }); // 深度打印对象- debugger 语句:使用 Chrome DevTools
javascript
function test() {
const a = 1;
debugger; // 在此处设置断点
const b = 2;
return a + b;
}
// 运行:node inspect script.js- node --inspect:启用调试模式
bash
node --inspect-brk=9229 index.js
# 然后在 Chrome 中访问 chrome://inspect- VS Code 调试:配置 launch.json
json
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "启动程序",
"program": "${workspaceFolder}/index.js"
}
]
}- ndb:Google 开发的 Node.js 调试工具
bash
npx ndb index.js