cover
notion blog 开发笔记
Apr 30, 2022ranguiquan
project

2022/4/16

目前为止大的框架已经搭建完成,包括数据获取,路由,布局,调试组件,还有一些基本组件的样式。记录几个学到很多的点。

css 用的 tailwindcss ,不包含 js 运行时,也就是说不能对类名做字符串拼接。遇到一个很普通的场景,组件要依靠 prop 改变自己的样式,而这个 prop 是枚举,而不是 boolean 的。要咋实现动态样式呢?总不能用三元表达式吧。从https://github.com/tailwindlabs/tailwindcss/discussions/3461学到,用一个对象来做映射就可以了。prop 的 category 做键,样式类名做值,在这个对象上面用方框操作符 [] 就可以映射过来啦。这篇帖子中也提到一个包 classnames 应对这种情形。

一个小细节:API 给我的 text 里面有用 \n 表示换行符,如果直接塞到 span 里面会变成一个空格。React 框架下不能把换行标签直接用字符串插进去,怎样让它正确换行呢,分享一下我的做法:

const plain_text_formatter = (plain_text) => {
  const divided_text = plain_text.split('\n');
  const res = [];
  divided_text.slice(0, divided_text.length - 1).forEach((item, index) => {
    res.push(...[item, <br key={index} />]);
  });
  res.push(divided_text[divided_text.length - 1]);
  res.filter((item) => item !== '');
  return res;
};

这个函数接受字符串,先从 \n 的地方切分掉得到一个字符串的数列,在数列每两项之间插入一 <br key={index} /> 元素,最后筛掉空字符串,把返回结果拿去渲染即可。

使用 vercel 构建的时候遇到诡异的错误:

本该从 getStaticProps 获取的数据竟然报 undefined,而且这个错误在开发模式下无法复现。折腾一通,在map函数前加上小问号解决问题,猜测可能是触发了 vercel 构建过程中的类型检查机制:

function post({ page, pageBlock, childrenBlocks }) {
  return (
    <div>
      <PostHead {...page} />
      {childrenBlocks?.map((block) => blockMapper(block))}
    </div>
  );
};
export default post

尝试处理 nested children blocks。这种层层嵌套的数据结构很不友好,加上 API 有每秒请求数量的限制,要好好研究一下怎么写 data fetching。

在导航栏上尝试了毛玻璃拟物效果,两句代码 bg-background/80 backdrop-blur-md 能出效果。backdrop 基本是和蒙版相关。

待办

深入了解使用迭代的异步编程,以及如何控制异步任务开始的间隔时间。
搞定 nested children blocks 的 data fetching。
ul ol 列表渲染

2022/4/18

重写datafetching相关的函数,用了令牌桶整流,请求失败重新请求。

2022/4/20

写好了两种列表,code block。语法高亮用到 react-syntax-highlighter ,仍然有待优化。

2022/4/21

用 flex 布局重写嵌套块。

解决了 flex item 中 text wrap 的问题。

解决了嵌套块颜色一致性的问题。

写了好几种文本块。

写了 Image Block,有待增强。

增加 Video Block, Youtube only for now. Using react-lite-youtube-embed

Use Embed Block to support bilibili H5 player.

待办

增强 Image

2022/4/22

😅搞了一天的 WSL2,可能是我的网卡有问题,虚拟机下无法使用 ssh。这样远程开发也可能遇到问题。放弃。

意外收获:升级 clash 到 0.19.16,新增 TUN 模式,发请求终于不卡了。

2022/4/23

增加可复用的 model,现在仅用于查看图片。

增加了配置文件,有待增强。

重写了 footer。

增加 property _Date 用于覆盖 page 创建日期,用来迁移老笔记。

迁移了小部分笔记。

Production deployed。

待办

SEO 优化
完成了 title 和 description,还有很多工作要做
可配置的 nav route
支持更多 block,书签类的优先。

2022/4/27

搞定了 WSL2,电脑好卡

书签可以渲染了

声明式的网站结构,site.config.js

bling bling 的新拟态小卡片

增加黑暗模式 好耶!。用 tailwind支持的 dark: 加上 context 实现

待办

content table
别打印不支持 block 信息了
研究一下 on demand ISR 怎么实现
dark mode 下 nextjs 警告和服务端渲染不一致怎么回事
Bookmark text wrap 有点问题,检查
尝试一下用 notion 支持内置评论功能

2022/4/28

content table,支持页内跳转。flex item + sticky 布局。

页内跳转的攻略:How to scroll to an element inside a div using javascript?

2022/4/29

支持了基于 notion database 的 comment 系统。逻辑就是把用户输入文本框的数据经过边缘函数提交到到 notion 数据库,一条留言对应一个 page。因为跨域限制,notion API 不可以直接从浏览器发请求,一定要通过服务器转发。这样是对的,毕竟数据库增删改权限很敏感。

page 的 properties 有很多可玩性,可以拓展实现非常多的功能。甚至可以用来做鉴权?

comment 之前有身份认证的过程,这里直接套用了 NextAuth 的解决方案,用 JWT。目前只支持了 GitHub,后面再更新其他。

如何在静态网页上保证互动的及时性?Nextjs 的 ISR 再快也比不上动态网页的更新速度。比如用户提交一条留言,这时候必须有人去访问才会 purge,这个用户如果不刷新只是在 app 内跳转的话就看不到自己提交的东西。我现在的解决方法是响应成功,就把新提交的留言存到 state 里面。这样带来的问题就是,如果用户来回跳转或者刷新,那么会发现之前的留言不见了,刷新几次后才重新出现,因为服务端文件终于刷新了。

怎样在服务端更新之际保证体验的连续性,我觉得可以尝试一下本地存储。

COMMENT
LOG IN: