头图

前言

Notion 应该是目前用户量比较大的一个在线笔记软件,它的文档系统也非常完善,支持多种文档格式,如 Markdown、富文本、表格、公式等。

早期我也用过一段时间,后来有点不习惯,就换到了 Obsidian ,但是身边人用的还是很多的,随着 Astro 5.0 的发布,在内容集成上也提供了更多的方向,这期就来聊聊 DevNowNotion 的支持。

1.Notion 设置

1.1 创建 Notion 集成

1.1.1 什么是内部集成?

内部集成允许 Notion 工作区成员通过 Notion REST API 与工作区交互。每个内部集成都与单个特定工作区绑定,并且只有工作区内的成员可以使用该集成。将内部集成添加到工作区后,成员必须手动授予集成访问他们希望其使用的特定页面或数据库的权限。

集成管理 中添加新的机集成,用来获取 token

成功创建后入下图,我们可以在 功能 模块中管理集成的权限,这里我们主要是读取内容,然后可以获取到 内部集成密钥PUBLIC_NOTION_TOKEN

1.2 创建 Notion 数据源

目前我们集成只能同步 Database 中的内容,所以我们需要先创建一个 Database。

顶部选中的字符串是 PUBLIC_NOTION_DATABASE_ID ,我们需要将其复制下来,后面会用到。

如图,我们创建一个工作站,然后创建一个 Database 数据源,用来管理我们需要在 DevNow 中展示的文章,为了统一文章的结构,我们在 Database 中添加以下属性:

  • title: 文本
  • desc: 文本
  • publishDate: 创建时间
  • image: 图片
  • category: 单选
  • tags: 文本, 如果有多个,请通过 , 分割
  • author: 文本

:::tip[提示]
关于 category 字段,建议大家参考 src/data/category.ts 中的分类,将其添加到 Notion 对应的详细那个中,如下:

这样方便大家在 DevNow 中查看文章时,能够快速找到对应的分类。如果有新增,请同时更新,否则会报错。


:::

1.3 关联集成

我们在对应的工作站中关联相关的集成,这样我们就可以在 DevNow 中通过 Loader 获取相关的内容了。

如图,将我们之前添加的集成关联进来。

1.4 创建新文章

如图,我们需要完善所有的属性:

到这里我们 Notion 相关的配置就完事了。

2. 环境变量配置

如果是通过 Vercel 部署的,可以对应的项目中添加环境变量:

  • PUBLIC_NOTION_DATABASE_ID
  • PUBLIC_NOTION_TOKEN

对应的值就是我们之前创建的 DatabaseIDtoken

如果是私有项目部署的话,可以在 .env 文件中添加相关内容。

3. DevNow 配置

DevNow 中,我们需要配置相关的 loader 来获取我们的内容,由于数据的不同,我们在数据层也要做一下兼容,我们统一将数据格式化成 src/content/config.ts 中的 SCHEMA 格式。

3.1 配置相关的 loader

Notion 的相关 loader 我们通过库 notion-astro-loader 库来实现。
如要接入,请将一下注释打开即可。

...
// import { notionLoader } from 'notion-astro-loader';

...
// export const NotionDocs = defineCollection({
//  loader: notionLoader({
//    auth: import.meta.env.NOTION_TOKEN,
//    database_id: import.meta.env.NOTION_DATABASE_ID
//  })
//});

export const collections = {
  doc: Docs,
//  notion: NotionDocs
};

3.2 数据源格式化

相关文件已经在 DevNow 中添加,如果需要计入 Notion 数据源,同上把注释打开即可。
// import { richTextToPlainText } from 'notion-astro-loader';
// import { formatDate } from './utils';

// export const getNotionDocs = (await getCollection('notion')).map((item) => {
//   return {
//     id: item.id,
//     body: item.rendered?.html ?? '',
//     data: {
//       title: richTextToPlainText(item.data.properties.title.rich_text),
//       desc: richTextToPlainText(item.data.properties.desc.rich_text),
//       category: item.data.properties.category.select?.name || '',
//       author: richTextToPlainText(item.data.properties.author.rich_text),
//       tags: item.data.properties.tags.rich_text[0].plain_text.split(','),
//       image: item.data.properties.image.url,
//       publishDate: item.data.properties.publishDate.created_time,
//       pin: false
//     },
//     rendered: item.rendered,
//     filePath: item.id,
//     collection: item.collection,
//   };
// });

export const latestPosts = [
  ...(await getCollection('doc', ({ data }) => {
    return import.meta.env.PROD ? data.draft !== true : true;
  }))
  // 如果需要接入 Notion 数据源,需要将下面的注释去掉
  // ...getNotionDocs
].sort((a, b) => new Date(b.data.publishDate).valueOf() - new Date(a.data.publishDate).valueOf());

3.3 遗留问题

由于数据的问题,目前暂时无法实现 Notion 数据源 readTime 计算,所以 Notion 相关文章,暂时不展示。

已经兼容了 Notionheadings 和 其他的相关数据。

结果展示

列表页:

详情页:

总结

到这基本就完事了,可以通过这个方式,将 Notion 作为 DevNow 的数据源,来管理我们的文章。
这样可以更方便我们的数据管理,也可以更好的与 Notion 进行集成,让我们的文章更加的丰富。


LaughingZhu
233 声望21 粉丝

Web Engineer,坐标=》北京,喜欢爬山、唱歌、旅游。


« 上一篇
Doc for DevNow