vite-plugin-cloudflare-functions
Make Cloudflare Pages Functions works with Vite friendly.
Features
When should you use this plugin?
- If it is not necessary to use a heavy SSR framework like nuxt
- If your application is a static SPA, but you also want to write several API endpoints
If you have used some meta SSR framework like nuxt, there is no need to use this plugin. But if you want to add some API endpoints to your SPA, just use it.
This plugin provides some simple utilities to help you develop a SPA with serverless API endpoints powered by Cloudflare Pages Functions.
- Dev: Automatically start wrangler pages dev server
- Dev: Automatically generate serverless functions API type declaration
- Build: Automatically move the functions source directory for monorepo
Installation
npm i -D vite-plugin-cloudflare-functions
import { defineConfig } from 'vite';
import CloudflarePagesFunctions from 'vite-plugin-cloudflare-functions';
export default defineConfig({
plugins: [
CloudflarePagesFunctions()
]
});
Usage
Functions
Just write pages functions as usual, but you can use the following utility functions to make auto-generation and IDE type inference work.
makePagesFunction
makeRawPagesFunction
makeResponse
: create a Response using your JSON objectmakeRawResponse
: same with new Response(...) but wrapped with a generic type used for type inference
import {
makeRawPagesFunction,
makePagesFunction,
makeResponse
} from 'vite-plugin-cloudflare-functions/worker';
export const onRequestGet = makePagesFunction(({ params }) => ({
status: 'OK',
data: 'Hello, ' + params.msg + '!'
}));
export const onRequestPost = makeRawPagesFunction(({ params }) =>
makeResponse({
status: 'OK',
data: 'Post ' + params.msg + ' OK!'
})
);
Override environment
For example, you have set the environment variable PASS
(you can config it in the plugin option, see Configuration).
import 'vite-plugin-cloudflare-functions/worker';
declare module 'vite-plugin-cloudflare-functions/worker' {
interface PagesFunctionEnv {
PASS: string;
}
interface PagesFunctionData {}
}
Then you can find the parameter env
has corresponding type declarations.
import { makePagesFunction } from 'vite-plugin-cloudflare-functions/worker';
export const onRequestGet = makePagesFunction(({ env }) => ({
pass: env.PASS
}));
Client
Just write you client code as usual, but for we generate the API endpoint response body type declarations automatically, so that with the provided client useFunctions
(powered by axios), your IDE will provide smarter IntelliSense.
import { useFunctions } from 'vite-plugin-cloudflare-functions/client';
const client = useFunctions();
client.get('/api/world').then((resp) => {
});
Full example is here.
Configuration
import { defineConfig } from 'vite';
import CloudflarePagesFunctions from 'vite-plugin-cloudflare-functions';
export default defineConfig({
plugins: [
CloudflarePagesFunctions({
root: './functions',
outDir: undefined,
dts: './cloudflare.d.ts',
wrangler: {
port: 8788,
log: true,
binding: {
KEY: 'VALUE'
},
kv: [
'NAMESPACE'
],
d1: [
'D1'
],
do: {
DO: 'DO'
},
r2: [
'BUCKET'
]
}
})
]
});
Note
This plugin starts the wrangler pages dev server under the hood. The configuration field binding
, kv
, do
, d1
, r2
are passed to run the command wrangler pages dev
to start pages dev server. You can find more information about this command at Commands - Cloudflare Worker docs.
The generated command of the above example is wrangler pages dev --local --ip localhost --port 8788 --proxy <generated by vite dev server> --binding KEY=VALUE --kv NAMESPACE --d1 D1 --do DO=DO --r2 BUCKET
.
License
MIT License © 2022 XLor