type
status
date
summary
tags
category
icon
在使用 的过程中,为了更加简洁些,没有直接使用其提供的模板,而且只使用其中的 Blog Post这个数据库文件,于是就发生各种神奇的事情了。
nextjs-notion-starter-kit
transitive-bullshit • Updated Aug 30, 2023
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fd3e60120-b137-4d60-98f4-874e4a350341%2FUntitled.png?table=block&id=d21f0f7c-a51f-48f0-91a2-6a49b9aed4c8&t=d21f0f7c-a51f-48f0-91a2-6a49b9aed4c8&width=630&cache=v2)
1. 头图不展示问题
在database中设置了头图,但是本地运行时却拿不到图片,初级解决方案是在 site.config.ts 配置一个兜底的头图:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fd7dd505f-0e51-41c3-9bbc-1e5117806467%2FUntitled.png?table=block&id=931e55e9-176c-4dab-ad0c-20a9dc70df0c&t=931e55e9-176c-4dab-ad0c-20a9dc70df0c&width=1984&cache=v2)
但这样越想越难受,某一天心情不好了,想换一个头图,还得改项目代码,这个就更加难受呀。
于是乎,不管有没有准备好跳进深坑,却毫无意外的进去了。。。
想要解释清楚这个问题的,得涉及到Notion的数据结构的设计,由于我也对这个比较陌生,就不误导大家了,但这并不耽误解决这个头图的问题。 先上方案,再稍微解释一下:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fb36b04cc-c773-4058-9b8c-6b74322ae419%2FUntitled.png?table=block&id=5791bef7-2188-43c8-8285-d4ffd7b704b6&t=5791bef7-2188-43c8-8285-d4ffd7b704b6&width=1358&cache=v2)
首先获取的是第一个block,是一个 collection_view 类型的数据,里面包含一个 collection,再Notion中设置的头图被包含在collection中,于是乎我们需要手动赋值一下,代码如下:
看着是几行代码,但里面还包含第二个坑的解决方案,接下来为您揭晓。
2. 项目本地运行时会有错误提示
先看图,有图有真相:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ff1c52816-6f9e-4690-9d71-9e70238f0546%2FUntitled.png?table=block&id=f53f2ccd-6988-4c39-b734-885d26fe841a&t=f53f2ccd-6988-4c39-b734-885d26fe841a&width=1884&cache=v2)
控制台报错的文案有三个:
1. Warning: Expected server HTML to contain a matching <div> in <main>. 2. Uncaught Error: Hydration failed because the initial UI does not match what was rendered on the server. 3. Warning: An error occurred during hydration. The server HTML was replaced with client content in <div>.
网上找了一圈,解决方案都是基于自己写的代码,修改对于的渲染逻辑。如果有差异性的可以通过设置一个 boolean值的state,在client端通过 useEffect 修复这个state值,从而触发client独有的逻辑,避免注水代码不一样。
但是,这并不适用这个场景呀,都是现有代码,等一个一个逻辑确认是否有问题,心都拔凉拔凉的,可能都放弃了。
故我的思路是,竟然说是注水失败,也就是说server给的html和浏览器渲染出来的html存在不一致,不一致的地方可以从这个异常中知道大致的位置:
Warning: Expected server HTML to contain a matching <div> in <main>.
就是<main> 标签有问题咯,于是搜索一下 server返回的html文件,同时对比一下client侧的,幸运的是html只有一个 <main>标签,如果是div标签有问题可能就GG了
Server返回的html文件:
Client渲染出来的html
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F8de3f18d-213e-4151-86f5-4c5890d82e04%2FUntitled.png?table=block&id=b1c0c938-3ca2-4a60-b1fa-eb2ec44447f1&t=b1c0c938-3ca2-4a60-b1fa-eb2ec44447f1&width=1774&cache=v2)
可以发现Client渲染的多了一个 span标签,是一个图标文件。知道这些信息就可以看进一步排查了,思路是:
- 看这个图标文件是在哪里渲染的,通过class名称搜索即可;
- 了解渲染逻辑,React渲染都是由数据驱动的,渲染不同也就意味数据不一样;
- 确认数据赋值逻辑,解决数据不一致的问题,就解决了这个问题了;
这个问题原因是在渲染 Collection时,在渲染过程中会将其icon文件赋值给 页面的Block,导致Server端一开始没有图标文件,但是到Client端却又有数据,从而出现不一致:
![问题原因截图](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F01ced3f1-f7c1-49a8-afd9-ecf2f14ed168%2FUntitled.png?table=block&id=c4c2a572-ab10-4a55-8fc6-93396cb94bf4&t=c4c2a572-ab10-4a55-8fc6-93396cb94bf4&width=1460&cache=v2)
解决方案其实已经在第一个坑中,渲染之前就将这个数据赋值一下:
![问题解决方案](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F0be9aebe-c540-4637-b173-3e087f937c47%2FUntitled.png?table=block&id=d6ab9808-c7b7-4189-b3c0-0102aef32cdc&t=d6ab9808-c7b7-4189-b3c0-0102aef32cdc&width=1446&cache=v2)
这坑,我真的是无言吐槽了。。。非常的隐蔽,还亏有可以全局搜索文本。
3. 面包屑导航没有首页,形同虚设
有图有真相,顶部只有一个孤零零的一个标题,而且还没有下面的标题大。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fe0469179-2b36-4bea-9a88-41126b11007f%2FUntitled.png?table=block&id=9532d524-c603-4529-aac0-217861abaafe&t=9532d524-c603-4529-aac0-217861abaafe&width=1244&cache=v2)
而我的预期是这个样子的:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F6b774b32-a496-4eb5-8fe7-f26b861d71d2%2FUntitled.png?table=block&id=65c69351-6670-4ec3-bb6d-8e49bdb75e51&t=65c69351-6670-4ec3-bb6d-8e49bdb75e51&width=1196&cache=v2)
看到截图就已经知道我解决了这个,这个问题只是涉及到一个组件,所有相对好简单些:
- 将 react-notion-x 项目中 packages/react-notion-x/src/components/header.tsx 中的 Breadcrumbs 复制到项目中的components目录下,方便魔改一下;
- 添加下述代码:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fabd80f56-4720-4163-9167-e75f13928d74%2FUntitled.png?table=block&id=ddc8b7f0-b11b-4f67-8327-01b09fe14118&t=ddc8b7f0-b11b-4f67-8327-01b09fe14118&width=576&cache=v2)
- 最后修改一下配置文件将 navigationStyle 设置为 “custom”,然后就可以预期的效果了。
附源码:
4. GitHub链接的mention 不展示
需要在Notion中 GitHub 应用connect 到 GitHub账号中(如果没有connect,hover到每一个 GitHub mention都会有提示的),支持获取GitHub的一些信息,然后会更新mention的一些属性,此时 react-notion-x才可以正常展示链接。
如果connect到GitHub了,每一个GitHub Mention的链接hover效果为:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F9fd20760-8a2f-487d-be1d-74a70f91f94d%2FUntitled.png?table=block&id=6800abe1-2a34-4728-a81f-b71331840dd0&t=6800abe1-2a34-4728-a81f-b71331840dd0&width=726&cache=v2)
附一个渲染正常的截图:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Ffccb1cd0-604b-4c24-9126-cb4844a34568%2FUntitled.png?table=block&id=8a5d68ac-2e98-49e4-b5b8-98cf22976ca5&t=8a5d68ac-2e98-49e4-b5b8-98cf22976ca5&width=1318&cache=v2)
应该还未完,敬请期待更多填坑的经验~