Open10

Next.jsでポートフォリオサイトを作ってみるつもりだったが、astro-notion-blogにした

kosuke itokosuke ito
❯ 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

参考
https://zenn.dev/ikkik/articles/51d97ff70bd0da

kosuke itokosuke ito

Fontを適当に入れてみる

Vercelが作成したGeist というフォントが流れてきたので、試しに入れてみた

https://vercel.com/font?ref=dailydev

https://www.npmjs.com/package/geist?activeTab=readme

- 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文を解釈することができた。

kosuke itokosuke ito

notionをブログのCMSとして活用する

Notion API(ディベロッパー向けページ) でmy integrationを作成する

データベースを作成したページにコネクトする

curlでAPIを叩く例が多いですが、Next.jsでサイトを作成しているのでライブラリがないか探していたら、notion-sdkがあったので、それを使用します。

https://github.com/makenotion/notion-sdk-js

.env.local
NOTION_SECRET=hogehogefugafuga
NOTION_DATABASE_ID=foobarbuz
blogs.js
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,
  }
}

参考資料

https://developers.notion.com/
https://zenn.dev/aono/articles/3a1c78ec9c6d1c
https://www.webcreatorbox.com/tech/chatgpt-nextjs-notion

kosuke itokosuke ito

公式ではCloudFlareにデプロイする方法がREADMEにかかれているのですが、せっかくVercelを使ったのでせっかくなのでVercelにデプロイしたいなと思ったら、既に先人がいました

https://necco.inc/note/19508

kosuke itokosuke ito

初めは上手くできてたが、途中からbuildは成功するがレイアウトが崩れるようになってしまった

解決

適当なbase_pathをVercelの環境変数に追加していたため、buildが失敗していたようだ
Vercelからbase_pathを削除したら直りました