惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
S
SegmentFault 最新的问题
T
Tailwind CSS Blog
美团技术团队
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
爱范儿
爱范儿
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
量子位
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
The Cloudflare Blog
小众软件
小众软件
云风的 BLOG
云风的 BLOG
WordPress大学
WordPress大学
P
Proofpoint News Feed
Stack Overflow Blog
Stack Overflow Blog
aimingoo的专栏
aimingoo的专栏
Y
Y Combinator Blog
B
Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
C
Check Point Blog

程沛权 - 养了三只猫

解锁网易云音乐歌曲 轻松搭建飞牛音乐私人音乐库 声画共生:黄贯中的摇滚美学宇宙 适用于 Oxlint 与 Oxfmt 的 Oxc 优先工作流 Vue Picture Cropper 发布 1.x 版本 讲一讲背后的设计理念 年终总结:2025 年的一些回顾和 2026 年的一些小规划 Obsidian x 飞牛 NAS:打造免费的跨平台笔记同步与备份方案 适用于 ESLint V9 的现代化扁平化配置 解决 better-sqlite3 连接 SQLite 时报错 Could not locate the bindings file 本色十年 记录一次 ERR_INCOMPLETE_CHUNKED_ENCODING 的问题排查 使用 remark-directive 为 Unifiedjs 提供 Markdown 视频语法的解析 干净的 TypeScript 项目在编译时报错 Cannot find module 'undici-types' 的原因和解决 macOS 基于 Android Studio 修改模拟器 Hosts 给猫儿子的新年礼物 它很喜欢! 年终总结:2023 年的一些回顾和 2024 年的一些小规划 千元预算组装入门 NAS 设备 分享 NAS 的硬件基础知识 我写了一本书《前端工程化:基于 Vue.js 3.0 的设计与实践》 想分享一下它背后的故事 Git的选择性合并操作笔记:合并某个版本或某个提交 年终总结:2022 年的一些回顾和 2023 年的一些小规划 知乎收藏夹助手:自动化将专栏的文章添加到收藏夹 Pinia怎么用?Vue3全局状态的管理工具Pinia教程 每天吃什么?上班带什么饭?程序员教你做菜啦!
用Vite更简单的解决Vue3项目的预渲染问题
chengpeiquan · 2022-06-02 · via 程沛权 - 养了三只猫

之前 Webpack 项目经常会用到预渲染,现在团队都开始用 Vite 了,所以弄一个基于 Vite 的 Vue 3 预渲染 demo 可以参考。

预渲染和静态生成器比较接近,也可以参考我的 SSG 博客vite-ssgvite-plugin-pages 来处理。

不过 Vite 本身对预渲染也提供了原生的支持,简单的预渲染可以自己写写代码来改造实现。

HTML 部分

项目根目录下 index.html 里需要追加至少两条资源注入位置的注释:

注释语句作用是否必须
<!--preload-links-->预加载资源
<!--app-html-->页面内容
<!--title-->SEO 优化:写入标题
<!--description-->SEO 优化:写入描述
<!--keywords-->SEO 优化:写入关键词

并把入口文件改成 entry-client.ts ,原来的 main.ts 会作为客户端和服务端启动时的引用。

完整代码如下(源码:index.html ):

其中除了两条必须的注释语句外,可选的部分见 SEO 优化 。

入口文件

普通项目是使用 src/main.ts 作为入口文件,需要改造成两个入口:

注释语句作用源码
entry-client.ts客户端入口查看源码
entry-server.ts服务端入口查看源码

而原来的 main.ts 只作为入口函数导出,详见源码: main.ts

路由

不再需要手动配置路由结构了,改造后直接读取 src/views 的路由组件来生成页面路由。

详见源码: router

SEO 优化

做预渲染为的就是做 SEO ,所以需要自己提前配置好 SEO 的 TKD 三大要素,这里我也是放在 src/router 目录下一起管理了。

实现逻辑见 预渲染 部分的说明,这里是以最终每个页面的相对路径来判断要写入的 TKD 信息的。

详见源码: seo

预渲染

scripts/prerender.ts 这个文件是执行预渲染行为,可以按照路由目录的结构渲染为静态 HTML 文件。

运行 npm run generate ,可以把 dist/static 作为静态站点部署。

当然我也封装了 npm run build 一次性编译所有平台( Client / Server / Static )。

详见: package.json 里的 scripts 部分。

常见问题

改造过程中遇到的几个问题:

水合节点不匹配

控制台报错:

警告来自于 hydration.ts ,一般可以无视……

当然也可以了解更多的知识点: understand-and-solve-hydration-errors-in-vue-js

路由跳转

控制台报错:

需要使用 <Suspense /> 标签来包裹路由视图,详见 Suspense