手上有个官网,页面是用静态 HTML 现成的,做得挺完整,但内容全是写死在模板里的——想改产品、案例、首页 Banner,都得改代码重新发布。对运营来说完全不可维护。
于是决定:不动页面本身,在外面套一层轻量 CMS,把「内容」和「模板」分开,让后台能直接改。
为什么选 Node + SQLite?
服务器上已经跑着一堆物联网服务(MQTT、MySQL、PostgreSQL、宝塔面板),不想再引重型依赖。CMS 用 Node 内置的 node:sqlite + 裸 node:http 就够,零框架、单进程、内存占用几十 MB,不跟现有服务抢资源。
架构很简单:后台编辑内容 → 存 SQLite → 发布时把模板 + 数据渲染成静态 HTML。发布产物是一整个静态目录,Nginx 直接反代,页面性能跟纯静态一样。
改造过程中踩的坑
1. 字体文件带查询参数加载失败
模板 CSS 里字体用 url(font.woff2?v=4.6.3) 这种带版本号的写法,部署后浏览器按这个路径找文件总是 404。原因是文件名的问号被处理成了别的字符,路径对不上。批量把 CSS 里的编码统一就对齐了。
2. 绝对路径指向旧环境
模板里不少背景图、静态资源用的是写死的绝对路径,换到新服务器后全失效。统一改成相对路径,资源才正常加载。
3. 重启一次丢一次图片
CMS 每次启动会重新发布网站,而替换模板时用了 rm -rf 清空再复制——把后台上传的图片一起删了。修复:替换模板前先把上传目录备份出来,替换完再拷回去。
4. 清空的文字重启后又冒出来
后端有个「补默认值」的逻辑,把空字符串当成"还没填",一重启就把运营主动清空的文字填回默认文案。改成只对真正的 undefined/null 补默认,空字符串保留。
5. HTTPS 证书被拦在门外
同一天想签证书,Let's Encrypt 的验证流量被网络环境劫持到拦截页,怎么都签不下来。最后发现是域名还没迁到对应的云服务。这东西急不得,域名迁完随便签。
收尾:
改造完后台能直接改产品、案例、首页 Banner,还能传图、删废弃图片。备案号下来后,页脚的备案号、支持链接也都是后台字段直接改。
最大的体会:接历史遗留项目,部署前先想清楚「数据到底存在哪、重启会不会丢」。几个坑有俩是重启、重新发布才暴露的——越早把「重启即回归」这件事想清楚,后面越省事。
