够,但仅适用于无样式、无动态结构的极简html输出;复杂场景需jsdom支持dom操作或marked/remark处理markdown,配合path.join和显式utf8编码规避乱码与路径错误。

直接用 fs.writeFile 生成 HTML 文件够不够?
够,但只适合极简场景——比如单页、无样式、无动态结构的“Hello World”级输出。一旦要处理多页面、模板变量、CSS/JS 引入、路径拼接或 Markdown 转换,fs.writeFile 就会迅速变成字符串拼接地狱。
常见错误现象:
-
fs.writeFile写入中文乱码(没指定'utf8'编码) - 路径拼错导致文件写到奇怪位置(没用
path.join(__dirname, ...)) - 多个异步写入并发冲突(没加
await或串行控制)
实操建议:
- 始终显式传入
'utf8'编码参数:fs.writeFileSync(filename, html, 'utf8') - 模板内容尽量抽离为独立
template.html文件,而非硬编码在 JS 里 - 批量生成时用
for...of+await替代forEach+ 回调,避免竞态
要不要引入 jsdom?什么情况下值得用?
值得用,但不是默认选项。它解决的是“需要像浏览器一样操作 DOM”的问题,而不是“生成 HTML 字符串”本身。
使用场景:
- 已有前端组件逻辑(比如用
document.createElement动态构建复杂卡片列表) - 需复用现有 Vue/React 组件的渲染结果(配合
@vue/server-renderer等) - 要对生成后的 HTML 做 post-process:注入 meta 标签、修改 class、插入脚本块
容易踩的坑:
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
-
JSDOM构造函数必须传完整 HTML 字符串(含),否则 <code>document.head可能为空 - 默认不执行 script 标签,也不加载外部 CSS —— 它只是 DOM 模拟器,不是浏览器
- 性能比字符串模板慢 3–5 倍,千页规模下生成耗时明显,别在高频构建流程里无脑套用
部署时为什么 dist/ 目录不能直接扔进 Node 进程跑?
因为 Node.js 不是 Web 服务器,它不会自动响应 HTTP 请求并返回静态文件。你把 dist/ 放进去,它就只是个普通文件夹,没人能访问。
正确做法分两类:
- 纯静态托管:把
dist/整个目录上传到 GitHub Pages、Vercel、Cloudflare Pages 或 Nginx 的root目录 —— 这是最推荐的方式,零运维、CDN 加速、天然 HTTPS - 用 Node 当简易服务:仅用于开发预览或内网调试,例如用
http-server或express.static,但生产环境不建议
关键细节:
- 如果用
express.static,务必设index: true并检查路由是否匹配/和子路径(如/about/) - HTML 中引用的
./css/main.css在子路径下可能 404,得确认<base href="/">或构建时配置base(如 Vite 的base选项)
Markdown 转 HTML 该选哪个库?
选 marked 或 remark,别手写正则。前者快、轻、兼容性好;后者生态强、插件丰富,适合要扩展语法(如自定义容器、数学公式)的场景。
参数差异直接影响输出质量:
-
marked默认不转义 HTML,若源内容可信可关掉sanitize: false;否则留着,防 XSS -
remark需搭配remark-html或remark-rehype + rehype-stringify,链路长但可控性强 - 两者都支持自定义
renderer(marked)或plugin(remark),用来给标题加锚点、给代码块加复制按钮
注意一个易忽略点:Frontmatter(YAML 头部)需额外解析。别指望 marked 自动处理,得先用 gray-matter 提取元数据,再传给渲染器。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










