GitHub CodespacesでBun+Next.jsでアプリケーション作成
まずはGitHub Codespaces
で空のプロジェクトを作成する。
dindを使えるように以下コマンド実行後コンテナを再ビルド。
npx tiged microsoft/vscode-dev-containers/containers/docker-in-docker/.devcontainer ./.devcontainer
Bun
をダウンロードするようにDockerfile
に以下追記。
# Download Bun
USER vscode
RUN curl -fsSL https://bun.sh/install | bash \
&& echo "export PATH=$PATH:$HOME/.bun/bin" >> $HOME/profile
USER root
bun.sh
を実行したら自動的にPATHが通っているためRUN
の2行目は不要。
# Download Bun
USER vscode
+RUN curl -fsSL https://bun.sh/install | bash
-RUN curl -fsSL https://bun.sh/install | bash \
- && echo "export PATH=$PATH:$HOME/.bun/bin" >> $HOME/profile
USER root
Bun
でNext.js
プロジェクトを作成。
公式で手順が紹介されている。
見た目を整えるために一旦Daisy UI
を使う。Tailwind CSS
ベースのコンポーネントライブラリ。
普通にインストールできた。
bun add -d daisyui@latest
@tailwindcss/typography
もインストールしておく。
bun add -d @tailwindcss/typography
ORM
はPrisma
を使うので、インストール。
bun add prisma @prisma/client
これも公式で手順が公開されている。
ちなみにbun add -d prisma
だとエラーが発生した。
Prisma
の初期化をするためにbunx prisma init
を実行するも、何も反応しない。
どうやらbunx prisma
コマンドの実行にはNode.js
が必要らしい。(公式手順の一番上に書いてる)
Note — At the moment Prisma needs Node.js to be installed to run certain generation code. Make sure Node.js is installed in the environment where you're running bunx prisma commands.
Node.js
をインストールするようにDockerfile
を修正し、コンテナを再ビルド。
# ...
RUN apt-get update \
&& /bin/bash /tmp/library-scripts/common-debian.sh "${INSTALL_ZSH}" "${USERNAME}" "${USER_UID}" "${USER_GID}" "${UPGRADE_PACKAGES}" "true" "true" \
# Use Docker script from script library to set things up
&& /bin/bash /tmp/library-scripts/docker-in-docker-debian.sh "${ENABLE_NONROOT_DOCKER}" "${USERNAME}" "${USE_MOBY}" "${DOCKER_VERSION}" \
+ # Download Node.js
+ && apt-get install -y nodejs npm \
+ && npm install n -g \
+ && n stable \
+ && apt-get purge -y nodejs npm \
# Clean up
&& apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts/
# ...
Node.js
をインストールしたので改めてbunx prisma init
を実行するも、エラー発生。
公式手順ではbunx prisma init --datasource-provider sqlite
と実行しているので、--datasource-provider postgresql
を追加すると問題なく初期化出来た。(Vercel
でのデプロイを考えているためPostgreSQL
を利用)
bunx prisma init --datasource-provider postgresql
prisma init
コマンドの引数等は以下リンク先参照。
以下の記事を参考に開発用PostgreSQL
サーバーを立てた。
テーブル名やカラム名をスネークケースにしたい。
Prisma
で用意されている方法として、カラムには@map()
、テーブルには@@map()
を付けることで実際のテーブル名を変更できる。
ただ、単純に面倒なのと付け忘れが起こったりしそうなので以下の記事を参考にprisma-case-format
ツールを使うことにする。
Bun
でのインストールは以下の通り。
bun a -d prisma-case-format
以下、プロジェクトルート($CODESPACE_VSCODE_FOLDER/minimal-memo
)でのコマンド実行。
bun prisma-case-format --uses-next-auth -f prisma/schema.prisma
Auth.js
を利用している場合は、--uses-next-auth
オプションを付ける。
やっぱり認証関連はAmazon Cognito
を使うことにする。
以下のようにseed.ts
を作成してデータを作成しようとしたところ、データが作成されない。
import { Prisma, PrismaClient, TagType } from "@prisma/client";
const prisma = new PrismaClient();
const tweetList: Prisma.TweetCreateInput[] = [
// ...
];
const tagList: Prisma.TagCreateInput[] = [
// ...
];
async function main() {
await prisma.tweet.createMany({ data: tweetList });
await prisma.tag.createMany({ data: tagList });
}
main()
.catch((e) => {
console.error(e);
})
.finally(async () => {
await prisma.$disconnect();
});
どうやらbun
を使うときはトップレベルawait
構文で記述する必要があるらしい。
// ...
async function main() {
await prisma.tweet.createMany({ data: tweetList });
await prisma.tag.createMany({ data: tagList });
}
-main()
+await main()
.catch((e) => {
console.error(e);
})
.finally(async () => {
await prisma.$disconnect();
});
package.json
には以下のように記述した。
{
// ...
"prisma": {
"seed": "bun run prisma/seed.ts"
},
// ...
}