Closed6

remix + cloudflare pages + D1でページを見れるまで

ym5754nym5754n

GitHubでリポジトリ作成

後述のcloudflareへのデプロイのために、上で作ったプロジェクトをGitHubにあげておく

cloudflareへのデプロイ

  1. cloudflareのダッシュボード>Worker & Pages>概要>Pages>Gitに接続
  2. 画面の説明に従って接続する
  3. ダッシュボードでさっきつくったリポジトリを選択>セットアップの開始
  4. セットアップ内容は以下の通り
プロダクションブランチ ビルドコマンド ビルド出力ディレクトリ
main npm run build build/client
  1. 保存してデプロイする
  2. デプロイ完了後URLが吐き出されるのでアクセスして表示できたらデプロイ完了!(しばらくの間はアクセスしてもエラーになってましたが時間置くとちゃんと表示されました)

https://developers.cloudflare.com/pages/framework-guides/deploy-a-remix-site/#deploy-with-cloudflare-pages

ym5754nym5754n

D1と接続する

  1. 以下コマンドでwranglerをインストールする(global非推奨とのこと)
npm install wrangler --save-dev

https://developers.cloudflare.com/workers/wrangler/install-and-update/#install-wrangler

  1. wrangler loginで作成済みのcloudflareアカウントにログイン
  2. 以下コマンドでデータベースを作成する(完了するとcloudflare上にDBが作られる)
npx wrangler d1 create <DB_NAME>

https://developers.cloudflare.com/d1/get-started/#3-create-a-database

  1. プロジェクト直下にwrangler.tomlファイルを作成し、3で出力された[[d1_databases]]以下をコピペして保存
  2. プロジェクト直下に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');
  1. 以下コマンドでローカル上でクエリを流す
npx wrangler d1 execute <DB_NAME> --local --file=./schema.sql
  1. 以下コマンドで流したクエリのデータが表示されたらOK
npx wrangler d1 execute <DB_NAME> --local --command="SELECT * FROM Customers"
  1. 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>
  );
  1. ローカル上で動作が確認できたら以下コマンドで本番DBにデータを流す
npx wrangler d1 execute <DB_NAME> --remote --file=./schema.sql
  1. 以下コマンドで本番DBにデータが入ったか確認
npx wrangler d1 execute <DB_NAME> --remote --command="SELECT * FROM Customers"
  1. ダッシュボード>Worker & Pages>[プロジェクト]>設定>D1データベースバインディングで以下設定
変数名 D1データベース
DB <DB_NAME>

https://developers.cloudflare.com/d1/get-started/#7-deploy-your-database

  1. 最後に変更内容をGitHubにpushして本番環境でテーブルのデータが表示されたらOK!!
ym5754nym5754n

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

https://developers.cloudflare.com/d1/tutorials/d1-and-prisma-orm/

ym5754nym5754n

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はサイズが大きすぎるので実行できないようで…
https://zenn.dev/chimame/articles/d3e7af9a612038
今後有料版に切り替えることも検討したいけど、prismaは必須要件でもないし、一旦入れずに進める方向で
必要になれば他のORMいれるか、課金するか、もしくはPrismaのアップデートに期待するかします

このスクラップは3ヶ月前にクローズされました