Vite 入门篇:学会它,一起提升开发幸福感

网站建设3年前发布
67 0 0

2023030615391162659386557b59abe1763310d53b31968540f6965,相信大部分兄弟都体验过 Vite 了,知道它很快。但你知道它为什么快,相比 Webpack 有哪些不同吗?今天咱们就来全面了解一下 Vite ,尤其适合新手兄弟。一起学起来吧!,很多人对构建工具没有什么概念,只知道是用来打包的。那么到底什么是构建工具呢?,大家都知道浏览器只支持 Html、CSS、JavaScript,但一个企业级项目可能会用到各种各样的前端技术,如 Less、Sass、TS、Vue组件、语法降级、体积优化等,这时候我们就需要相应的工具去处理这些内容:,我们可以手动把代码挨个处理一遍,但这样效率非常低,当我们稍微修改一点代码,这个流程又要重新走一遍,非常麻烦。有个神奇的东西,可以把以上工具集成到一起,整个流程交给它自动处理。而且当代码发生变化时,自动帮我们重新走一遍,这个东西就叫做构建工具。当然构建工具做的事情远不止于此,比如:,构建工具减轻了我们的心智负担,让我们不用关心我们写的代码如何在浏览器运行,只需要关心代码怎么写就可以了。市面上主流的构建工具有 Webpack、Vite、esbuild、Rollup、Parcel,以及最近刚出的 turbopack ,但目前最流行的依然是 Webpack 和 Vite 。,当项目体积越来越庞大时,构建工具需要处理的代码量呈指数级增长,包含数千个模块的项目也是相当普遍。类似 Webpack 的构建工具就会遇到性能瓶颈:通常需要很长时间,甚至几分钟项目才能启动起来。热更新(HMR)也可能需几秒,甚至十几秒。不知道大家目前的项目怎么样,反正我们公司稍微大一点的 Vue2 项目是真的慢,等的捉急。这种情况已经很大程度影响到了我们的开发效率和幸福感。,Webpack 有没有办法进行优化呢?很难。Webpack 先递归分析各模块依赖关系-构建依赖图谱,然后进行打包,再启动本地服务器。而且 Webpack 支持多种模块化规范,比如 CommonJS 、ES-Module ,一开始就要统一模块化代码,将所有的依赖全部处理一遍。整个流程如下图:,2023030615391397968f8774018eea77277710053a2381933f95504,即使使用按需加载,也有一系列工作需要做,所以 Webpack 基本没有优化空间。,那么 Vite 为什么能解决这个问题呢?,这个是 Vite 的启动过程:,20230306154531b22ae2f1320b9d399b5966ee2fe17b74c9a733749,这样大家应该看得出来 Vite 为什么快了吧!,上面提到了依赖预构建,可能很多兄弟对这个不太理解,这里我也来讲一下。现代浏览器已经支持 ES-Module ,但导入模块只能用相对路径或绝对路径,直接使用模块名称的方式是行不通的:,依赖预构建就可以很好的解决这个问题。Vite 首先会找到依赖的模块,然后调用 esbuild,将 CommonJS 等其他规范的代码转换成 ES-Module 规范,然后把它放在 node_modules/.vite/deps 目录下,接着再修改相应的引入路径。,由于浏览器是通过 HTTP 来请求模块文件的,一旦模块的依赖关系比较多的话,就会发起很多个网络请求。例如,lodash-es 内置模块超过 600 个,它们之前相互导入。当我们执行以下代码时,浏览器会同时发出 600 多个 HTTP 请求!大量的请求造成网络堵塞,导致页面的加载非常的慢。,这时候还得靠依赖预构建,预构建将 lodash-es 整体转换为一个模块,这样我们就只需要发起一个 HTTP 请求了!,总结一下,依赖预构建为我们解决了以下三个头痛的问题:,学习一项技术,最好的方式是单独使用它。抛开脚手架工具,Vite 使用起来也非常的简单,直接在项目中安装 vite ,给个配置就可以了。当然不给也可以,Vite 会使用内置的默认配置:,为了方便使用,可以在 package.json 添加启动和打包命令。,然后在根目录下新建一个 index.htmlnpm run dev 项目就跑起来了!,在不同模块中定义相同类名,会导致样式被覆盖,这时候就要用到 CSS module 。以 .module.css 结尾的文件都会被认为是一个 CSS modules 文件。导入这样的文件会返回一个相应的对象:,Vite 同时提供了对 .scss.sass.less.styl 和 .stylus 文件的内置支持,仅需安装相应的预处理器就可以了:,感觉这块要比 Webpack 简单的多,Webpack 需要给不同类型的文件配置不同的 loader 去处理,而 Vite 内部直接帮我们配置好了。如果使用的是 Vue 单文件组件,可以通过 <style lang="less"> 自动开启。,PostCSS 也是用来处理 CSS 的,只不过它更像是一个工具箱,可以添加各种各样的插件来处理 CSS 。像我们经常遇到的样式兼容性问题,如高级 CSS 语法的降级、前缀补全等,都可以通过 PostCSS 来解决。,Vite 对 PostCSS 有良好的支持,我们只需安装需要使用的插件就可以了。,postcss-preset-env 是一个预设环境插件,包含高级 CSS 语法的降级、前缀补全等众多功能。接下来我们在 vite.config.js 中配置一下:,然后我们来写一些特别的样式:,打开浏览器,可以看到 CSS 已经帮我们处理好了:,20230306153914d500ef179994c8944237635e2d9abfdb10e020572,整体来说 PostCSS 还是非常实用的,可以帮助我们处理各种各样的 CSS 问题。,我们可以通过添加后缀的方式,修改文件的引入方式。默认的引入方式等同于添加 ?url 后缀。,JSON 文件可以被直接导入。同时也支持具名导入,帮助我们更好地利用 treeshaking :,Vite 为 Vue 提供第一优先级支持,直接使用相应的插件就好了:,Vite 天然支持引入 .ts 文件。Vite 使用 esbuild 将 TypeScript 转译到 JavaScript,约是 tsc 速度的 20~30 倍,同时 HMR 热更新也是非常的快 。,Vite 仅执行 .ts 文件的转译工作,并不执行任何类型检查。换句话来说,即使 IDE 提示报错,也不影响正常开发和生成环境打包。这样肯定是不行的,不然很难对代码进行有效约束。我们可以使用插件来实现这个功能:,然后在根目录创建 tsconfig.json 文件:,这样 TS 的报错信息就会在命令行和页面上显示出来,不修正就无法继续往下开发啦!,202303061539144870e4559b7bab9533b29088f629b224969274714,2023030615453209186586011a76b22e9192c1a6b3fcf9bcbd6c155,如果要在类型检查不通过时阻止生产环境打包,直接在 build 命令中添加一个指令即可:,Vite 和 Webpack 类似,都是使用 dotenv 从特定的文件中加载额外的环境变量:,在客户端中我们使用 import.meta.env 获取环境变量。为了防止意外地将一些环境变量泄漏到客户端,只有以 VITE_ 为前缀的变量才会暴露到客户端,例如使用以下环境变量:,客户端控制台打印结果:,在服务端,也就是 vite.config.js 中,通过 process.env 获取环境变量。但是 vite 考虑到和其他配置的一些冲突问题,Vite 不会将环境变量直接注入到 process.env 对象下。这时候我们可以手动进行处理:,实际开发中,我们可能还会用到测试环境和预发布环境,这时候需要创建两个环境变量文件:.env.test 和 .env.staging 。,然后在 package.json 中添加一下运行指令就可以了。,尽管原生 ES-Module 现在得到了广泛支持,但由于嵌套导入会导致额外的网络往返,在生产环境中发布未打包的 ES-Module 效率仍然非常低(即使使用 HTTP/2)。为了在生产环境中获得最佳的加载性能,更好的利用 tree-shaking、懒加载和 chunk 分割等,Vite 把生产环境构建全权交给了 Rollup 。,我们可以通过 构建配置选项 自定义构建过程,比如,通过 build.rollupOptions 直接调整底层的 Rollup 选项 ,使用 build.assetsInlineLimit 修改图片转 base64 的阈值。,生产环境中,我们不得不考虑一个问题,就是浏览器的兼容性问题。默认情况下,Vite 的目标是支持 原生 ESM script 标签 、支持原生 ESM 动态导入 和 import.meta 的现代浏览器:,但我们可以通过 Vite 自带的 @vitejs/plugin-legacy 插件,来兼容旧版本的浏览器。,生产环境还有很多实用的配置,我就不一一介绍了,大家可以在官网查看。,今天的分享内容比较多,不知道大家吸收的怎么样。其实 Vite 还是有很多东西可以讲的,这次主要是帮助大家对 Vite 有一个整体的了解,后面我会继续分享 Vite 配置篇和性能优化篇。

© 版权声明

相关文章