想不想自己写一个后端服务器,让别人通过 http://localhost:1234
访问你开发的网页?其实没那么难!今天从零开始,用 Node.js 手把手教你搭建一个能处理 HTML、CSS、JS 的 HTTP 服务器,全程带代码实操
为什么选 Node.js?后端入门的 “最佳跳板”
提到后端开发,你可能会想到 Java、Python,但对前端开发者来说,Node.js 才是最友好的选择—— 因为它能用你熟悉的 JavaScript 写后端!
Node.js 的优势:
- 语言统一:前端(浏览器)和后端(服务器)都用 JS,不用切换编程语言;
- 上手简单:语法和前端 JS 几乎一样,学过 JS 就能快速入门;
- 生态强大:有大量现成的模块(比如处理 HTTP、文件的工具),不用重复造轮子。
今天我们就用 Node.js 的内置模块,从零搭建一个能响应网页请求的服务器。
动手实操:3 步搭建你的第一个 HTTP 服务器
步骤 1:准备工作
- 安装 Node.js:去Node.js 官网下载安装
- 验证安装:打开命令行,输入
node -v
my-node-server
,在里面新建 server.js
(服务器代码文件)。
步骤 2:写一行代码,启动最简易服务器
打开 server.js
,输入以下代码:
// 1. 导入Node.js内置的http模块(处理HTTP请求的工具)
const http = require('http');
// 2. 创建服务器:定义“收到请求后该做什么”
const server = http.createServer((req, res) => {
// req:请求对象(包含浏览器的请求信息,比如访问的地址)
// res:响应对象(用于给浏览器返回内容)
res.end('Hello Node.js Server! 这是我的第一个后端服务器~');
});
// 3. 启动服务器,监听1234端口
server.listen(1234, () => {
console.log('服务器启动成功!访问地址:http://localhost:1234');
});
升级服务器:让它能返回 HTML 网页
刚才的服务器只能返回文字,太简单了。接下来让它能返回 HTML 文件,就像真正的网站一样。
步骤 1:准备 HTML 文件
在 my-node-server
里新建 public
文件夹,再在 public
里新建 index.html
:
<!-- public/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>我的Node.js服务器</title>
</head>
<body>
<h1>🎉 这是服务器返回的HTML页面!</h1>
<p>通过Node.js搭建的HTTP服务器成功运行~</p>
</body>
</html>
步骤 2:修改服务器代码,返回 HTML
更新 server.js
:
const http = require('http');
// 导入Node.js内置的文件系统模块(用于读取HTML文件)
const fs = require('fs');
// 导入路径处理模块(解决不同系统的路径格式问题)
const path = require('path');
const server = http.createServer((req, res) => {
// 判断请求:如果是访问首页(GET方法 + 路径为/)
if (req.method === 'GET' && req.url === '/') {
// 读取public文件夹下的index.html
const htmlPath = path.join(__dirname, 'public', 'index.html');
// 用fs模块读取文件
fs.readFile(htmlPath, (err, content) => {
if (err) {
// 如果读取失败(比如文件不存在),返回服务器错误
res.writeHead(500); // 500是HTTP状态码,表示服务器出错
res.end('服务器错误:找不到网页文件');
return;
}
// 读取成功,返回HTML内容
res.writeHead(200, {
'Content-Type': 'text/html' // 告诉浏览器:这是HTML文件
});
res.end(content); // content就是index.html的内容
});
} else {
// 访问其他路径,返回404(找不到资源)
res.writeHead(404);
res.end('404 Not Found:找不到你要的页面~');
}
});
server.listen(1234, () => {
console.log('服务器启动成功!访问地址:http://localhost:1234');
});
测试效果:
重启服务器(命令行按 Ctrl+C
停止,再运行 node server.js
)
如果觉得每次重启过于麻烦,可以试试nodemon,自动监听文件变更并重启服务,实时生效修改。
npm install -g nodemon
# 监听文件
nodemon server.js
🚀 总结:
nodemon
是 Node.js 开发效率的“加速器”,合理配置可覆盖 90% 的热重载需求
再升级:让服务器支持 CSS 和 JS
一个完整的网页需要 HTML、CSS、JS 配合,我们让服务器能返回这些文件:
步骤 1:准备 CSS 和 JS 文件
在 public
文件夹里新建:
-
style.css
(样式文件):body { background: #f0f0f0; text-align: center; padding: 50px; font-size: 20px; } h1 { color: #333; }
-
script.js
(脚本文件):alert('恭喜!JS文件也成功加载啦~');
步骤 2:修改 HTML,引入 CSS 和 JS
更新 public/index.html
:
<!DOCTYPE html>
<html>
<head>
<title>我的Node.js服务器</title>
<link rel="stylesheet" href="/style.css"> <!-- 引入CSS -->
</head>
<body>
<h1>🎉 这是服务器返回的HTML页面!</h1>
<p>通过Node.js搭建的HTTP服务器成功运行~</p>
<script src="/script.js"></script> <!-- 引入JS -->
</body>
</html>
步骤 3:修改服务器代码,支持 CSS 和 JS
更新 server.js
,添加处理 CSS 和 JS 的逻辑:
// 处理CSS文件
else if (req.method === 'GET' && req.url === '/style.css') {
const cssPath = path.join(__dirname, 'public', 'style.css');
fs.readFile(cssPath, (err, content) => {
if (err) { res.writeHead(500); res.end('服务器错误'); return; }
res.writeHead(200, { 'Content-Type': 'text/css' }); // 告诉浏览器这是CSS
res.end(content);
});
}
// 处理JS文件
else if (req.method === 'GET' && req.url === '/script.js') {
const jsPath = path.join(__dirname, 'public', 'script.js');
fs.readFile(jsPath, (err, content) => {
if (err) { res.writeHead(500); res.end('服务器错误'); return; }
res.writeHead(200, { 'Content-Type': 'text/javascript' }); // 告诉浏览器这是JS
res.end(content);
});
}
// 其他路径返回404
else {
res.writeHead(404);
res.end('404 Not Found');
}
});
测试效果:
重启服务器后访问 http://localhost:1234
,会看到:
关键知识点:服务器代码里的 “黑话” 解析
1. require('http')
:Node.js 的 “工具箱”
-
http
是 Node.js 内置的模块(相当于别人写好的工具),能帮我们快速创建 HTTP 服务器,不用自己从零实现网络通信逻辑; - 类似的还有
fs
(文件系统,操作文件)、path
(处理路径),这些都是 Node.js 给我们的 “现成工具”。
2. createServer
:定义服务器的 “工作流程”
-
http.createServer((req, res) => { ... })
里的回调函数,是服务器的 “核心逻辑”:-
req
(request):包含浏览器的请求信息,比如req.url
是访问的路径(/
或/style.css
),req.method
是请求方法(通常是GET
); -
res
(response):用于给浏览器返回内容,res.end('内容')
是发送内容的最简单方式。
-
3. res.writeHead(状态码, { ... })
:告诉浏览器 “内容类型”
-
状态码:3 位数字,代表请求处理结果。比如
200
是 “成功”,404
是 “找不到资源”,500
是 “服务器出错”; -
Content-Type:告诉浏览器返回的是什么类型的内容,比如
text/html
是 HTML,text/css
是 CSS,浏览器会根据这个来正确解析内容(否则可能乱码)。