Rspress on Cloudflare Workers
How to deploy rspress to cloudflare workers.
I had problems deploying this blog via cloudflare pages and so I switch to use cloudflare workers. This is a short guide how to setup rspress with cloudflare workers.
Setup a Rspress project
pnpm create rspress@latest
Setup Cloudflare Workers
pnpm add --save-dev wrangler @cloudflare/kv-asset-handler
Setup wrangler.toml
wrangler.toml
compatibility_date = "2023-10-30"
main = "src/index.ts" # The entry point for your Workers application
name = "UNIQUE NAME" # Your project's name
route = "https://blog.YOURDOMAIN.com/*" # The route to your Workers application
[build]
command = "npm run rs.build" # To preview the blog within the cloudflare workers environment,
# create a npm script to run rspress build
cwd = "." # Current working directory relative to wrangler.toml
watch_dir = "./docs" # Your blogposts directory
[site]
bucket = "./doc_build" # Important to create a bucket for the static files
Setup package.json
For local development use rspress dev
and to preview the blog with cloudflare workers enabled use wrangler dev
. To deploy the blog use wrangler deploy
.
package.json
"scripts": {
"rs.dev": "rspress dev",
"rs.build": "rspress build",
"preview": "rspress preview",
"start": "rspress build && rspress preview",
"dev": "wrangler dev",
"deploy": "wrangler deploy"
},
Create index.ts
To handle the static files, we need to create a index.ts
file in the src
directory. So the cloudflare worker can handle the static files.
src/index.ts
import { getAssetFromKV } from '@cloudflare/kv-asset-handler'
// @ts-ignore
import manifestJSON from '__STATIC_CONTENT_MANIFEST'
const assetManifest = JSON.parse(manifestJSON)
export default {
async fetch(request, env, ctx) {
try {
// Add logic to decide whether to serve an asset or run your original Worker code
return await getAssetFromKV(
{
request,
waitUntil: ctx.waitUntil.bind(ctx)
},
{
ASSET_NAMESPACE: env.__STATIC_CONTENT,
ASSET_MANIFEST: assetManifest
}
)
} catch (e) {
let pathname = new URL(request.url).pathname
return new Response(`"${pathname}" not found`, {
status: 404,
statusText: 'not found'
})
}
}
}
Example this blog
If you want to see a production setup of this blog, you can check out the source code and the blog.