不用前端框架,用 EJS 写服务端渲染也挺好
现在做网站,很多人的第一反应是 Vue 或 React,再配上 Vite、路由、状态管理,一个博客的 node_modules 能有几百 MB。
对于博客、文档站、企业官网这类以内容为主的网站,我越来越倾向于回到最朴素的做法:服务端用模板引擎直接渲染 HTML。
好处
首屏快:浏览器拿到的就是完整的 HTML,不需要先下载 JS、再请求接口、再渲染。在网络较差的手机上,差距非常明显。
对搜索引擎友好:爬虫拿到的就是完整内容,不需要额外处理 SSR 或预渲染。
没有构建步骤:改完模板刷新就能看到效果,部署时也不需要执行构建。
维护成本低:没有前后端两套代码、两套路由、两套鉴权逻辑。一年后再打开项目,不用担心依赖升级导致构建失败。
EJS 的基本用法
EJS 的语法就是在 HTML 里嵌入 JavaScript:
<ul>
<% articles.forEach(a => { %>
<li><a href="/article/<%= a.id %>"><%= a.title %></a></li>
<% }) %>
</ul>
<% %>:执行代码,不输出;<%= %>:输出并进行 HTML 转义,默认用这个;<%- %>:原样输出,只用于可信内容,比如引入其他模板,或者渲染自己写的 Markdown。
公共部分抽成子模板:
<%- include('partials/header', { pageTitle: article.title }) %>
<article>...</article>
<%- include('partials/footer') %>
在 Express 中使用:
app.set('view engine', 'ejs');
app.get('/article/:id', (req, res) => {
const article = getArticle(req.params.id);
res.render('article', { article });
});
交互怎么办
服务端渲染不代表完全没有 JavaScript。需要交互的地方,写一小段原生 JS 就够了:
- 表单提交直接用
<form method="post">,服务端处理后重定向; - 确认对话框用
onsubmit="return confirm('确定删除?')"; - 少量的动态效果,几十行原生 JS 就能实现。
什么时候还是该用框架
- 交互非常复杂的应用,比如在线编辑器、看板、实时协作工具;
- 需要做成 App 或小程序,和前端共用一套代码;
- 团队已经有成熟的前端框架工程体系。
选型的关键是匹配需求。对一个以阅读为主的个人网站来说,模板引擎往往是性价比最高的选择。