vite是什么?
与Vue CLI类似, Vite也是一个提供基本项目脚手架和开发服务器的构建工具。
然而,Vite并不是基于Webpack的,它有自己的开发服务器,利用浏览器中的原生ES模块。这种架构使得Vite比Webpack的开发服务器快了好几个数量级。Vite采用Rollup进行构建,速度也更快。
Vite目前还处于测试阶段,看来Vite项目的目的并不是像Vue CLI那样的一体化工具,而是专注于提供一个快速的开发服务器和基本的构建工具。
它的两主要组成部分 :
Vue/cli:
Vite:
启动项目时,则是启动一个koa服务器,服务器拦截浏览器的es module的请求,服务器直接将 ESM 模块内容处理后,通过 path 找到目录下对应的文件做一定的处理最终以 ES Modules 格式返回给客户端。接着,现代浏览器通过解析 script module,对每一个 import 到的模块进行 HTTP 请求,服务器继续对这些 HTTP 请求进行处理并响应。(热更新)
图中的目标项目即我们开发时的项目,vite服务在解析模块路径以及读取文件内容时需要访问目标项目中的模块内容或者配置文件等。
从其他请求中我们也可以看出每一个.vue文件都被拆分成了多个请求,并通过type来标识是template还是style。
在项目根目录创建bin目录,并在bin目录下创建一个 www.js 文件,文件内容如下:
在创建 www.js 文件中引入了index.js文件,主要是使用了koa启动了一个简单服务以及实现vite的功能
serverPluginServeStatic.js文件 :使用koa-static中间件来托管静态资源,同时我们需要拿到koa实例(app),其次需要获取到目标项目的根目录路径(root),将目标项目进行整体托管,同时对于目标项目的 public目录也进行托管,这样,我们需要处理的静态文件基本完成了。
为什么要重写模块路径呢?
这是因为我们在使用import方式导入模块的时候,浏览器只能识别./、../、/这种开头的路径,对于直接使用模块名比如:import vue from 'vue',浏览器就会报错,因为它无法识别这种路径,这就是我们需要进行处理的地方了。
serverPluginModuleRewrite.js文件:
在处理完所有的模块路径之后,我们就需要在服务端来解析模块真实位置。
当 Vite 遇到一个 .vue 后缀的文件时。由于 .vue 模板文件的特殊性,它被拆分成 template , css ,script 模块三个模块进行分别处理。最后会对 script ,template, css 发送多个请求获取。
评价:Vite 是 vue 的作者尤雨溪在开发 vue3.0 的时候开发的一个 基于原生ES-Module的前端构建工具。其本人在后来对 vue3 的宣传中对自己的新作品 Vite 赞不绝口,并表示自己 ”再也回不去 webpack 了“ 。
webpack缺点是缓慢的服务器启动
当冷启动开发服务器时,基于打包器的方式是在提供服务前去急切地抓取和构建你的整个应用。
vite改进
Vite 通过在一开始将应用中的模块区分为依赖和源码两类,改进了开发服务器启动时间。
依赖大多为纯JavaScript并在开发时不会变动。一些较大的依赖(例如有上百个模块的组件库)处理的代价也很高。依赖也通常会以某些方式(例如 ESM 或者 CommonJS)被拆分到大量小模块中。
Vite 将会使用 esbuild 预构建依赖。Esbuild 使用 Go 编写,并且比以 JavaScript 编写的打包器预构建依赖快10-100倍。
源码通常包含一些并非直接是 JavaScript 的文件,需要转换(例如 JSX,CSS 或者 Vue/Svelte 组件),时常会被编辑。同时,并不是所有的源码都需要同时被加载。(例如基于路由拆分的代码模块)。
Vite以原生ESM方式服务源码。这实际上是让浏览器接管了打包程序的部分工作:Vite 只需要在浏览器请求源码时进行转换并按需提供源码。根据情景动态导入的代码,即只在当前屏幕上实际使用时才会被处理。
webpack: 分析依赖=>编译打包=>交给本地服务器进行渲染。首先分析各个模块之间的依赖,然后进行打包,在启动webpack-dev-server,请求服务器时,直接显示打包结果。
webpack打包之后存在的问题:随着模块的增多,会造成打出的 bundle 体积过大,进而会造成热更新速度明显拖慢。
vite: 启动服务器=>请求模块时按需动态编译显示。是先启动开发服务器,请求某个模块时再对该模块进行实时编译,因为现代游览器本身支持ES-Module,所以会自动向依赖的Module发出请求。
所以vite就将开发环境下的模块文件作为浏览器的执行文件,而不是像webpack进行打包后交给本地服务器。
分析了webpack和vite的打包方式后,也就明白了为什么vite比webpack打包快,因为它在启动的时候不需要打包,所以不用分析模块与模块之间的依赖关系,不用进行编译。这种方式就类似于我们在使用某个UI框架的时候,可以对其进行按需加载。
热更新方面,效率更高。当改动了某个模块的时候,也只用让浏览器重新请求该模块,不需要像webpack那样将模块以及模块依赖的模块全部编译一次。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)