Next.jsでポートフォリオサイトを作ってみるつもりだったが、astro-notion-blogにした
❯ npx create-next-app@latest
✔ What is your project named? … hogehoge
✔ Would you like to use TypeScript? … No / Yes
✔ Would you like to use ESLint? … No / Yes
✔ Would you like to use Tailwind CSS? … No / Yes
✔ Would you like to use `src/` directory? … No / Yes
✔ Would you like to use App Router? (recommended) … No / Yes
✔ Would you like to customize the default import alias? … No / Yes
Creating a new Next.js app in /Users/itokosuke/projects/github.com/Kosuke-Ito/kosuke-hp.
Using npm.
Initializing project with template: app-tw
Installing dependencies:
- react
- react-dom
- next
- tailwindcss
- postcss
- autoprefixer
- eslint
- eslint-config-next
参考
Zennの記事を取得
画像を良い感じに配置する
Fontを適当に入れてみる
Vercelが作成したGeist というフォントが流れてきたので、試しに入れてみた
- error ../hoeghoge/node_modules/geist/dist/font.js:1
import localFont from "@next/font/local";
^^^^^^
SyntaxError: Cannot use import statement outside a module
at internalCompileFunction (node:internal/vm:73:18)
at wrapSafe (node:internal/modules/cjs/loader:1178:20)
at Module._compile (node:internal/modules/cjs/loader:1220:27)
at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
at Module.load (node:internal/modules/cjs/loader:1119:32)
at Module._load (node:internal/modules/cjs/loader:960:12)
at Module.require (node:internal/modules/cjs/loader:1143:19)
at require (node:internal/modules/cjs/helpers:121:18)
at geist/font
import文がモジュールの外部で使用されているために発生した。
geistパッケージのfont.jsファイルがESモジュールとして扱われていたため。
Next.jsは、デフォルトでサーバーサイドのコードをCommonJS形式で扱うらしい。
しかし、geistパッケージのfont.jsはESモジュール形式で書かれているため、この問題が発生したようです。
next-transpile-modulesというパッケージを使用して、geistパッケージをトランスパイルすることができる。
$ npm install next-transpile-modules
次に、next.config.js(またはnext.config.cjs)を以下のように更新します。
const withTM = require('next-transpile-modules')(['geist']);
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
images: {
formats: ['image/avif', 'image/webp'],
},
}
module.exports = withTM({nextConfig})
これにより、Next.jsはgeistパッケージをトランスパイルし、import文を解釈することができた。
notionをブログのCMSとして活用する
Notion API(ディベロッパー向けページ) でmy integrationを作成する
データベースを作成したページにコネクトする
curlでAPIを叩く例が多いですが、Next.jsでサイトを作成しているのでライブラリがないか探していたら、notion-sdkがあったので、それを使用します。
NOTION_SECRET=hogehogefugafuga
NOTION_DATABASE_ID=foobarbuz
import notion from '../utils/notion';
export const getStaticProps = async () => {
const response = await notion.databases.query({
database_id: process.env.NOTION_DATABASE_ID
});
const notionBlogs = response.results.map(page => ({
id: page.id,
title: page.properties.title.title[0].text.content,
}));
return {
props: {
articles: notionBlogs,
},
revalidate: 60 * 60 * 24,
}
}
参考資料
環境変数をVercelに設定する
Notion APIを使ってblogを書ける状態になりましたが、blockの取扱やこの先にSEO対策することを考えると面倒になったので、astro-notion-blogを使ってblog機能を作ることにしました
公式ではCloudFlareにデプロイする方法がREADMEにかかれているのですが、せっかくVercelを使ったのでせっかくなのでVercelにデプロイしたいなと思ったら、既に先人がいました
初めは上手くできてたが、途中からbuildは成功するがレイアウトが崩れるようになってしまった
解決
適当なbase_pathをVercelの環境変数に追加していたため、buildが失敗していたようだ
Vercelからbase_pathを削除したら直りました
その他行った設定
推奨言語の変更
ビルドの高速化