必须用绝对路径 /css/style.css 并配置 app.use(express.static("public")),否则浏览器因相对路径拼接或未托管静态资源而 404;禁用服务端 require/import css。

不能直接在 views/ 目录里放 CSS 并用相对路径引入——浏览器根本拿不到,必然 404。
为什么 <link href="css/style.css"> 总是加载失败
因为 EJS 是服务端模板,它不处理文件路径解析;<link> 的 href 值最终由浏览器发起 HTTP 请求,路径必须匹配 Express 静态资源服务器暴露的 URL。写成 css/style.css 或 ./css/style.css 属于相对路径,会按当前页面 URL(比如 /admin/user)拼接,变成请求 /admin/css/style.css,自然 404。
- 绝对路径才可靠:以
/开头,如/css/style.css - 相对路径(无前导
/)完全不可控,开发时可能“碰巧”对,部署后必挂 - 错误现象通常是控制台报
404 Not Found,但样式没生效却查不到原因
Express 必须显式托管 public/ 目录
Express 默认不自动提供任何静态文件。哪怕你把 style.css 放在 public/css/ 下,没调用 express.static(),浏览器访问 /css/style.css 就会返回 404 或(更糟)触发 Express 的兜底路由逻辑。
- 在
app.js中加这行:app.use(express.static("public")) - 确保
public/和app.js同级,且public/css/style.css真实存在 - 改完配置必须重启服务——缓存旧的 404 响应是常见盲区
- 验证方式:直接在浏览器打开
http://localhost:3000/css/style.css,看到原始 CSS 内容且状态码为 200 才算通
<link> 标签必须写在 EJS 的 里,且路径严格匹配托管规则
路径不是“找文件”,而是“发请求”。app.use(express.static("public")) 表示把 public/ 映射到根路径 /,所以 public/css/style.css 对应的请求路径就是 /css/style.css。
- ✅ 正确:
<link rel="stylesheet" href="/css/style.css"> - ❌ 错误:
<link rel="stylesheet" href="css/style.css">(相对路径) - ❌ 错误:
<link rel="stylesheet" href="../public/css/style.css">(Node.js 文件路径,浏览器无法理解) - 如果用了带前缀的挂载,比如
app.use("/assets", express.static("public")),那必须写成href="/assets/css/style.css",少一个字符都失败
别在服务端 require() 或 import CSS 文件
如果你看到类似 SyntaxError: Unexpected token '.' 且堆栈指向本地 .css 文件路径(如 C:\project\css\style.css:2),说明 Node.js 进程自己试图去解析 CSS——这和 EJS、<link> 完全无关。
- 检查所有 JS 文件(尤其是
app.js、路由、工具模块),删掉任何require('./css/style.css')或import './css/style.css' - CSS 只能由浏览器通过
<link>加载;Node.js 没有原生 CSS 解析能力 - 这种错误常发生在复制 Webpack/Vite 项目代码时,忘了移除服务端的 CSS 引用
最容易被忽略的其实是三件事:没重启服务、浏览器缓存了 404、以及在 JS 里误 require 了 CSS。先关掉服务,清掉缓存,再打开 Network 面板盯着 CSS 请求的状态码看,比反复改 EJS 模板高效得多。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











