3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

グレンジAdvent Calendar 2024

Day 8

quartzで自分だけのデジタルガーデンを作ろう

Last updated at Posted at 2024-12-07

デジタルガーデンとは,個人の考えや興味を自由に表現し育てていくネット上の庭のような空間を指していると解釈しています.(参考:MIT Technology Reviewの記事).

今回はそんなデジタルガーデンを簡単に構築できる quartz を紹介します.

quartz の特徴

カスタマイズのしやすさ

quartzの特徴は何といっても高いカスタマイズ性にあると思っています.
組み込みの設定項目とプラグインによって,自分だけのデジタルガーデンを簡単に作るために仕組みが備わっています.

シンプルなコンテンツ記述

コンテンツはMarkdownでシンプルに記述できます.
レイアウトに関しても簡単な設定ファイル1つで見た目を割と好きに変更できます.

強力な組み込み機能

ObsidianのMarkdown記法と互換性があるため,WikilinkやMermeidといった機能をデフォルトで使えます.
さらに全文検索タグによる記事の関連付けなどのコンポーネントも利用できるため,お手軽に高機能なページを構築できます.

プラグイン

quartzには豊富なプラグインが組み込まれており,設定1つでオンオフが簡単に切り替えられます.
これらのプラグインはユーザ側でも簡単に作れるようになっており,必要に応じてカスタマイズができるようになっています.

コードベースの小ささ

他のSSGツールに比べるとコードの行数がかなり少ないことも特徴の1つです.
著名なSSGのOSSと比べると一目瞭然です.

  • quartz:約1万行(.ts ファイルの行数合計)
  • gatsby:約12万行(.ts ファイルの行数合計)
  • hugo:約19万行(.go ファイルの行数合計)

実装が把握しやすいため,何かカスタマイズしたいことがあれば比較的簡単に追加・修正ができるようになっています.

デプロイのしやすさ

SSGなのでビルドしてファイルをサーバに置くだけで簡単にデプロイができます.
公式がGitHub Pagesへのデプロイ用workflowを用意してくれているので,数分で自分だけのデジタルガーデンが作れます.

GitHub Pages以外にも Cloufrage PagesVercel など各種ホスティングサービスに対応しているため,こちらの Hosting を見てみてください.

5分で始めるデジタルガーデンの構築

自分がやっているAWS S3 + CloudFront でのホスティング手順を紹介します.

前提条件

  • Node >= v20
  • npm >= v9.3.1

HelloWorld!

まずはquartzをクローンしてきましょう.

git clone https://github.com/jackyzha0/quartz.git
cd quartz
npm i
npx quartz create

お好みのオプションを選択するとコンテンツ用のフォルダとレイアウトファイルが作成されるので,下記のファイルを編集しましょう.

コンテンツファイル

contentディレクトリの下に新しく hello.md でも作って新規ページを作成してみましょう.

content/hello.md
---
title: Hello, world!
---

This is the first content.

レイアウトファイル

コンポーネントリストから好きなコンポーネントを選んで追加してみてください.

長いので省略
quartz.layout.ts
import { PageLayout, SharedLayout } from "./quartz/cfg"
import * as Component from "./quartz/components"

// components shared across all pages
export const sharedPageComponents: SharedLayout = {
  head: Component.Head(),
  header: [],
  afterBody: [],
  footer: Component.Footer({
    links: {
      GitHub: "https://github.com/jackyzha0/quartz",
      "Discord Community": "https://discord.gg/cRFFHYye7t",
    },
  }),
}

// components for pages that display a single page (e.g. a single note)
export const defaultContentPageLayout: PageLayout = {
  beforeBody: [
    Component.Breadcrumbs(),
    Component.ArticleTitle(),
    Component.ContentMeta(),
    Component.TagList(),
  ],
  left: [
    Component.PageTitle(),
    Component.MobileOnly(Component.Spacer()),
    Component.Search(),
    Component.Darkmode(),
    Component.DesktopOnly(Component.Explorer()),
  ],
  right: [
    Component.Graph(),
    Component.DesktopOnly(Component.TableOfContents()),
    Component.Backlinks(),
  ],
}

// components for pages that display lists of pages  (e.g. tags or folders)
export const defaultListPageLayout: PageLayout = {
  beforeBody: [Component.Breadcrumbs(), Component.ArticleTitle(), Component.ContentMeta()],
  left: [
    Component.PageTitle(),
    Component.MobileOnly(Component.Spacer()),
    Component.Search(),
    Component.Darkmode(),
    Component.DesktopOnly(Component.Explorer()),
  ],
  right: [],
}

ビルド & デプロイ

下記のyamlを .github/workflows/deploy.yaml とかに置けば,mainブランチへのプッシュ時に勝手にビルド & デプロイしてくれます.
※ Secrets に適切に値を設定する必要があります

GitHub Actions定義
name: Build And Deploy

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Setup Node
        uses: actions/setup-node@v3
        with:
          node-version: 18
      - run: npm ci
      - run: npx quartz build --bundleInfo
      - name: Setup AWS CLI
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_DEFAULT_REGION }}
      - name: S3 sync
        working-directory: public
        run: aws s3 sync --delete . s3://xxx/yyy
      - name: Cloudfront invalidate cache
        run: aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} --paths "/*"

以上です!
デジタルガーデンの育成,思った以上にお手軽で面白いので,皆さんも是非楽しんでみて下さい.

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?