一、Node.js到底是什么?¶
简单来说,Node.js是一个让JavaScript能在服务器端运行的工具。它基于Chrome的V8引擎,用JavaScript语法就能写后端代码,处理文件、数据库、网络请求等任务。
为什么学Node.js?它的核心优势是非阻塞I/O(可以理解为“一边做事一边等”,不卡壳)和事件驱动(像服务员接订单,不用一直盯着你,等订单来了才处理),特别适合处理高并发的异步任务(比如同时处理100个用户请求)。
二、Node.js能做什么?¶
- Web应用开发:用Express、Koa等框架快速搭建网站(比如知乎、阿里巴巴的部分业务)。
- API接口开发:写后端接口给前端调用(比如微信小程序、手机APP的后端)。
- 实时应用:用Socket.io实现即时通讯(比如在线聊天、弹幕)。
- 命令行工具:用Node写脚本自动化工作(比如自动生成代码、批量处理文件)。
- 数据分析/爬虫:处理日志文件、爬取网页数据(比如统计网站流量)。
三、5个初学者必做实战项目¶
项目1:个人博客网站(适合练手:Express + 模板引擎)¶
目标:搭建一个能显示文章列表和单篇文章的静态博客,用本地文件存文章。
技术:Express(Web框架)、EJS(模板引擎)、fs模块(文件读写)。
步骤:
1. 安装Express:npm init -y && npm install express ejs
2. 创建项目结构:
blog/
├─ views/
│ ├─ index.ejs # 文章列表页
│ └─ post.ejs # 单篇文章页
├─ app.js # 入口文件
└─ posts/ # 存放文章的文件夹(每个文章是一个.md或.txt文件)
- 写入口文件
app.js:
const express = require('express');
const fs = require('fs');
const path = require('path');
const app = express();
app.set('view engine', 'ejs'); // 使用EJS模板
// 首页:读取posts文件夹里的文章,渲染列表
app.get('/', (req, res) => {
fs.readdirSync(path.join(__dirname, 'posts')).forEach(file => {
const content = fs.readFileSync(path.join(__dirname, 'posts', file), 'utf8');
res.render('index', { posts: [{ title: file, content }] }); // 简化示例
});
});
app.listen(3000, () => console.log('博客运行在 http://localhost:3000'));
- 在
views/index.ejs里写文章列表渲染代码(简单循环)。
为什么适合初学者:不用数据库,纯文件操作,熟悉路由和模板渲染,成就感强。
项目2:命令行待办事项工具(适合练手:命令行交互 + 文件操作)¶
目标:用命令行添加、查看、删除待办事项,数据存在本地文件。
技术:commander(解析命令行参数)、fs模块(JSON文件存储)。
步骤:
1. 安装依赖:npm init -y && npm install commander
2. 写todo.js:
const { program } = require('commander');
const fs = require('fs');
const path = require('path');
const TODO_FILE = path.join(__dirname, 'todos.json');
// 初始化待办事项数组
let todos = [];
if (fs.existsSync(TODO_FILE)) {
todos = JSON.parse(fs.readFileSync(TODO_FILE, 'utf8'));
}
// 添加待办事项(命令:node todo.js add "学习Node.js")
program.command('add <content>').action(content => {
todos.push({ id: Date.now(), content, completed: false });
fs.writeFileSync(TODO_FILE, JSON.stringify(todos));
console.log('添加成功!');
});
// 查看待办事项(命令:node todo.js list)
program.command('list').action(() => {
console.log(todos.map(t => `[${t.completed ? '✓' : '□'}] ${t.content}`).join('\n'));
});
program.parse(process.argv);
- 测试命令:
node todo.js add "写博客",node todo.js list。
为什么适合初学者:零前端知识,纯命令行操作,理解异步文件读写和JSON处理。
项目3:简单RESTful API(适合练手:Express + 数据存储)¶
目标:做一个用户管理API,支持添加、查询、删除用户信息。
技术:Express(路由)、fs模块(JSON文件存数据)、Postman(测试)。
步骤:
1. 安装Express:npm init -y && npm install express
2. 写api.js:
const express = require('express');
const app = express();
app.use(express.json()); // 解析JSON请求体
const fs = require('fs');
const path = require('path');
const USER_FILE = path.join(__dirname, 'users.json');
// 初始化用户数据(如果文件不存在)
if (!fs.existsSync(USER_FILE)) {
fs.writeFileSync(USER_FILE, JSON.stringify([]));
}
// 1. 获取所有用户
app.get('/users', (req, res) => {
const users = JSON.parse(fs.readFileSync(USER_FILE, 'utf8'));
res.json(users);
});
// 2. 添加用户
app.post('/users', (req, res) => {
const newUser = { id: Date.now(), ...req.body };
const users = JSON.parse(fs.readFileSync(USER_FILE, 'utf8'));
users.push(newUser);
fs.writeFileSync(USER_FILE, JSON.stringify(users));
res.json(newUser);
});
app.listen(3000, () => console.log('API运行在 http://localhost:3000'));
- 用Postman测试:
POST /users,请求体传{name: "小明"},查看用户列表。
为什么适合初学者:理解HTTP请求方法(GET/POST),路由设计,后端数据逻辑。
项目4:实时聊天应用(适合练手:Socket.io + 实时通信)¶
目标:两个浏览器窗口能互相发消息,实现简单聊天。
技术:Express(服务器)、Socket.io(WebSocket实时通信)。
步骤:
1. 安装依赖:npm init -y && npm install express socket.io
2. 写server.js:
const express = require('express');
const http = require('http');
const { Server } = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = new Server(server);
// 静态文件服务(客户端页面)
app.use(express.static('public'));
// 监听连接
io.on('connection', (socket) => {
console.log('新用户连接');
// 接收消息
socket.on('chat message', (msg) => {
io.emit('chat message', msg); // 广播给所有用户
});
socket.on('disconnect', () => console.log('用户断开连接'));
});
server.listen(3000, () => console.log('聊天服务器运行在 http://localhost:3000'));
- 在
public/index.html里写聊天界面:
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
const input = document.getElementById('msg');
const button = document.getElementById('send');
button.onclick = () => {
socket.emit('chat message', input.value);
input.value = '';
};
socket.on('chat message', (msg) => {
const div = document.createElement('div');
div.textContent = msg;
document.body.appendChild(div);
});
</script>
- 打开两个浏览器窗口访问
http://localhost:3000,输入消息测试。
为什么适合初学者:第一次接触“实时通信”,理解WebSocket原理,不用写复杂的HTTP请求。
项目5:天气查询工具(适合练手:第三方API调用)¶
目标:通过命令行输入城市名,返回天气信息(调用公开API)。
技术:axios(发HTTP请求)、process.argv(解析命令行参数)。
步骤:
1. 安装axios:npm init -y && npm install axios
2. 写weather.js:
const axios = require('axios');
const apiKey = '你的天气API密钥'; // 去和风天气/高德天气申请免费密钥
// 获取命令行参数(比如:node weather.js 北京)
const city = process.argv[2];
if (!city) {
console.log('请输入城市名:node weather.js 北京');
process.exit();
}
// 调用天气API(示例用和风天气API)
axios.get(`https://devapi.qweather.com/v7/weather/now?location=${city}&key=${apiKey}`)
.then(res => {
const data = res.data;
if (data.code === '200') {
console.log(`天气:${data.now.text}`);
console.log(`温度:${data.now.temp}°C`);
} else {
console.log('查询失败,请检查城市名或API密钥');
}
})
.catch(err => console.log('请求错误:', err));
- 替换
apiKey,运行node weather.js 北京。
为什么适合初学者:理解“调用外部API”逻辑,处理异步请求,提升数据获取能力。
四、总结¶
Node.js入门不难,但关键是动手实践!从简单的命令行工具开始,逐步过渡到Web应用,每个项目都能帮你掌握核心知识点(路由、文件操作、异步请求等)。遇到问题别慌,查文档、看示例,坚持做5个项目,你就能熟练用Node.js解决实际问题啦!
现在就选一个项目开始动手吧~ 👇