Skip to content

Commit 348146f

Browse files
authored
feat(create-vite): add react-swc templates (#11280)
1 parent 2a558ef commit 348146f

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

docs/guide/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ yarn create vite my-vue-app --template vue
7777
pnpm create vite my-vue-app --template vue
7878
```
7979

80-
See [create-vite](https://github.com/vitejs/vite/tree/main/packages/create-vite) for more details on each supported template: `vanilla`, `vanilla-ts`, `vue`, `vue-ts`, `react`, `react-ts`, `preact`, `preact-ts`, `lit`, `lit-ts`, `svelte`, `svelte-ts`.
80+
See [create-vite](https://github.com/vitejs/vite/tree/main/packages/create-vite) for more details on each supported template: `vanilla`, `vanilla-ts`, `vue`, `vue-ts`, `react`, `react-ts`, `react-swc`, `react-swc-ts`, `preact`, `preact-ts`, `lit`, `lit-ts`, `svelte`, `svelte-ts`.
8181

8282
## Community Templates
8383

packages/create-vite/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ Currently supported template presets include:
4949
- `vue-ts`
5050
- `react`
5151
- `react-ts`
52+
- `react-swc`
53+
- `react-swc-ts`
5254
- `preact`
5355
- `preact-ts`
5456
- `lit`

packages/create-vite/src/index.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,16 @@ const FRAMEWORKS: Framework[] = [
100100
display: 'TypeScript',
101101
color: blue,
102102
},
103+
{
104+
name: 'react-swc',
105+
display: 'JavaScript + SWC',
106+
color: yellow,
107+
},
108+
{
109+
name: 'react-ts-swc',
110+
display: 'TypeScript + SWC',
111+
color: blue,
112+
},
103113
],
104114
},
105115
{
@@ -292,7 +302,12 @@ async function init() {
292302
}
293303

294304
// determine template
295-
const template: string = variant || framework?.name || argTemplate
305+
let template: string = variant || framework?.name || argTemplate
306+
let isReactSwc = false
307+
if (template.endsWith('-swc')) {
308+
isReactSwc = true
309+
template = template.slice(0, -4)
310+
}
296311

297312
const pkgInfo = pkgFromUserAgent(process.env.npm_config_user_agent)
298313
const pkgManager = pkgInfo ? pkgInfo.name : 'npm'
@@ -357,6 +372,10 @@ async function init() {
357372

358373
write('package.json', JSON.stringify(pkg, null, 2))
359374

375+
if (isReactSwc) {
376+
setupReactSwc(root, template.endsWith('-ts'))
377+
}
378+
360379
console.log(`\nDone. Now run:\n`)
361380
if (root !== cwd) {
362381
console.log(` cd ${path.relative(cwd, root)}`)
@@ -438,6 +457,26 @@ function pkgFromUserAgent(userAgent: string | undefined) {
438457
}
439458
}
440459

460+
function setupReactSwc(root: string, isTs: boolean) {
461+
editFile(path.resolve(root, 'package.json'), (content) => {
462+
return content.replace(
463+
/"@vitejs\/plugin-react": ".+?"/,
464+
`"@vitejs/plugin-react-swc": "^3.0.0"`,
465+
)
466+
})
467+
editFile(
468+
path.resolve(root, `vite.config.${isTs ? 'ts' : 'js'}`),
469+
(content) => {
470+
return content.replace('@vitejs/plugin-react', '@vitejs/plugin-react-swc')
471+
},
472+
)
473+
}
474+
475+
function editFile(file: string, callback: (content: string) => string) {
476+
const content = fs.readFileSync(file, 'utf-8')
477+
fs.writeFileSync(file, callback(content), 'utf-8')
478+
}
479+
441480
init().catch((e) => {
442481
console.error(e)
443482
})

0 commit comments

Comments
 (0)