Express静态服务最省事,三行代码即可启用:const express = require('express'); const app = express(); app.use(express.static('public')); 它自动处理文件读取、路径解析、Content-Type设置及404响应,支持绝对路径推荐写法path.join(__dirname, 'public'),并可通过挂载前缀实现子路径访问。

直接用 express 最省事,三行代码就能把当前目录变成可访问的静态服务器;原生 http 模块也能做,但读文件、判路径、设编码、处理 404 全得手写,容易漏掉 res.end() 或忘记 Content-Type 导致乱码或挂起。
用 express.static 快速提供静态资源
这是最常用也最稳妥的方式,适合快速预览 HTML/CSS/JS 项目或部署打包后的前端产物。
-
express.static()默认不支持目录列表,请求/且无index.html时直接返回 404 - 路径必须是绝对路径,推荐用
path.join(__dirname, 'public')或path.resolve('static'),别直接写'./static'(在某些工作目录下会失效) - 如果静态资源放在子目录(比如
dist/),app.use('/app', express.static('dist'))可挂载到子路径,但浏览器需访问http://localhost:3000/app/index.html - 多个
express.static()调用按顺序匹配,先注册的优先;想 fallback 到首页,得手动加路由:app.get('*', (req, res) => res.sendFile(path.join(__dirname, 'dist', 'index.html')))
监听端口失败时常见错误和修复
VSCode 终端运行 node server.js 后没反应、浏览器打不开、控制台也没报错——大概率是端口被占或监听未捕获异常。
- 始终用
server.listen(3000, err => { if (err) throw err; console.log('running on http://localhost:3000') }),否则端口被占用时静默失败 - Windows 上有时
localhost解析慢,改用127.0.0.1:app.listen(3000, '127.0.0.1', ...) - VSCode 的终端可能复用旧进程,关掉所有
node进程再试:killall -9 node(macOS/Linux)或任务管理器结束node.exe(Windows) - 若提示
EACCES,说明端口需要 root 权限(如 80),换 3000、5000、8080 等普通端口即可
中文文件名或路径导致 404 的原因
Node.js 原生 fs 模块对 UTF-8 路径支持不一致,尤其在 Windows 下,req.url 解码后可能与磁盘文件名不匹配。
-
express.static内部已处理 URL 解码,一般不会出问题;但如果你自己拼接path.join()并传给fs.readFile,务必用decodeURIComponent(req.url)处理路径 - 避免在静态目录里用中文文件名,不是所有环境都兼容;实在要用,确保保存为 UTF-8 编码,且 VSCode 文件编码设置为 UTF-8(右下角点击编码切换)
- 测试时用
console.log(decodeURIComponent(req.url))和fs.readdirSync(...)对比真实文件名,能快速定位是否解码偏差
真正麻烦的从来不是“能不能跑起来”,而是当 index.html 里引用了 ./js/app.js 却 404 时,你得判断是路径配错了、文件没放对位置、还是 Express 把请求吞掉了——这时候翻一眼前端 Network 面板里的请求地址,比查文档快得多。


















