背景 最近,就 前端开发过程中的痛点及可优化项 做了一次收集。 其中,构建耗时、项目编译速度慢 的字眼出现了好几次。 随着业务的快速发展,我们很多项目的体积也快速膨胀。 随之而来的, …

一、背景
最近,就前端开发过程中的痛点及可优化项
做了一次收集。 其中,构建耗时、项目编译速度慢
的字眼出现了好几次。
随着业务的快速发展,我们很多项目的体积也快速膨胀。 随之而来的, 就是打包变慢等问题。
提升研发效率
,是技术人永恒的追求。
我们项目也有启动慢的问题,同事也提到过几次。 刚好我之前也做过类似的探索和优化, 于是就借这个机会,改造一下项目,解决启动耗时的问题
。
1 | 于昨天下午(2021.4.7 23:00), 成功嵌入 Vite, 项目启动时间由约 `190s => 20s` , 热更新时间缩短为 |
2s
。
中间踩了一些坑, 好在最后爬出来了, 相关技术要点都会在下文中呈现。
今天的主要内容:
为什么 Vite 启动这么快我的项目如何植入 Vite我在改造过程中遇到的问题关于 Vite 开发、打包上线的一些思考相关代码和结论
二、正文
2.1 为什么 Vite 启动这么快
底层实现上, Vite 是基于 esbuild 预构建依赖的。
esbuild 使用 go 编写,并且比以 js 编写的打包器预构建依赖, 快 10 - 100 倍。
因为 js 跟 go 相比实在是太慢了,js 的一般操作都是毫秒计,go 则是纳秒。
另外, 两者的启动方式
也有所差异。
webpack 启动方式
Vite 启动方式
Webpack 会先打包
,然后启动开发服务器,请求服务器时直接给予打包结果。
而 Vite 是直接启动
开发服务器,请求哪个模块再对该模块进行实时编译
。
由于现代浏览器本身就支持 ES Module,会自动向依赖的 Module 发出请求。
Vite 充分利用了这一点,将开发环境下的模块文件,就作为浏览器要执行的文件,而不是像 W ebpack 那样进行打包合并
。
由于 Vite 在启动的时候不需要打包
,也就意味着不需要分析模块的依赖
、不需要编译
。因此启动速度非常快。当浏览器请求某个模块时,再根据需要对模块内容进行编译。
这种按需动态编译的方式,极大的缩减了编译时间,项目越复杂、模块越多,vite 的优势越明显。
在 HMR(热更新)方面,当改动了一个模块后,仅需让浏览器重新请求该模块即可,不像webpack那样需要把该模块的相关依赖模块全部编译一次,效率更高。
从实际的开发体验来看, 在 Vite 模式下, 开发环境可以瞬间启动, 但是等到页面出来, 要等一段时间。
2.2 我的项目如何植入 Vite
新项目
创建一个 Vite 新项目就比较简单:
yarn create @vitejs/app
生成好之后, 直接启动就可以了:
已有项目
已有项目的迁移, 稍微繁琐一些。
首先, 加入 Vite 的相关配置。 这里我使用了一个 cli 工具:wp2vite
.
安装好之后, 直接执行:
这一步, 会自动生成 Vite 的配置文件,并引入相关的依赖。
把依赖安装一下, 启动就可以了。
如果没有意外的话, 你会收获一堆报错
。
恭喜你,进入开心愉快的踩坑环节。
2.3 我在改造过程中遇到的问题
1. alias 错误
项目代码里配置了一些别名,vite 无法识别,所以需要在vite 里面也配置 alias:
1 | resolve: { |
2. 无法识别 less 全局变量
解决办法:
把自定义的全局变量从外部注入即可, 直接在vite.config.js
的 css 选项中加入:
1 | css: { |
...themeVariables,
},
1 | javascriptEnabled: true, |
},
1 |
|
1 |
|
1 | const ErrorIcon = (props: any) => <Icon component={ErrorSvg} />; |
1 | // ... |
1 |
|
很明显的看到, 这里是把文件路径
作为组件了。
现在要做的是:把这个文件路径, 换成可以识别的组件。
搜索一番, 找到了个插件:vite-plugin-react-svg
加入配置:
1 | const reactSvgPlugin = require('vite-plugin-react-svg'); |
1 | plugins: [ |
],
1 | import MyIcon from './svgs/my-icon.svg?component'; |
作为后缀。
看了一下源码, 这个后缀是用来作为标识符的,
如果后缀匹配上是
component, 就解析文件, 并缓存, 最后返回结果:
知道原理之后, 就需要把全部的
.svg=>
.svg?component。
vscode 一键替换就可以, 不过注意别把 node_module 里面的也替换了。
6. global 未定义
global
是 Node里面的变, 会在客户端报错 ?
一层层看下去, 原来是引入的第三方包使用了global。
看 vite 文档里提到了 Client Types:
追加到tsconfig
里面:
1 | "compilerOptions": { |
}
1 |
|
三、最后
使用 Vite 能大幅缩短项目构建时间,提升开发效率。
不过也要结合项目的实际情况,合理取舍。
对于我的这个项目而言,把 Vite 作为辅助开发的一种方式,还是挺有用的。
期待 Vite 能继续完善,为研发提效。
好了, 内容大概就这么多, 希望对大家有所帮助。
才疏学浅,如有错误, 欢迎指正。
谢谢。
最后,如果觉得内容有帮助, 可以
本文标题: 项目实战WebpacktoVite为
发布时间: 2019年03月04日 00:00
最后更新: 2025年12月30日 08:54
原始链接: https://haoxiang.eu.org/d44b5310/
版权声明: 本文著作权归作者所有,均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

