"不想自己写脚手架的前端不是好前端",这句话我一直记在心里回响。每次开启一个新项目,我总觉得缺了点什么。在做了大量的调研和思考之后,我决定,是时候动手打造一个属于自己的前端脚手架了。
我个人感觉目前主要面临两个痛点:
-
市面上的脚手架太多了,记不住! 说实话,
create-react-app、create-vite、create-next-app... 每次用都要先去搜索文档,找到那个准确的命令。我常常想,能不能有一个统一的入口,让我不再为记这些名字而烦恼? -
脚手架不够灵活,不能自由组合。 官方的脚手架通常只提供最基础的模板。如果我想加入
React Router、Zustand,或者配置好ESLint和Prettier,就得在项目创建后手动安装、配置一大堆东西。这个过程繁琐、重复,且容易出错。
那么,我能不能写一个既能汇总主流脚手架,又能让我在创建时就自由组合所需配置的工具呢?这不仅能解决我的痛点,也是一个绝佳的学习机会。
于是,我开始疯狂撸代码,create-web-app 的雏形就此诞生


支持多引擎选择
为了解决"记不住命令"的问题,我首先做了一个"引擎选择"功能。我汇总了目前社区最主流的十几种脚手架,包括:
- Vite (React, Vue, Svelte...)
- Umi
- Create React App
- Next.js
- Nuxt
- Astro
- SvelteKit
- Angular
- Remix
- ...等等
现在,你只需要记住一个命令 pnpm create-web-app,就能启动任何一个主流框架的创建流程。它就像一个超级启动器,将所有官方 CLI 的能力都聚合在了一起
自由组合配置
除了代理外部工具,我做了一套create-web-app的自己的创建模版,可以在创建项目时,就完成所有基础配置的自由组合。
框架、语言、状态管理、路由、规范... 一步到位!
在create-web-app模式下,可以通过交互式的问答,一步步进行:
- 选择框架:React 还是 Vue?
- 选择语言:JavaScript 还是 TypeScript?
- 选择插件 :
- 路由 :需要
React Router或Vue Router吗? - 状态管理 :
Redux、Zustand还是Pinia? - 代码规范 :
ESLint、Prettier、Husky要不要安排上?
- 路由 :需要
当你确认完所有选项后,一个已经配置齐全、装好依赖、甚至连入口文件都帮你改好 的项目就诞生了!你不再需要手动 pnpm install 一堆包,再小心翼翼地去 main.js 里 app.use(router)。
实现
这种灵活性背后,是一套精心设计的声明式插件系统 和基于 AST 的代码注入机制。
-
插件注册中心 (
plugin-registry.js):我把每一个可选功能(如 Zustand、ESLint)都抽象成一个插件。每个插件清晰地定义了它需要:- 哪些
npm依赖 (pkg) - 哪些配置文件 (
files) - 需要对哪个文件的代码做什么修改 (
transforms)
- 哪些
-
AST 代码变换器 (
transforms/) :当你说需要React Router时,脚手架不会用粗暴的字符串替换来修改你的入口文件。它会把main.jsx解析成一个抽象语法树(AST),精准地找到<App />,然后用<RouterProvider />将其包裹,最后再把 AST 安全地转换回代码
总结
从一个想法,到一个可用的工具,create-web-app 解决了我作为前端开发者最真实的痛点。它通过"双引擎"模式,既拥抱了社区的强大生态,又通过"自研插件"模式提供了极致的灵活性和效率
当然,它目前还只是一个初版,未来还有很多可以做的事情:
-
支持 CLI 直传参数 :实现
pnpm create-web-app my-app --framework react --plugins router,zustand,跳过交互,一键生成。 -
扩充插件生态:加入更多测试框架、组件库、国际化等插件。
-
企业级规范注入:一键集成团队的 CI/CD 配置、Git Hooks 规范等。
-
目前仅仅支持pnpm包管理工具
-
目前仅仅支持vite打包
-
等等