重构于 Vite:我如何做 SSG静态资源发布以及自动化部署
Posted 前端技术优选
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重构于 Vite:我如何做 SSG静态资源发布以及自动化部署相关的知识,希望对你有一定的参考价值。
本次重构后,从开发到部署更新的运作流程图如下,日常只需要维护 GitHub 仓库的代码,其他的都是自动化完成。
重构的价值这次重构,并非是因为放假有空就找点事情做,而是带着几个目的来的:
提前开荒 ,为公司后续的业务提前踩坑,可以为团队进行技术选型提供帮助,因为之前我在做 JSSDK、Vue Plugin 的时候,已经开始脱离 Webpack,用 作为构建工具,而 Vite 正是基于 Rollup ,不仅构建速度非常快,而且也像 Webpack 一样提供了热更新,对于一线开发来说,体验上是非常好的,而且它还是 Vue 团队大力推广的新工具,这让我很有兴趣去研究它。
了解一下当前的一些新生的前端工具,比如 UI 框架方面之前一直停留在适合 B 端产品的 Ant-Design、 Vuetify 、 饿了么等等,说实话我做 B 端产品的时候才会用,面向 C 端因为有设计稿,我基本上都是手写样式,听闻新一代的 UI 框架 已经有一段时间了,虽然很奇怪为什么还会回到十年前一样用原子类的 class,“开倒车” 竟然还有 3 万多的 Star,让我非常的好奇到底为什么,结果一用,真香!没错,这次博客的样式,就是用的 Tailwind 。还有像 CSS 预处理器之前也一直停留在 Sass / Less / Stylus 三驾马车,这一次我抛弃了他们,用上了 + (因为 WordPress 的高亮插件就是用这个……),这一次我是用了 ,更小巧,颗粒度更细,虽然目前还没有太多时间去定制代码高亮的配色,不过后面有时间想要处理,prism 会更加方便。
享受从 0 到 1 搭建脚手架的一个过程,目前这个版本算是实现一个简易版的 VuePress ,但是如果一直使用开箱即用的 VuePress ,很多时候并没有想去了解那些功能是怎么实现的,或者用哪些工具可以实现想要的功能(Btw: 我自从用了 Vue-CLI 之后就很久没自己配置 Webpack 了,直到 Rollup 的时候才算重新玩转了一次,这一次的 Vite 又是新的体验)
更多的更多,尽在未来,这肯定不是最后的一个版本,还有非常大的优化空间。
重构前的目标其实去年就有想法要对博客做一波改版,但有几个原因导致一拖再拖,一个是因为业务比较忙(这个没办法,工作为重),一个是懒(主要是懒得去思考怎么设计,当然期间有在考虑一些不同的落地方案),还有一个主要的原因是当时 Vue 3.0 刚发布,我当时主要的精力放在踩坑体验 3.0,那段时间,大部分的时间和精力都放在撰写 上面去了,休息时间有限,能够闲下来的时间也只有下班回来和周末,除掉一些自己的事情外,留下来捣鼓新东西的时间并不算很多,只能先押后了。
相比 2018 年那次改版,当时只是单纯想重新弄一个干净的博客写东西,这一次的目标是比较明确了,就是从基于 php 的 WordPress,用前端的技术栈全部重构一遍,做一个纯前端的博客出来,当然还要保留 SEO ,就要求还要上 SSR(Server Side Render) 或者 SSG(Server Side Generation) 。
技术栈的选择由于开工前已经是 2021 年了,因为有前面几个月玩 Vue 3.0 的基础打底,非常想用 3.0 来重构博客,加上元旦期间 Vite 2.0 Beta 版刚好发布(就很突然),注意力完全放在了 Vue3 和 Vite2 上面,非常想跑一下两者结合有多爽。
由于重构的最终目标还是要保持网站的 SEO 能力,所以肯定不能使用默认的 SPA 应用模式,要走服务端渲染,所以技术栈方面只需要考虑两条线:
基于 SSR、等一些比较流行的开箱即用的 SSR 框架,但这些框架目前都还在弄 Vue 2.0,甚至部分框架看起来有点 “弃坑” 的趋势(背靠字节大厂的 Vapper 居然一年多没更新了 emm…… )。加上搞 SSR 的话,服务器成本比较高,我的低配 ECS 可能 Hold 不住,好好玩一玩的话还要投点钱,想了想先算了,那么退而求次就是上 SSG 。
基于 SSG安利的 和它的弟弟 最终敲定指导如何实现 Vite SSR,我觉得可行。加上有两个开源项目让我非常感兴趣,一个是 重构过程分析 下面来说说决定重构之后,整个思考的过程顺序,以及对每一个技术模块的技术栈选型原因分析吧,希望对有计划重构项目的朋友带来一些帮助。
之所以选择 Vite,一方面是它的构建速度真的比 要快好多,另一方面是,自从 Vue 3.0 推出以来, Vue 官方团队就一直在投入精力优化和宣传 Vite,尽管 1.0 版本的功能和生态不如人意,但超快的构建速度已经体现了出来。
加上在我准备动手重构的时候官方刚好发布了 2.0 大更新,对比了 1.0 简直是质的飞跃,让我非常感兴趣,而且按照目前官方团队的态度,我觉得后面 Vite 会逐步代替 Vue-CLI ,提前了解,提前踩坑,对以后的工作也有帮助。
而且在生态方面,Vite 2.0 的各种支持都算很完善了,不得不说整个春节期间,Vue 团队的人都在忙着给 Vite 2.0 干活,我在春节提的 Issue,基本上 2 ~ 3 小时就能给我回应,解决问题速度非常快(大过年的耶!),重构过程感觉自己拥有一个强大的技术支持团队一样!
开荒虽然辛苦,但也有另一番乐趣!
服务端渲染一键部署等快速搭建方案,和各种各样的模板之外,主要也是归功于 WP 对 SEO 的支持也是非常好,我这个博客的日常访问都是来自于搜索引擎。单纯选择用 Vue 3.0 重新开发 SPA 应用肯定会丢失 SEO,所以才有了前面的 项目架构规划模板开发文件,只需要按照原来的习惯,路由页面放在你的 src/views
文件夹下,组件模板放置于 src/components
下,就可以自动生成路由访问。
同时也加入了 .md
文件的支持,用于书写 Markdown 格式的内容,日常记录博客会更方便,并且像 VuePress 那样,同时支持在 Markdown 里嵌套 Vue,让博客的定制更加灵活。
整个项目的路由页面、组件结构,跟你平时开发 Vue 项目是完全一样的,无缝切换。
src
├─components
│ ├─Footer.vue
│ └─Header.vue
└─views
│ ├─[page].vue
├─article
│ └─rewrite-in-vite.md
│ ├─about.md
└─index.vue
在这里推荐几个非常方便的 Vite 插件:
:能够自动读取指定目录下的 Vue / Md 文件生成 Vue 路由,只需要管理好 views 文件夹的层级关系,无需再单独维护路由配置
:一个能让 Markdown 文件像 Vue 组件一样导入使用的插件,它也基于 markdown-it,支持进行一系列 md 生态扩展
样式处理器等 UI 框架来帮我减少页面设计上的一些时间浪费,但这些框架通常更适合用在 B 端产品。
去年底在知乎刷到过一篇 ,了解到一款全新的 CSS 框架 Tailwind CSS,乍一看很像是在开历史的倒车,回归原子类 className ,评价也是褒贬不一,自己光看文档的时候也是想着这啥玩意…
但是考虑到如果真的是开倒车,凭什么可以拿到 3 万的 Star,抱着试一下的心态在这次重构里面引入尝试,确实真香!
目前感受到的好处就是:
延续 CSS 的属性命名,你需要什么属性自己放,也就是自己必须有一定的 CSS 基础,特别是在多端适配方面,不用担心框架用久了自己不会写 CSS 的问题
比如,你要实现一个容器内完全居中,手写 CSS 是:
的前缀就可以轻松定制两款皮肤
点一下切换皮肤:
用了 Tailwind 之后,你几乎可以不用写 Sass / Stylus 了,那么问题来了:如何弥补 CSS 预处理器提供的一些功能?
借助 和 或者 .pcss
作为文件后缀,在 Vue 组件里则使用 <style lang="postcss"></style>
来指定 PostCSS Language 。
当然,说的再多也不如亲手写一写,我之前在知乎也是看了好久始终不能决定用不用,之前赶业务也没时间,这一次也终于动手体验了一把,后悔,特别后悔,后悔怎么没有早点用!!!
SEO 优化帮我们解决了空 html 文档的问题,但要更好的进行 SEO 优化,还需要落实到具体的页面上去。比如页面的 title
、 description
、 keyword
等等,这里我是用到了以下两个工具来帮我实现每个页面的 TKD 定制。
文件的 TKD 优化,你可以在 Markdown 文件的最前面加入这样的代码,即可实现对页面展示对应的 TKD 信息。
---
title: 这是页面的标题
desc: 这是页面的描述
keywords: 关键词1,关键词2,关键词3
---
下面是要书写的 Markdown 内容…
文件里实现优化,在 Vue 组件里的 script
部分,写入以下的代码,就可以实现 TKD 信息的配置。
静态资源处理有案例说明,更多用法可以查看官网的文档 这样的仓库用来存储这些静态资源,在仓库的 README 也有简单介绍下如何引用 CDN 地址和清除 CDN 缓存。回到项目里,只需要在 里修改 base
的路径即可。
,支持多个平台的 CDN 服务,其中就有 Github 。你可以在 Github 仓库上的 下载最新的客户端版本,只是使用的话,可以单独下载对应系统的安装文件,不需要克隆整个仓库下来自己构建。
资源导出目录下,阿里云非常方便的就是,你可以连 SFTP 上去把这些文件直接拖下来就可以了。重新传到 Github 上又非常简单,克隆你的仓库下来后,放到指定的文件夹里,重新提交就可以了。
等未来某一次你不想继续用 Github 托管了,只需要把仓库拉下来,所有文件又都在了,都是非常方便和灵活。
爬虫编写里提到的,缺少很多 TKD 信息配置,而且里面的图片地址也都要更换为 CDN 的路径,所以就算用现成工具去处理 HTML / XML 转 Markdown,都还要去补充这些信息,也比较繁琐。所以是借助了 Node 编写了个静态爬虫,在爬取过程中对一些内容进行追加、转换。
具体的实现可以参考我之前写的 ,这里就不重复赘述了。
数据统计里了解如何开启流量的统计上报功能,如果你需要记录埋点,也都有 API 可以轻松触发数据的上报。百度统计:服务端开发,没错,我现在更喜欢用 yarn 来进行包管理,这一步你可以跳过
npm i -g yarn
然后是全局安装 。
yarn global add pm2
其他的步骤就不用说了,创建服务器的文件夹,初始化,安装 或者其他你更熟悉的服务程序,搞起吧!
有几件事要特别叮嘱一下:
1. 因为服务端变了,如果原来有开启 HTTPS,记得重新配置你的 SSL 证书(我用的是阿里云的免费证书,只需要 1 年更换 1 次)
2. 域名也要重新做 301 重定向(HTTP 强切 HTTPS , WWW 强切无 3W 等)
3. 检查之前是否有在推广的的链接挂掉了,也要重新 301 到新地址 (比如 RSS 源之前是 /feed/ ,现在是 /feed.xml)
4. 最重要的,配置上对路由 history 模式的支持
第一版其实不复杂,后面有需要会继续迭代。
自动化部署,里面都提供了注释。workflow 里所有以 secrets.XXXXXX
的格式均为仓库独立配置的密钥变量,在仓库的 settings
> Actions secrets
里添加。
其中一些关键环节说明如下:
on
是指分支行为,我配置了合并分支才会触发,因为平时都是托管在develop
分支,包括未开发完毕的功能,写一半的文章草稿,只有确认可以发布的代码,才会合并到main
进行更新jobs
是触发自动打包 / 发布一系列行为的各种操作,从上到下按顺序处理,其中的 ACCESS_TOKEN 是 GitHub 的 Token,请来 创建,创建后只会显示一次,请保存好,后面涉及到 Token 的地方可以重复使用同一个 Token,请勿泄露!gh-pages
分支是打包完毕后的文件,推送到阿里云服务器的也是这个分支下的所有文件,之所以托管一份在 GitHub,是因为我们前面部署了 CDN 支持,JS / CSS 文件是需要读取这个分支的 CDN 文件部署到阿里云的环节,配置的
SERVER_SSH_KEY
是自己服务器的密钥对,如果你也是跟我一样使用阿里云的 ECS ,可以参考 是自己服务器的公网 IP,这个其实可以不用配置为密钥变量,因为ping
一下你的域名也知道是什么 IP ,只是因为我有两台服务器,所以配置为变量可以方便的通过SERVER_IP
和SERVER_IP_TEST
去切换,其他变量其实也有一个 TEST 版本最后的
TARGET
是你在服务器上,node 服务器所安装的目录。
如果其中有什么环节不清楚的,善用搜索引擎,或者到我博客仓库给我提 issue 也可以。
如果你不是托管在 GitHub ,而是别的 Git 平台诸如自建的 Gitlab ,你也可以通过 去配置 CI / CD 的支持。
离线应用构建。Vite 官方团队也对 PWA 做了支持,通过 可以方便的实现一个离线应用的配置。
的
base
选项设置为 CDN 地址时,构建出来的 PWA manifest 资源路径会读取错误,原因是 manifest 不能走 CDN,要单独从网站内读取,虽然跟作者提了优化建议(详见 这个去用,不过最好还是留意原版的更新,这个私有包不会长期维护。2021-02-22 更新:目前原版已更新,Fix 了我反馈的问题,请使用 v0.5.3 以后的版本可以避免该问题的产生,给作者点赞!
关于 PWA 的配置可以参考我的项目,这里单独说一下需要特别注意的点:
因为使用了 CDN,所以
scope
和manifest.start_url
选项需要显式指定,否则资源会读取出错基于我上面提到的路径问题,从 v0.5.3 开始,配置 CDN 的同时,也需要显式指定
base
选项,避免出现 404
其他的选项根据实际需要去处理就可以了。
结语因为网站的设计一向不是我的专长,加上不喜欢花里胡哨的东西,所以这一次重构后的 UI 设计还是基本继承了原来的风格。
但也有一些新的迭代,比如加上了跟随系统的暗黑风格(也可以通过导航右上角进行手动切换),还有首页的变化,对于内容不多的博客来说,挺好的一个 idea,这是来自好友小毅 和 Vite 开发者 Antfu 的博客参考。
当然,整个项目的重构,更多的技术支持来自于 Anthony,他也是 Vue 和 Vite 官方团队的开发者,他比我早几天上线的 给了我很多思路,很多基于 Vite 的插件也是他写的,都是在这几天发布和迭代,有那种瞌睡来了枕头的感觉,美妙!
完整的项目依赖和配置请查看仓库的 ,整个项目也完全开源了,具体的实现可以查看 ,在这里就不赘述了,如果觉得对你有用,欢迎 Star 。
参考资料Vite 2.0 发布了 \\ 尤雨溪: https://zhuanlan.zhihu.com/p/351147547
[2]Vite 2.0: https://github.com/vitejs/vite
[3]Rollup: https://github.com/rollup/rollup
[4]Tailwind CSS: https://github.com/tailwindlabs/tailwindcss
[5]PostCSS Language: https://github.com/postcss/postcss
[6]CSS Variable: https://developer.mozilla.org/zh-CN/docs/Web/CSS/--*
[7]highlight.js: https://github.com/highlightjs/highlight.js
[8]prism: https://github.com/PrismJS/prism
[9]Vue3.0 学习教程与实战案例: https://vue3.chengpeiquan.com/
[10]Nuxt: https://github.com/nuxt/nuxt.js
[11]Vapper: https://github.com/shuidi-fed/vapper
[12]Hexo: https://github.com/hexojs/hexo
[13]@chawyehsu: https://github.com/chawyehsu
[14]Saber: https://github.com/saberland/saber
[15]VuePress: https://github.com/vuejs/vuepress
[16]VitePress: https://github.com/vuejs/vitepress
[17]Server-Side Rendering | Vite: https://vitejs.dev/guide/ssr.html
[18]vite-ssr: https://github.com/frandiox/vite-ssr
[19]vite-ssg: https://github.com/antfu/vite-ssg
[20]Vue-CLI: https://github.com/vuejs/vue-cli
[21]Vue 3.0 教程: https://vue3.chengpeiquan.com/
[22]Webpack: https://github.com/webpack/webpack
[23]LNMP: https://github.com/licess/lnmp
[24]技术栈的选择: #%E6%8A%80%E6%9C%AF%E6%A0%88%E7%9A%84%E9%80%89%E6%8B%A9
[25]vite-plugin-pages: https://github.com/hannoeru/vite-plugin-pages
[26]vite-plugin-md: https://github.com/antfu/vite-plugin-md
[27]vite-plugin-components: https://github.com/antfu/vite-plugin-components
[28]Stylus: https://github.com/stylus/stylus
[29]Ant Design: https://github.com/vueComponent/ant-design-vue
[30]如何评价 CSS 框架 TailwindCSS?: https://www.zhihu.com/question/337939566
[31]PostCSS Language: https://github.com/postcss/postcss
[32]CSS Variable: https://developer.mozilla.org/zh-CN/docs/Web/CSS/--*
[33]服务端渲染: #%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%B8%B2%E6%9F%93
[34]gray-matter: https://github.com/jonschlinkert/gray-matter
[35]@vueuse/head: https://github.com/vueuse/head
[36]国内有哪些靠谱的 javascript 库 CDN 可用?: https://www.zhihu.com/question/20227463/answer/370662453
[37]jsdelivr CDN 官网: https://www.jsdelivr.com/?docs=gh
[38]Features - jsdelivr: https://www.jsdelivr.com/features#gh
[39]assets-storage: https://github.com/chengpeiquan/assets-storage
[40]vite.config.ts: https://github.com/chengpeiquan/chengpeiquan.com/blob/main/vite.config.ts
[41]Configuring Vite | Vite: https://vitejs.dev/config/#base
[42]PicGo: https://github.com/Molunerfinn/PicGo
[43]Releases: https://github.com/Molunerfinn/PicGo/releases
[44]SEO 优化: #seo-%E4%BC%98%E5%8C%96
[45]网站改版迁移经验记录:基于 node 的爬虫编写: https://chengpeiquan.com/article/node-web-crawler
[46]main.ts: https://github.com/chengpeiquan/chengpeiquan.com/blob/main/src/main.ts
[47]vue-baidu-analytics: https://github.com/chengpeiquan/vue-baidu-analytics
[48]vue-cnzz-analytics: https://github.com/chengpeiquan/vue-cnzz-analytics
[49]yarn: https://github.com/yarnpkg/yarn
[50]pm2: https://github.com/Unitech/pm2
[51]forever: https://github.com/foreversd/forever
[52]express: https://github.com/expressjs/express
[53]workflow: https://github.com/chengpeiquan/chengpeiquan.com/blob/main/.github/workflows/github-ci.yml
[54]Personal access tokens: https://github.com/settings/tokens
[55]创建 SSH 密钥对: https://www.alibabacloud.com/help/zh/doc-detail/51793.htm
[56]绑定 SSH 密钥对: https://www.alibabacloud.com/help/zh/doc-detail/51796.htm
[57]Jenkins: https://github.com/jenkinsci/jenkins
[58]渐进式 Web 应用(PWA) | MDN: https://developer.mozilla.org/zh-CN/docs/Web/Progressive_web_apps
[59]vite-plugin-pwa: https://github.com/antfu/vite-plugin-pwa
[60]#25: https://github.com/antfu/vite-plugin-pwa/pull/25
[61]@chengpeiquan/vite-plugin-pwa: https://www.npmjs.com/package/@chengpeiquan/vite-plugin-pwa
[62]The Art of Chawye Hsu: https://chawyehsu.com/
[63]Anthony Fu: https://antfu.me/
[64]Rewrite in Vite: https://antfu.me/posts/rewrite-in-vite
[65]package.json: https://github.com/chengpeiquan/chengpeiquan.com/blob/main/package.json
[66]vite.config.ts: https://github.com/chengpeiquan/chengpeiquan.com/blob/main/vite.config.ts
[67]Github 仓库: https://github.com/chengpeiquan/chengpeiquan.com
NextJS 静态 SSG 认证
【中文标题】NextJS 静态 SSG 认证【英文标题】:NextJS static SSG authentication 【发布时间】:2021-08-11 05:03:37 【问题描述】:用例
我正在创建一个付费博客网站,人们可以在该网站上向博主付费以查看他们的博客。
我选择的解决方案
我选择了 NextJS 来构建静态内容(SSG)。使用后备选项,静态内容也可以在站点部署后构建。
问题
现在,问题是身份验证。我们无法验证服务器上的任何传入请求,例如 s-s-r。
检查身份验证的唯一方法是在客户端。使用useEffect
钩子检查当前用户是否经过身份验证。
但是,这种方法的问题在于,任何用户都可以在客户端禁用javaScript
来查看内容。
有没有办法在服务器端验证 SSG 页面请求。
我不想使用 s-s-r,因为会增加成本。
【问题讨论】:
【参考方案1】:您可以使用名为 Auth0 的服务来实现静态站点身份验证。它每月最多免费提供数千个请求,并且具有您可以使用的 React 组件。确保遵循 auth0-react 而不是 nextjs-auth0 的教程(这是针对 s-s-r)。
这里是 Auth0 的链接:https://auth0.com/
【讨论】:
【参考方案2】:如果用户在 SSG 上进行身份验证,您可以返回 null
。如果您不通过 API 加载任何内容,那么用户将能够在代码中看到它(但没有多少用户会这样做)。如果您还没有设法解决此问题,现在可以选择 Vercel Edge Functions。
【讨论】:
以上是关于重构于 Vite:我如何做 SSG静态资源发布以及自动化部署的主要内容,如果未能解决你的问题,请参考以下文章
Vite中不能使用require,该怎么动态获取静态图片资源?
vite打包配置(静态资源合并打包/清除log/gzip压缩/ENV配置等)