Skip to content

Commit cfe909a

Browse files
authored
Merge pull request #13 from preactjs/refactor/migrate-to-prerender-plugin
refactor: Migrate off of Vike and to `@preact/preset-vite`'s prerender functionality
2 parents 39b6c2d + 565be4c commit cfe909a

File tree

21 files changed

+95
-348
lines changed

21 files changed

+95
-348
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@
3030
"typescript": "^5.0.0"
3131
},
3232
"prettier": "prettier-config-rschristian"
33-
}
33+
}

src/index.js

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const brandColor = /** @type {const} */ ([174, 128, 255]);
2424
),
2525
);
2626

27-
const { dir, language, useRouter, useESLint, appType } = await prompts.group(
27+
const { dir, language, useRouter, usePrerender, useESLint } = await prompts.group(
2828
{
2929
dir: () =>
3030
prompts.text({
@@ -38,15 +38,6 @@ const brandColor = /** @type {const} */ ([174, 128, 255]);
3838
}
3939
},
4040
}),
41-
appType: () =>
42-
prompts.select({
43-
message: 'Project Type:',
44-
initialValue: 'spa',
45-
options: [
46-
{ value: 'spa', label: 'Single Page Application (only client-side)' },
47-
{ value: 'ssg', label: 'Static Site Generation (prerenders pages)' },
48-
],
49-
}),
5041
language: () =>
5142
prompts.select({
5243
message: 'Project language:',
@@ -56,13 +47,16 @@ const brandColor = /** @type {const} */ ([174, 128, 255]);
5647
{ value: 'ts', label: 'TypeScript' },
5748
],
5849
}),
59-
useRouter: ({ results }) =>
60-
results.appType === 'spa'
61-
? prompts.confirm({
62-
message: 'Use router?',
63-
initialValue: false,
64-
})
65-
: Promise.resolve(false),
50+
useRouter: () =>
51+
prompts.confirm({
52+
message: 'Use router?',
53+
initialValue: false,
54+
}),
55+
usePrerender: () =>
56+
prompts.confirm({
57+
message: 'Prerender app (SSG)?',
58+
initialValue: false,
59+
}),
6660
useESLint: () =>
6761
prompts.confirm({
6862
message: 'Use ESLint?',
@@ -81,13 +75,13 @@ const brandColor = /** @type {const} */ ([174, 128, 255]);
8175

8276
await useSpinner(
8377
'Setting up your project directory...',
84-
() => scaffold(targetDir, { useTS, useRouter, useESLint, appType }),
78+
() => scaffold(targetDir, { useTS, useRouter, usePrerender, useESLint }),
8579
'Set up project directory',
8680
);
8781

8882
await useSpinner(
8983
'Installing project dependencies...',
90-
() => installDeps(targetDir, packageManager, { useTS, useRouter, useESLint, appType }),
84+
() => installDeps(targetDir, packageManager, { useTS, useRouter, usePrerender, useESLint }),
9185
'Installed project dependencies',
9286
);
9387

@@ -116,9 +110,9 @@ async function useSpinner(startMessage, fn, finishMessage) {
116110
/**
117111
* @typedef {Object} ConfigOptions
118112
* @property {boolean} useTS
119-
* @property {unknown} useRouter
113+
* @property {boolean} useRouter
114+
* @property {boolean} usePrerender
120115
* @property {boolean} useESLint
121-
* @property {string} appType
122116
*/
123117

124118
/**
@@ -131,11 +125,7 @@ async function scaffold(to, opts) {
131125
await fs.mkdir(to, { recursive: true });
132126

133127
const __dirname = dirname(fileURLToPath(import.meta.url));
134-
if (opts.appType === 'spa') {
135-
await templateDir(resolve(__dirname, '../templates', 'base'), to, opts.useTS);
136-
} else {
137-
await templateDir(resolve(__dirname, '../templates', 'ssr'), to, opts.useTS);
138-
}
128+
await templateDir(resolve(__dirname, '../templates', 'base'), to, opts.useTS);
139129

140130
if (opts.useRouter) {
141131
await templateDir(
@@ -145,6 +135,19 @@ async function scaffold(to, opts) {
145135
);
146136
}
147137

138+
if (opts.usePrerender) {
139+
await templateDir(
140+
resolve(
141+
__dirname,
142+
'../templates',
143+
'config',
144+
opts.useRouter ? 'prerender-router' : 'prerender',
145+
),
146+
to,
147+
opts.useTS,
148+
);
149+
}
150+
148151
if (opts.useTS) {
149152
await fs.rename(resolve(to, 'jsconfig.json'), resolve(to, 'tsconfig.json'));
150153

@@ -203,7 +206,7 @@ async function installDeps(to, packageManager, opts) {
203206
await install(['typescript'], { prefer: packageManager, cwd: to, dev: true });
204207
}
205208

206-
if (opts.useRouter) {
209+
if (opts.useRouter || opts.usePrerender) {
207210
await install(['preact-iso', 'preact-render-to-string'], {
208211
prefer: packageManager,
209212
cwd: to,

templates/base/src/index.jsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { render } from 'preact';
2+
23
import preactLogo from './assets/preact.svg';
34
import './style.css';
45

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { LocationProvider, Router, Route, hydrate, prerender as ssr } from 'preact-iso';
2+
3+
import { Header } from './components/Header.jsx';
4+
import { Home } from './pages/Home/index.jsx';
5+
import { NotFound } from './pages/_404.jsx';
6+
import './style.css';
7+
8+
export function App() {
9+
return (
10+
<LocationProvider>
11+
<Header />
12+
<main>
13+
<Router>
14+
<Route path="/" component={Home} />
15+
<Route default component={NotFound} />
16+
</Router>
17+
</main>
18+
</LocationProvider>
19+
);
20+
}
21+
22+
if (typeof window !== 'undefined') {
23+
hydrate(<App />, document.getElementById('app'));
24+
}
25+
26+
export async function prerender(data) {
27+
return await ssr(<App {...data} />);
28+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { defineConfig } from 'vite';
2+
import preact from '@preact/preset-vite';
3+
4+
// https://vitejs.dev/config/
5+
export default defineConfig({
6+
plugins: [
7+
preact({
8+
prerender: {
9+
enabled: true,
10+
renderTarget: '#app',
11+
additionalPrerenderRoutes: ['/404'],
12+
},
13+
}),
14+
],
15+
});

templates/ssr/pages/index/index.page.jsx renamed to templates/config/prerender/src/index.jsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import preactLogo from '../assets/preact.svg';
1+
import { hydrate, prerender as ssr } from 'preact-iso';
2+
3+
import preactLogo from './assets/preact.svg';
24
import './style.css';
35

4-
export function Page() {
6+
export function App() {
57
return (
68
<div>
79
<a href="https://preactjs.com" target="_blank">
@@ -37,3 +39,11 @@ function Resource(props) {
3739
</a>
3840
);
3941
}
42+
43+
if (typeof window !== 'undefined') {
44+
hydrate(<App />, document.getElementById('app'));
45+
}
46+
47+
export async function prerender(data) {
48+
return await ssr(<App {...data} />);
49+
}
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import { defineConfig } from 'vite';
22
import preact from '@preact/preset-vite';
3-
import ssr from 'vike/plugin';
43

54
// https://vitejs.dev/config/
65
export default defineConfig({
7-
plugins: [preact(), ssr({ prerender: true })],
6+
plugins: [
7+
preact({
8+
prerender: {
9+
enabled: true,
10+
renderTarget: '#app',
11+
},
12+
}),
13+
],
814
});

templates/ssr/_gitignore

Lines changed: 0 additions & 24 deletions
This file was deleted.

templates/ssr/index.html

Lines changed: 0 additions & 13 deletions
This file was deleted.

templates/ssr/jsconfig.json

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)