Sanity и Hugo

Матеріал з Wiki.Zina
Версія від 05:36, 9 серпня 2021, створена Romych (обговорення | внесок)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

←Sanity

Официальная инструкция: Integrating Sanity and Hugo with Netlify Plugins

Установка окружения

[ред. | ред. код]

Устанавливаем локально Hugo, Git, NodeJS, npm, Sanity CLI, Netlify CLI:

snap install hugo --channel=extended
sudo apt install git nodejs npm
sudo npm install -g @sanity/cli netlify-cli

Проверяем установленное:

hugo version
nodejs --version
npm --version
sanity --version
netlify --version

Создаем папку проекта. Внутри нее будет две рабочих папки:

  • web — сайт Hugo и репозиторий для деплоя в Netlify;
  • studio — Sanity Studio и схемы контента.

Находясь в корне проекта, клонируем репозиторий с подготовленной сборкой Hugo в папку web:

git clone https://github.com/bathrobe/hugo-sanity-starter-tut web

Запускаем сборку сайта средствами Hugo:

cd web
hugo server

Проверяем сайт в браузере:

Деплой на Netlify

[ред. | ред. код]

Создаем на GitHub, GitLab или Bitbucket новый репозиторий и добавляем в него содержимое папки web.

Логинимся на https://netlify.com/ и кликаем кнопку New site from Git.

Netlify запросит доступ к репозиторию. После того, как доступ будет предоставлен, Netlify определит команду для сборки сайта hugo и папку для итогового сайта:

Жмем "Deploy site" и ждем пару минут. Netlify закончит деплой из нашего репозитория к себе в облако и покажет ссылку на рабочий сайт на субдомене .netlify.app.

Sanity Studio

[ред. | ред. код]

Переходим в корень проекта и инициализируем Sanity:

cd ..
sanity init

В процессе выбираем: Create new project — Use the default dataset configuration — соглашаемся с предложенным Project output path — выбираем "blog (schema)".

После завершения появится новая папка, названная в соответствии с предложенным раньше Project output path — переименовываем ее в studio.

Получим в браузере админку для редактирования контента:

cd studio
sanity start

Откройте админку в браузере:

Можно поиграть с контентом, со связями между сущностями Post, Author, Category. Все изменения сохраняются сразу, но, чтобы отредактированную сущность можно было использовать в другой, нужно нажимать кнопку Publish.

Также можно поиграть со схемами контента, как написано в инструкции или в видео: https://youtu.be/32RP-sG1njE?t=259. Изменения сразу появляются в админке.

Также можно опубликовать наш контент в облаке Sanity, сделав его доступным для редактирования другими участниками команды:

sanity deploy

Нужно будет придумать субдомен для URL типа название-вашего-проекта.sanity.studio — на этом адресе и будет доступна админка в облаке.

Импорт контента из Sanity в файлы .md в Hugo

[ред. | ред. код]

Делается посредством создания Netlify Build Plugin.

Перейдите в web и запустите netlify link:

cd ../web/
netlify link

Netlift спросит, с каким проектом связать текущую папку — выбираем Use current git remote origin.

После этого можно тестировать плагин командой netlify build --dry.

Для создания плагина создадим файл package.json командой:

npm init -y

Установим необходимые зависимости:

npm install @sanity/block-content-to-markdown @sanity/client fs-extra

Создайте файл netlify.toml:

touch netlify.toml

и добавьте в него две строки:

[[plugins]]
package = "/plugins/netlify-sanity-md"

Создайте вложенные папки:

mkdir -p plugins/netlify-sanity-md

и внутри два файла — index.js и manifest.yml:

touch plugins/netlify-sanity-md/index.js plugins/netlify-sanity-md/manifest.yml

Вставьте в manifest.yml строку:

name: netlify-sanity-md

Внутри index.js напишите скрипт плагина, как это описано в инструкции:

module.exports = {
  onPreBuild: async ({ utils, packageJson }) => {
    console.log("Starting plugin");
    //imports
    const fs = require("fs-extra");
    const toMarkdown = require("@sanity/block-content-to-markdown");
    const client = require("@sanity/client")({
      projectId: "YOUR_PROJECT_ID_HERE",
      dataset: "YOUR_DATASET_HERE",
      useCdn: false,
    });

    //add any serializers for your portable text
    const serializers = {
      types: {
        code: (props) =>
          "```" + props.node.language + "\n" + props.node.code + "\n```",
      },
    };

    fs.readdir("./content", (err, files) => {
      if (err) console.log(err);
      else {
        files.forEach((file) => {
          console.log(`Deleting: ${file}`);
          fs.unlink(`content//${file}`, (err) => {
            if (err) throw err;

          });
        });
      }
    });

    try {
      await client
        .fetch(`*[_type == "post"]{categories[]->{title}, date, slug, title, body}`)
        .then((res) =>
          res.map(async (post) => {
            //output YAML frontmatter here
            let frontmatter = "---";
            Object.keys(post).forEach((field) => {
              if (field === "slug") {
                return (frontmatter += `\n${field}: "${post.slug.current}"`);
              } else if (field === "categories") {
                return (frontmatter += `\n${field}: [${post.categories.map(
                  (cat) => `"${cat.title}"`
                )}]`);
              } else if (field === "body") {
                return;
              } else {
                frontmatter += `\n${field}: "${post[field]}"`;
              }
            });
            frontmatter += "\n---\n\n";

            const wholePost = `${frontmatter}${toMarkdown(post.body, {
              serializers,
            })}`;

            const filePath = `./content/${post.slug.current}.md`;
            fs.outputFile(filePath, wholePost, function (err, data) {
              if (err) {
                return console.log(err);
              }
            });
          })
        );
    } catch (error) {
      utils.build.failBuild("Failure message", { error });
    }
  },
};

В начале скрипта вставьте значения:

      projectId: "YOUR_PROJECT_ID_HERE",
      dataset: "YOUR_DATASET_HERE",

из файла studio/sanity.json.

Выполните команду:

netlify build

и проверьте — внутри папки content появятся файлы, соответствующие контенту в Sanity Studio.

Удалите папку public и отправьте код в репозиторий:

git add .
git commit -m "Create Netlify plugin"
git push

Выполните деплой:

netlify build

и проверьте URL вашего сайта на .netlify.app - там уже должна быть обновленная версия с контентом из Sanity Studio.

Deploy from the Sanity dashboard

[ред. | ред. код]
cd ../studio
sanity install @sanity/dashboard
sanity install dashboard-widget-netlify

Добавьте в файл sanity.json:

    //...
      "parts": [
    //...
      {
         "implements": "part:@sanity/dashboard/config",
         "path": "src/dashboardConfig.js"
       }
     ]

Создайте папку src и в ней файл dashboardConfig.js. Вставьте в этот файл строки:

export default {
    widgets: [
        {
        name: 'netlify',
        options: {
          title: 'My Netlify deploys',
          sites: [
            {
              title: 'My Hugo Sanity Website',
              apiId: 'YOUR_API_ID',
              buildHookId: 'YOUR_BUILDHOOK_ID',
              name: 'NETLIFY_SITENAME'
            }
          ]
        }
      }
    ]
}

Вместо apiId вставьте значение из Netlify "Site Settings > General > Site Details > Site Information > API ID".

buildHookId сгенерируйте на Netlify "Site Settings > Build and Deploy > Build Hooks > Add build hook". В качестве ID используйте часть после build_hooks/.

Запустите локальную Sanity Studio:

sanity start

Откройте в браузере http://localhost:3333/ — вверху появится кнопка Dashboard, которая открывает страницу http://localhost:3333/dashboard с кнопкой Deploy на Netlify.

Теперь вносите изменения в контент, после сохранения нажимайте Deploy — сайт будет автоматически обновляться.