From 348146f3e39232900eeb347d0922b97b5886bafa Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Fri, 9 Dec 2022 20:42:51 +0800 Subject: [PATCH] feat(create-vite): add react-swc templates (#11280) --- docs/guide/index.md | 2 +- packages/create-vite/README.md | 2 ++ packages/create-vite/src/index.ts | 41 ++++++++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/docs/guide/index.md b/docs/guide/index.md index c313dbaebfa29c..7da7cf6afc5303 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -77,7 +77,7 @@ yarn create vite my-vue-app --template vue pnpm create vite my-vue-app --template vue ``` -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`. +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`. ## Community Templates diff --git a/packages/create-vite/README.md b/packages/create-vite/README.md index 015fd257461ed5..8df8f4e338f8cc 100644 --- a/packages/create-vite/README.md +++ b/packages/create-vite/README.md @@ -49,6 +49,8 @@ Currently supported template presets include: - `vue-ts` - `react` - `react-ts` +- `react-swc` +- `react-swc-ts` - `preact` - `preact-ts` - `lit` diff --git a/packages/create-vite/src/index.ts b/packages/create-vite/src/index.ts index f6bae6ebe82407..0deafb2b080bab 100755 --- a/packages/create-vite/src/index.ts +++ b/packages/create-vite/src/index.ts @@ -100,6 +100,16 @@ const FRAMEWORKS: Framework[] = [ display: 'TypeScript', color: blue, }, + { + name: 'react-swc', + display: 'JavaScript + SWC', + color: yellow, + }, + { + name: 'react-ts-swc', + display: 'TypeScript + SWC', + color: blue, + }, ], }, { @@ -292,7 +302,12 @@ async function init() { } // determine template - const template: string = variant || framework?.name || argTemplate + let template: string = variant || framework?.name || argTemplate + let isReactSwc = false + if (template.endsWith('-swc')) { + isReactSwc = true + template = template.slice(0, -4) + } const pkgInfo = pkgFromUserAgent(process.env.npm_config_user_agent) const pkgManager = pkgInfo ? pkgInfo.name : 'npm' @@ -357,6 +372,10 @@ async function init() { write('package.json', JSON.stringify(pkg, null, 2)) + if (isReactSwc) { + setupReactSwc(root, template.endsWith('-ts')) + } + console.log(`\nDone. Now run:\n`) if (root !== cwd) { console.log(` cd ${path.relative(cwd, root)}`) @@ -438,6 +457,26 @@ function pkgFromUserAgent(userAgent: string | undefined) { } } +function setupReactSwc(root: string, isTs: boolean) { + editFile(path.resolve(root, 'package.json'), (content) => { + return content.replace( + /"@vitejs\/plugin-react": ".+?"/, + `"@vitejs/plugin-react-swc": "^3.0.0"`, + ) + }) + editFile( + path.resolve(root, `vite.config.${isTs ? 'ts' : 'js'}`), + (content) => { + return content.replace('@vitejs/plugin-react', '@vitejs/plugin-react-swc') + }, + ) +} + +function editFile(file: string, callback: (content: string) => string) { + const content = fs.readFileSync(file, 'utf-8') + fs.writeFileSync(file, callback(content), 'utf-8') +} + init().catch((e) => { console.error(e) })