Skip to content

Commit 4ace288

Browse files
committed
Add Vike framework guide
1 parent 984710a commit 4ace288

File tree

2 files changed

+188
-1
lines changed
  • src/content/docs/workers/framework-guides/web-apps

2 files changed

+188
-1
lines changed

src/content/docs/workers/framework-guides/web-apps/more-web-frameworks/index.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
title: More guides...
33
pcx_content_type: navigation
44
sidebar:
5-
order: 9
5+
order: 10
66
group:
77
hideIndex: true
88
---
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
---
2+
pcx_content_type: how-to
3+
title: Vike
4+
sidebar:
5+
order: 9
6+
head: []
7+
tags: ["full-stack"]
8+
description: Create a Vike application and deploy it to Cloudflare Workers with Workers Assets.
9+
---
10+
11+
import { Steps, PackageManagers } from "~/components";
12+
import { Tabs, TabItem } from '@astrojs/starlight/components';
13+
14+
You can use Vike with the [`vike-cloudflare`](https://www.npmjs.com/package/vike-cloudflare) extension for a zero-config Cloudflare deployment of your [SSR](https://vike.dev/ssr) or [pre-rendered (aka SSG)](https://vike.dev/pre-rendering) app.
15+
16+
17+
## What is Vike?
18+
19+
[Vike](https://vike.dev) is a Next.js/Nuxt alternative designed with a modular architecture for unprecedented flexibility and stability.
20+
21+
22+
## Create new app
23+
24+
Go to [vike.dev/new](https://vike.dev/new) and select `Cloudflare` to scaffold a new Vike app that uses `vike-cloudflare`.
25+
26+
27+
## Add to existing app
28+
29+
### Without a server
30+
31+
If you [pre-render](https://vike.dev/pre-rendering) all your pages then you don't need a server — simply add `vike-cloudflare` like this:
32+
33+
<Steps>
34+
35+
1. <PackageManagers
36+
pkg="vike-cloudflare wrangler cross-env"
37+
dev
38+
/>
39+
40+
2. ```diff lang=ts title="pages/+config.ts"
41+
import type { Config } from 'vike/types'
42+
+ import vikeCloudflare from 'vike-cloudflare/config'
43+
44+
export default {
45+
prerender: true,
46+
+ extends: [vikeCloudflare]
47+
} satisfies Config
48+
```
49+
50+
3. ```diff lang=json title="package.json"
51+
{
52+
"scripts": {
53+
"dev": "vike dev",
54+
+ "preview": "vike build && cross-env NODE_ENV=production wrangler pages dev",
55+
+ "deploy": "vike build && cross-env NODE_ENV=production wrangler pages deploy"
56+
}
57+
}
58+
```
59+
60+
</Steps>
61+
62+
### With a server
63+
64+
If you use [SSR](https://vike.dev/ssr), you must have a server — add `vike-cloudflare` like this:
65+
66+
<Steps>
67+
68+
1. <PackageManagers
69+
pkg="vike-cloudflare wrangler cross-env"
70+
dev
71+
/>
72+
73+
2. ```diff lang=ts title="pages/+config.ts"
74+
import type { Config } from 'vike/types'
75+
+ import vikeCloudflare from 'vike-cloudflare/config'
76+
77+
export default {
78+
+ extends: [vikeCloudflare],
79+
+ server: {
80+
+ entry: 'server/index.ts'
81+
+ }
82+
} satisfies Config
83+
```
84+
85+
3. <Tabs>
86+
<TabItem label="Hono">
87+
88+
```diff lang=ts title="server/index.ts"
89+
import { Hono } from 'hono'
90+
+ import { apply } from 'vike-cloudflare/hono'
91+
+ import { serve } from 'vike-cloudflare/hono/serve'
92+
93+
function startServer() {
94+
const app = new Hono()
95+
+ apply(app)
96+
+ return serve(app, { port: 3000 })
97+
}
98+
99+
+ export default startServer()
100+
```
101+
102+
</TabItem>
103+
<TabItem label="HatTip">
104+
105+
```diff lang=ts title="server/index.ts"
106+
import { createRouter } from '@hattip/router'
107+
+ import { apply } from 'vike-cloudflare/hattip'
108+
+ import { serve } from 'vike-cloudflare/hattip/serve'
109+
110+
function startServer() {
111+
const router = createRouter()
112+
+ apply(router)
113+
+ return serve(router, { port: 3000 })
114+
}
115+
116+
+ export default startServer()
117+
```
118+
119+
</TabItem>
120+
</Tabs>
121+
122+
> `vike-cloudflare` currently supports [Hono](https://hono.dev) and [HatTip](https://github.com/hattipjs/hattip) — more servers are coming soon.
123+
124+
4. ```diff lang=json title="package.json"
125+
{
126+
"scripts": {
127+
"dev": "vike dev",
128+
+ "preview": "vike build && cross-env NODE_ENV=production wrangler pages dev",
129+
+ "deploy": "vike build && cross-env NODE_ENV=production wrangler pages deploy"
130+
}
131+
}
132+
```
133+
134+
</Steps>
135+
136+
## Cloudflare APIs (bindings)
137+
138+
You can access Cloudflare's APIs (such as [D1](https://developers.cloudflare.com/d1/) and [KV](https://developers.cloudflare.com/kv/)):
139+
- In development, by using [`getPlatformProxy()`](https://developers.cloudflare.com/workers/wrangler/api/#getplatformproxy)
140+
- In production, by using [`import('cloudflare:workers')`](https://developers.cloudflare.com/workers/runtime-apis/bindings/#importing-env-as-a-global)
141+
142+
Using Vike's hook [`+onCreateGlobalContext.server`](https://vike.dev/onCreateGlobalContext), you can make [Cloudflare's bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/) (the `env` object) available anywhere via [`globalContext.cloudflare.env`](https://vike.dev/globalContext#custom).
143+
144+
```ts title="pages/+onCreateGlobalContext.server.ts"
145+
export { onCreateGlobalContext }
146+
147+
import type { GlobalContextServer } from 'vike/types'
148+
149+
async function onCreateGlobalContext(globalContext: GlobalContextServer) {
150+
let cloudflare: { env: Cloudflare.Env }
151+
if (import.meta.env.DEV) {
152+
const { getPlatformProxy } = await import('wrangler')
153+
cloudflare = (await getPlatformProxy()) as any
154+
} else {
155+
cloudflare = await import('cloudflare:workers')
156+
}
157+
globalContext.cloudflare = cloudflare
158+
}
159+
160+
declare global {
161+
namespace Vike {
162+
interface GlobalContextServer {
163+
cloudflare: { env: Cloudflare.Env }
164+
}
165+
}
166+
}
167+
```
168+
169+
```diff lang=ts title="vite.config.ts"
170+
import { defineConfig } from 'vite'
171+
172+
export default defineConfig({
173+
+ build: {
174+
+ rollupOptions: {
175+
+ external: ['cloudflare:workers']
176+
+ }
177+
+ }
178+
})
179+
```
180+
181+
> For an example of how to access [Cloudflare D1](https://developers.cloudflare.com/d1/) during development, see:
182+
> <PackageManagers
183+
> type="create"
184+
> pkg="vike@latest"
185+
> args="--react --hono --drizzle --cloudflare"
186+
> />
187+
> Or go to [vike.dev/new](https://vike.dev/new) and select `Cloudflare` with an ORM.

0 commit comments

Comments
 (0)