用vite设计一个前端脚手架和模板生成器

一、背景

项目基于 webpack 构建产物,构建速度较慢。

开发、构建的耗时过长,影响前端幸福感。

二、脚手架-产物打包流程

  1. 初始化过程:将内置的命令(serve、build等注册在service上)
  2. 执行过程:根据用户调用的命令(例如npm run serve),读取用户的配置文件、项目内置的配置、环境变量文件等,合并并校验配置对象后将其传入内置的命令中(比如serve),然后调用bundler(打包器)
  1. bundle打包过程:这一过程复杂,可以看我另一篇文章作为前导。项目有个入口文件(index.tsx),然后index.tsx会引入别的文件,通过递归遍历,能形成一个依赖树。经过tree-shaking将没有用到的依赖节点去掉。对于树上的每个节点,我们需要将其转换成合适的形式才能处理(比如tsx需要转换成js,scss=>css等)。经过转换后,将整个树的所有节点整合到一个bundle.js文件中,然后混淆、压缩、代码分割等操作后,输出到output中。

整体流程如下

而这一整个流程中,有很多节点能做优化,前端各大流行脚手架都会在其中的节点大展身手

三、现有的前端脚手架

以下构建器默认都有并行构建、缓存构建结果的功能

1. rollup

纯粹的 ESM 构建器,

优化点:esm 规范的代码有着颗粒度更细的依赖范围,这对于 tree-shaking 的成效有很大的提升

优势

  • 打包体积小
  • 配置简单

缺点

  • 没有 hmr,所以作为开发构建器用途不大
  • 对非 js 文件支持无

用途:适合打包库

2. webpack

前端项目构建器

优势

  • 生态成熟,插件众多
  • 多数资源(js、css、静态资源等)能以模块解析
  • 配置丰富
  • 支持 hmr,适合做开发构建器
  • 支持 tree-shaking
  • 支持 commonjs、amd、esm 等多种规范
  • 支持代码分割,chunk

缺点

  • 资源需要进行模块化处理,耗时
  • 配置复杂
  • 使用 nodejs 构建,对于大型项目构建耗时长

用途:前端构建工具

3. esbuild

新的纯粹的 esm 构建器

优化点:文件的打包、优化过程利用 go 及其并行的优势来执行

优势

  • go 作为底层代码,构建速度提升非常大
  • 支持 esm 规范

缺点

  • 生态很新

用途:需要频繁构建的地方

4. vite

esbuild 作为开发构建器、rollup 作为打包构建器的前端构建器

优化点:将文件转换后交给浏览器执行,省去了打包、优化过程。

优势

  • 配置简单,开发体验非常好
  • go 预构建依赖,源码转换成 esm 后交给浏览器编译
  • 通过浏览器发起 http 请求 esm,可以配合浏览器缓存做优化
  • go 压缩代码,非常快

缺点

  • 浏览器会同时发起多个请求,即便是用了 http2,也有点吃不消
  • 目前依旧使用 rollup 作为打包构建器

用途:前端构建器

5. turbopack

基于用用最快的速度构建最少的产物

优化点:通过路由是否开启开发者工具缓存函数的返回结果等来减少构建的产物量,通过 rust 的并行来提升构建速度

优势

  • 配置简单,开发体验非常好
  • rust + turbo engine 的方式做了非常多的优化

缺点

  • 对于生产环境,目前还没有根源性的优化,不过官网说 soon
  • 理念强大,可行性非常高

四、脚手架实现方案

模板工具

  1. 制作固定模板:react17/18 + antd5
  2. 命令行提供框架、ui、包管理器选择
  3. 根据用户的选择命中对应的模板

脚手架

  1. 注册内置命令
  2. 获取默认配置、用户配置、环境变量
  3. 合并并校验配置
  4. 执行命令
  5. 调用vite起server服务,或者构建产物

vite 原理

ps

看到这里的看官,麻烦点个赞赞吧

相关推荐
悟能不能悟11 小时前
前端上载文件时,上载多个文件,但是一个一个调用接口,怎么实现
前端
可问春风_ren11 小时前
前端文件上传详细解析
前端·ecmascript·reactjs·js
羊小猪~~12 小时前
【QT】--文件操作
前端·数据库·c++·后端·qt·qt6.3
晚风资源组13 小时前
CSS文字和图片在容器内垂直居中的简单方法
前端·css·css3
Miketutu13 小时前
Flutter学习 - 组件通信与网络请求Dio
开发语言·前端·javascript
光影少年15 小时前
前端如何调用gpu渲染,提升gpu渲染
前端·aigc·web·ai编程
Surplusx16 小时前
运用VS Code前端开发工具完成网页头部导航栏
前端·html
小宇的天下16 小时前
Calibre 3Dstack --每日一个命令day13【enclosure】(3-13)
服务器·前端·数据库
一只小bit17 小时前
Qt 文件:QFile 文件读写与管理教程
前端·c++·qt·gui
午安~婉17 小时前
整理知识点
前端·javascript·vue