2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

astro-notion-blogでNotionからブログ記事を書く

Last updated at Posted at 2024-02-01

ここでは、Astroを用いて高速なブログを生成する astro-notion-blog をローカルで試す方法を、つまづいた点を含めて解説する。

ブログ記事保存先としてのNotion

別件でブログを立ち上げようとしたが主に次の点で悩んでいた。

  • GitHub上に静的サイトジェネレーターのプロジェクトごとpushする: 記事や画像が多くなると git clone に時間がかかる可能性がある。立ち上げの初期段階ではその見積もりが難しい。
  • 画像をS3などのストレージにアップロードして使う: 記事, 画像の紐付けが煩雑になる
    • また、読み込みの転送量が従量課金の場合は万が一でもEDoS(Economy Denial of Service)が起こる可能性がある

Notionでは

  • 無料プランでブロック数無制限(文字や画像を挿入できる単位)
    • 1ファイル5MBまで
    • 読み込みに関する転送量については言及なし
  • アプリ連携を用いると静的サイトジェネレーターがページを生成するソースとして使用できる
  • 記事の編集時に全記事, システム一式をローカルに残しておく必要がない

と悩みを解決できているように見えた。


Notionで大量の記事を入れた際の挙動は確認していない

Notionでアプリ連携を作成する

はじめにブログの記事を保管するデータベースと、それをastro-notion-blogで取得する際のアプリ連携を設定する。

データベースのテンプレート を開き、自分のNotion Workspaceに複製する。

次に 公式ドキュメント をもとにアプリ連携を作成する。
Notionにログインした状態で My integrationsを開く。 Create new integrations をクリックする。

image.png

次の項目を入力してSubmitをクリックする。

  • Type: internal 固定になる
  • Associated workspace: 複製したテンプレートがあるworkspaceを指定する
  • Name: わかりやすい名前をつける
  • Logo: 省略可能

image.png

Internal Integration Secret の画面でShowボタンをクリックし アプリ連携のシークレット を表示する。これはAstroビルド時の環境変数として使用する。

image.png

Notionでアプリ連携とデータベースを紐づける

複製したテンプレートを開き、右上のメニューから Add connections から作成したアプリ連携を選択して紐づける。

image.png

作成した連携にデータベースを紐づける操作をしないと、Astroでのページビルド, devサーバーアクセス時に次のエラーが発生する。試した際は設定を忘れたので要注意。

@notionhq/client warn: request fail {
  code: 'object_not_found',
  message: 'Could not find database with ID: . Make sure the relevant pages and databases are shared with your integration.'
}

NotionのデータベースIDを取得する

アプリ連携を紐づけた後は Share, Copy link から共有用のURLを取得するとURLがコピーされる。その他共有権限の設定などを操作する必要はない。

image.png

URLは次のようになっている。 {A} の部分がデータベースのIDになっているので この部分だけをコピーする。他の部分は不要。

https://www.notion.so/{account}/{A}?v={B}&pvs=4

プロジェクトのセットアップ

ここではホスティングサービスにデプロイせずローカルで動作確認する方法を説明する。
astro-notion-blogのリポジトリをcloneする。

$ git clone git@github.com:otoyo/astro-notion-blog.git

環境変数を設定する。

  • NOTION_API_SECRET: アプリ連携を作成した際に表示された アプリ連携のシークレット
  • DATABASE_ID: 共有用URLの一部を切りとった データベースのID
$ export NOTION_API_SECRET=<YOUR_NOTION_API_SECRET>
$ export DATABASE_ID=<YOUR_DATABASE_ID>

最後にパッケージのインストール、devサーバーを起動してブラウザからアクセスするとNotionのデータベースからブログが生成される。
あとはAstroファイルを編集しブログの見た目を変えるなど試してみる。

$ cd astro-notion-blog
$ npm install
$ npm run dev

image.png

Node.js v21系では動作しなかった

2024-01-31現在でNode.js v21の環境だと npm install 時に node-gyp, re2 のインストールで次のエラーが発生する。

npm ERR! /Users//Library/Caches/node-gyp/21.6.0/include/node/v8-local-handle.h:253:5: error: static assertion failed due to requirement 'std::is_base_of<v8::Value, v8::Data>::value': type check
npm ERR!     static_assert(std::is_base_of<T, S>::value, "type check");
npm ERR!     ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
npm ERR! ../../nan/nan_callbacks_12_inl.h:175:20: note: in instantiation of function template specialization 'v8::Local<v8::Value>::Local<v8::Data>' requested here
npm ERR!       cbinfo(info, obj->GetInternalField(kDataIndex));

また、Astroのdevサーバー起動時に sharp パッケージのエラーが発生する。
sharp-darwin-arm64v8.node とあるが、Apple Silicon(ARM)だけではなく、x86_64でも同様のエラーが発生したためアーキテクチャー固有の問題ではない。

18:40:10 [vite] Error when evaluating SSR module /src/lib/notion/client.ts: failed to import "sharp"
|- Error: 
Something went wrong installing the "sharp" module

Cannot find module '../build/Release/sharp-darwin-arm64v8.node'
Require stack:
- /Users//temporary-projects/astro-notion-blog/node_modules/sharp/lib/sharp.js
- /Users//temporary-projects/astro-notion-blog/node_modules/sharp/lib/constructor.js
- /Users//temporary-projects/astro-notion-blog/node_modules/sharp/lib/index.js

このエラーに対する解決策として sharp@0.28.3 を導入しても別のエラーが起きて解決しなかった。

✘ [ERROR] No loader is configured for ".node" files: node_modules/sharp/build/Release/sharp.node

    node_modules/sharp/lib/output.js:4:22:
      4 │ const sharp = require('../build/Release/sharp.node');
        ╵                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Node.jsをLTSの20.11.0にすると上記の問題は発生しない。

参考

速さを追い求める人のためのNotionブログ astro-notion-blogをリリースしました - アルパカログ
https://alpacat.com/posts/introduction-of-astro-notion-blog/

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?