Closed6
remix + cloudflare pages + D1でページを見れるまで
プロジェクトの作成
とりあえずテンプレートを使ってプロジェクトを作成
npx create-remix@latest --template remix-run/remix/templates/cloudflare
npm run dev
を実行して表示を確認
GitHubでリポジトリ作成
後述のcloudflareへのデプロイのために、上で作ったプロジェクトをGitHubにあげておく
cloudflareへのデプロイ
- cloudflareのダッシュボード>Worker & Pages>概要>Pages>Gitに接続
- 画面の説明に従って接続する
- ダッシュボードでさっきつくったリポジトリを選択>セットアップの開始
- セットアップ内容は以下の通り
プロダクションブランチ | ビルドコマンド | ビルド出力ディレクトリ |
---|---|---|
main | npm run build | build/client |
- 保存してデプロイする
- デプロイ完了後URLが吐き出されるのでアクセスして表示できたらデプロイ完了!(しばらくの間はアクセスしてもエラーになってましたが時間置くとちゃんと表示されました)
D1と接続する
- 以下コマンドでwranglerをインストールする(global非推奨とのこと)
npm install wrangler --save-dev
-
wrangler login
で作成済みのcloudflareアカウントにログイン - 以下コマンドでデータベースを作成する(完了するとcloudflare上にDBが作られる)
npx wrangler d1 create <DB_NAME>
- プロジェクト直下に
wrangler.toml
ファイルを作成し、3で出力された[[d1_databases]]
以下をコピペして保存 - プロジェクト直下に
schema.sql
ファイルを作成し、以下sql(例)をコピペして保存
DROP TABLE IF EXISTS Customers;
CREATE TABLE IF NOT EXISTS Customers (CustomerId INTEGER PRIMARY KEY, CompanyName TEXT, ContactName TEXT);
INSERT INTO Customers (CustomerID, CompanyName, ContactName) VALUES (1, 'Alfreds Futterkiste', 'Maria Anders'), (4, 'Around the Horn', 'Thomas Hardy'), (11, 'Bs Beverages', 'Victoria Ashworth'), (13, 'Bs Beverages', 'Random Name');
- 以下コマンドでローカル上でクエリを流す
npx wrangler d1 execute <DB_NAME> --local --file=./schema.sql
- 以下コマンドで流したクエリのデータが表示されたらOK
npx wrangler d1 execute <DB_NAME> --local --command="SELECT * FROM Customers"
- TOPにローカルのテーブルデータを表示する
app/routes/_index.tsx
+ import type { LoaderFunction, MetaFunction } from "@remix-run/cloudflare";
+ import { json } from "@remix-run/cloudflare";
+ import { useLoaderData } from "@remix-run/react";
+
+ interface Env {
+ DB: D1Database;
+ }
+
+ type Customer = {
+ CustomerID: number;
+ CompanyName: string;
+ ContactName: string;
+ }
// existing code
+ export const loader: LoaderFunction = async ({ context, params }) => {
+ const env = context.cloudflare.env as Env;
+ const { results } = await env.DB.prepare("SELECT * FROM Customers").all<Customer>();
+ return json(results);
+ }
export default function Index() {
const customers = useLoaderData<typeof loader>() as Customer[];
return (
<div className="font-sans p-4">
<h1 className="text-3xl">Welcome to Remix on Cloudflare</h1>
<ul className="list-disc mt-4 pl-6 space-y-2">
- <li>
- <a
- className="text-blue-700 underline visited:text-purple-900"
- target="_blank"
- href="https://remix.run/docs"
- rel="noreferrer"
- >
- Remix Docs
- </a>
- </li>
- <li>
- <a
- className="text-blue-700 underline visited:text-purple-900"
- target="_blank"
- href="https://developers.cloudflare.com/pages/framework-guides/deploy-a-remix-site/"
- rel="noreferrer"
- >
- Cloudflare Pages Docs - Remix guide
- </a>
- </li>
+ {customers.map((customer) => (
+ <li key={customer.CustomerID}>
+ {customer.CompanyName}, {customer.ContactName}
+ </li>
+ ))}
</ul>
</div>
);
- ローカル上で動作が確認できたら以下コマンドで本番DBにデータを流す
npx wrangler d1 execute <DB_NAME> --remote --file=./schema.sql
- 以下コマンドで本番DBにデータが入ったか確認
npx wrangler d1 execute <DB_NAME> --remote --command="SELECT * FROM Customers"
- ダッシュボード>Worker & Pages>[プロジェクト]>設定>D1データベースバインディングで以下設定
変数名 | D1データベース |
---|---|
DB | <DB_NAME> |
- 最後に変更内容をGitHubにpushして本番環境でテーブルのデータが表示されたらOK!!
こちらの内容をかなり参考にさせていただきました。ありがとうございます。
Prismaを使えるようにする
以下のコマンドを叩いてprismaのパッケージを入れる
npm install prisma --save-dev
npm install @prisma/client
npm install @prisma/adapter-d1
prismaの初期化(sqlite)
npx prisma init --datasource-provider sqlite
schemaの設定追加
prisma/schema.prisma
generator client {
provider = "prisma-client-js"
+ previewFeatures = ["driverAdapters"]
}
migrationファイルを作る
npx wrangler d1 migrations create prisma-demo-db create_user_table
schemaにUserを追加
prisma/schema.prisma
+ model User {
+ id Int @id @default(autoincrement())
+ email String @unique
+ name String?
+ }
作った空のマイグレーションファイルに上記スキーマを流す
npx prisma migrate diff --from-empty --to-schema-datamodel ./prisma/schema.prisma --script > migrations/0001_create_user_table.sql
ローカルとリモートでマイグレートする
npx wrangler d1 migrations apply <DB_NAME> --local
npx wrangler d1 migrations apply <DB_NAME> --remote
できたUserテーブルにテストデータを流す
npx wrangler d1 execute <DB_NAME> --command "INSERT INTO \"User\" (\"email\", \"name\") VALUES ('jane@prisma.io', 'Jane Doe (Remote)');" --local
npx wrangler d1 execute <DB_NAME> --command "INSERT INTO \"User\" (\"email\", \"name\") VALUES ('jane@prisma.io', 'Jane Doe (Remote)');" --remote
Prismaは使えないことが発覚…
デプロイしたところ以下エラーが発生
Error: Failed to publish your Function. Got error: Your Functions script is over the 1 MiB size limit (workers.api.error.script_too_large)
cloudflare無料版だとprismaはサイズが大きすぎるので実行できないようで…
必要になれば他のORMいれるか、課金するか、もしくはPrismaのアップデートに期待するかします
このスクラップは5ヶ月前にクローズされました