🗒️Notion建站的补充点
2023-4-10
| 2023-6-2
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password
我尝试过几种博客方案:
  1. 国内博客网站:需要审核,自定义功能差
  1. GitHub的issue:分类差,观感差,不利于SEO
  1. Gitbook:页面展现差,md文件名不能有空格,pull+push繁琐
  1. hexo等方案:记不清缺陷了,也挺麻烦的
  1. notion+NotionNext+vercel:serverless,SEO友好(存疑)
目前使用的是最后一个方案,博客的本质是记录+分享,不应该被太多额外因素干扰。相比之前的几个方案,最重要的两点:1.更新博客只需要关心notion的具体内容,博客页面如果没更新,多刷新几次页面;2.vercel支持自定义域名和ssl证书自签发。所以notion+NotionNext+vercel 的架构基本是全托管解决方案,缺陷是国内对notion不够友好,网络延迟或者直接停摆,故顺畅使用需要额外的科学上网。

1.角色理解

  • notion → 数据底座
💡
为了让前端框架更好获取数据,notion需要使用database来管理字段、博客内容。
  • next.js(如NotionNext) → 渲染 + vercel → 部署
💡
注意:为了使用notion和next.js,需要将它们与vercel集成,以便在vercel上部署网站。
即使NotionNext 不能使用了,可以用同类Next.js项目替代。

2.动态更新

Ask:每次更新notion database内容后都需要vercel部署么?
Answer:不需要,因为Vercel的serverless监听检测revalidate设置的时间,more
如果 next.js 只在 build 的时候请求更新 JSON 文件的数据的话,就意味这我们每一次更新 Notion 的文章都需要重新 build 一下,这明显不符合最初的约定,还好它还提供来一个增量静态再生 (Incremental Static regeneration) 功能,只要我们在 getStaticProps 里再增加一下 revalidate: 1 的值,就可以利用 Vercel 的 serverless 稳定更新 JSON 文件的数据。 它的原理是利用 Vercel 的 serverless 监听检测 revalidate 设置的时间,等到检测失败后会在服务器上触发一次更新数据的操作,成功生成后,Next.js 将使缓存无效并显示更新页面所需要的 JSON 数据。如果后台重新生成失败,则旧页面保持不变。
NotionNext方案的getStaticProps见page/index.js
export async function getStaticProps() { const from = 'index' const props = await getGlobalNotionData({ from }) *** return { props: { meta, ...props }, revalidate: parseInt(BLOG.NEXT_REVALIDATE_SECOND) } }
revalidate: parseInt(BLOG.NEXT_REVALIDATE_SECOND) 见配置文件blog.config.js 里面的process.env.NEXT_PUBLIC_REVALIDATE_SECOND ,正常情况下,更新文章后,后台自动刷新。如果无效,手动刷新博客页面几次,或者无痕窗口打开。确实无法自动更新的话,可能是因为老版本存在bug,需要更新git项目
NEXT_REVALIDATE_SECOND: process.env.NEXT_PUBLIC_REVALIDATE_SECOND || 5, // 更新内容缓存间隔 单位(秒);即每个页面有5秒的纯静态期、此期间无论多少次访问都不会抓取notion数据; // 调大该值有助于节省Vercel资源、同时提升访问速率,但也会使文章更新有延迟。

3.notion ai

有了ai之后,summary可以直接生成。为什么需要summary?为了SEO。
目前,Notion AI 面向所有 Notion 用户免费试用,不过有 20 次的使用限制,如果想不受限制地使用 Notion AI,每人每月需要额外花费 10 美元。
notion image

4.CDN配置(可略)

因为vercel网络不佳,建议使用cloudflare的免费方案,使用cdn后,速度提升约10倍。
使用cloudflare意外的一点:文章更新后,不需要手动刷新cdn缓存。
此外,使用CF之后,ssl证书就是CF接管,就不止vercel端需要证书了,CF也需要配置证书(理论上是默认签发)。

5.database view tips

实际使用过程中发现每次新建的博客都在database最下面,因为默认的database只有table视角,鼠标滚轮需要一直滑到底,有点难受。故可以做的优化:
  • 新建一个database视角,比如gallery
  • 新建sort和filter规则,主要是sort规则:按日期排序。
  • 修改默认新建的文章模板时间为一个未来的时间,比如2025年10月1日
上述几个步骤做完后,每次点击new新建的文章都会出现在gallery视角的第一个位置,不用费力寻找。当然,你也许会说默认的table视角新建sort规则也一样,但是我并不想修改原始database的排序,特别是框架的menu和submenu存在一定的顺序关系。
notion image

6.NotionNext的源代码更新

总体思路:自定义参数不修改源码的config文件,而是在vercel里配置env。
  • process.env 前缀的自定义变量尽量不要写死在blog.config.js,用vercel的env配置。作者未配置process.env 的自定义参数需要等build后手动更改,通常不会很多。
  • 当前稳定的分支新建一个bak分支(便于回滚)
  • main分支点击sync fork ,静待vercel自动build结束
  • enjoy your new project
技术
  • 建站
  • 通过chatgpt学习terraformUbuntu 20.04安装k8s with containerd 1.6.6
    目录