视频地址:https://www.bilibili.com/vide...

Sanity 建模

官网及文档: https://www.sanity.io/

# 起 Sanity 服务yarn add sanity@dev-preview sanity-plugin-markdown@studio-v3# 客户端调用yarn add @sanity/client

创立一个 Sanity 配置文件 sanity.config.ts

import { createConfig } from 'sanity';import { deskTool } from 'sanity/desk';import { markdownSchema } from 'sanity-plugin-markdown';export default createConfig({  name: 'default',  title: 'willin.wang',  projectId: 'crrougir',  dataset: 'production',  plugins: [deskTool(), markdownSchema()],  schema: {    types: [      {        title: 'Post',        name: 'post',        type: 'document',        fields: [          {            name: 'title',            title: 'Title',            type: 'string'          },          {            name: 'slug',            title: 'Slug',            type: 'slug',            options: {              source: 'title'            }          },          {            name: 'content',            title: 'Content',            type: 'markdown'          },          {            name: 'excerpt',            title: 'Excerpt',            type: 'string'          },          {            title: 'Tags',            name: 'tags',            type: 'array',            of: [              {                type: 'reference',                to: [{ type: 'tag' }]              }            ]          },          {            name: 'lang',            title: 'Language',            type: 'string',            initialValue: 'zhCN'          }        ]      },      {        name: 'tag',        title: 'Tag',        type: 'document',        fields: [          {            name: 'name',            title: 'Name',            type: 'object',            fields: [              {                name: 'zhCN',                title: '简体中文',                type: 'string'              },              {                name: 'enUS',                title: 'English',                type: 'string'              }            ]          },          {            name: 'slug',            title: 'Slug',            type: 'slug',            options: {              source: 'title'            }          }        ]      }    ]  }});

该配置文件蕴含:

  • 文章类型申明
  • 标签类型申明

后续还须要依据文章类型再加上:页面、文章、代码片段的辨别(做视频的时候忘了)。

本地启动 sanity 服务:

npx sanity start

而后拜访: http://localhost:3333 登录并治理内容。

Sanity 客户端调用封装

import createClient from '@sanity/client';const sanityConfig = {  projectId: process.env.SANITY_PROJECT_ID || 'crrougir',  dataset: process.env.SANITY_DATASET || 'production',  useCdn: process.env.NODE_ENV !== 'production',  apiVersion: '2021-03-25'};export const sanityClient = createClient(sanityConfig);export const previewClient = createClient({  ...sanityConfig,  useCdn: false,  token: process.env.SANITY_API_TOKEN});export const getClient = (preview) => (preview ? previewClient : sanityClient);

因为默认容许有两个 dataset,其中一个为 Production,所以能够应用 previewClient 来拜访开发环境。

Sanity 查问

GROQ 查询语言: https://www.sanity.io/docs/groq

须要好好看看,折腾了半天没太搞明确。好不容易凑了一个例子跑对了。

const postFields = `  _id,  title,  excerpt,  lang,  tags[]->{    name,    "slug": slug.current  },  "slug": slug.current,`;export const postQuery = `{  "post": *[_type == "post" && slug.current == $slug] | order(_updatedAt desc) [0] {    content,    ${postFields}  }}`;

留神 tags 那里,折腾了良久。

写一个测试接口:

import { json } from '@remix-run/node';import { postQuery } from '~/lib/query';import { getClient } from '~/lib/sanity';export const loader = async () => {  const data = await getClient().fetch(postQuery, { slug: 'test' });  return json(data);};