Open6
Cloudflare pages + D1, Headless CMS 作成メモ
概要
pagesに、ヘッドレスCMS的な設置して使用するメモです
-
プロト版ですが、機能追加予定です
-
複数CMSを、HeadlessにAPI経由で接続し
-
D1インスタンスの数を、1のみ作成する。
[ 公開: 2023/12/30 ]
環境
- cloudflare pages
- cloudflare D1
- vite
- React, React-dom
- preact
- hono
作成したコード
- フルスタック構成
- React SSR: react-dom/server 使用
- フロントは、preact.js
- 予定している構成
- headlessは、フルスタック
- 表示系CMSは、API経由で連携する
手順
- D1インスタンス作成しておく
- pagesにデプロイ
- pages 設定画面、D1 バインディングを。作成したD1に設定する
- ローカルDBに、接続できない場合。.wrangler .mf フォルダを削除し。ローカルDB作成からやり直す
- package.json
{
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build && vite build --mode client",
"preview": "wrangler pages dev dist",
"deploy": "$npm_execpath run build && wrangler pages deploy dist"
},
"dependencies": {
"hono": "^3.11.11",
"htm": "^3.1.1",
"marked": "^11.1.0",
"micromodal": "^0.4.10",
"preact": "^10.19.3",
"react": "^18.2.0",
"react-dom": "^18.2.0"
},
"devDependencies": {
"@cloudflare/workers-types": "^4.20231218.0",
"@hono/vite-cloudflare-pages": "^0.1.2",
"@hono/vite-dev-server": "^0.3.1",
"@preact/preset-vite": "^2.7.0",
"@types/react": "^18.2.45",
"@types/react-dom": "^18.2.18",
"autoprefixer": "^10.4.16",
"postcss": "^8.4.32",
"tailwindcss": "^3.4.0",
"vite": "^5.0.10",
"wrangler": "^3.22.0"
}
}
- vite.config.ts
vite.config.ts
import pages from '@hono/vite-cloudflare-pages'
import devServer from '@hono/vite-dev-server'
import { defineConfig } from 'vite'
export default defineConfig(({ mode }) => {
if (mode === 'client') {
return {
build: {
lib: {
entry: [
'./src/client.ts',
'./src/client/SiteIndex.ts',
'./src/client/PostIndex.ts',
'./src/client/PostCreate.ts',
'./src/client/PostEdit.ts',
],
formats: ['es'],
fileName: '[name]',
},
rollupOptions: {
output: {
dir: './dist/static'
}
},
emptyOutDir: false,
copyPublicDir: false
}
}
} else {
return {
plugins: [
pages(),
devServer({
entry: 'src/index.tsx',
cf: {
d1Databases: ['DB'],
d1Persist: true
}
})
]
}
}
})
- GIF アニメ、追加しました。
- 表示用CMS 追加しました。
- .env 設定で、headless接続する形です。
-
API認証を追加、Middlewareで。 /api/* にKEY認証を追加しました
-
src/index.tsx
index.tsx
app.use("/api/*", async (c, next) => {
const body = await c.req.json();
console.log(body);
const v = await Common.validApiKey(body);
console.log(v);
if(!v){
return c.json({ret: "NG", data: [], message: "Error, api-Middleware-auth"});
}
await next();
});
- .env に、VITE_API_KEYを追加
- key不正値の場合、認証エラーにしてます。
VITE_USER_NAME=hoge
VITE_USER_PASSWORD=123456
VITE_API_KEY="123"