type
status
date
slug
summary
tags
category
icon
password
我尝试过几种博客方案:
- 国内博客网站:需要审核,自定义功能差
- GitHub的issue:分类差,观感差,不利于SEO
- Gitbook:页面展现差,md文件名不能有空格,pull+push繁琐
- hexo等方案:记不清缺陷了,也挺麻烦的
- 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
目前,Notion AI 面向所有 Notion 用户免费试用,不过有 20 次的使用限制,如果想不受限制地使用 Notion AI,每人每月需要额外花费 10 美元。
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存在一定的顺序关系。
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