从零读 Vite 4.0 源码(一)———— vite 设计概念

本系列文章试图带给你一些信息:

  • vite 的设计理念
  • vite 核心功能(预构建、HMR)的实现原理
  • 以 vite 为例,说明如何阅读源码

前置说明:

  • 基于 vite 4.4.9 版本阅读

vite 诞生之前

要理解 vite 先进的设计理念,需要先回顾一下打包工具的历史。

首先,先思考一个问题:我们为什么需要使用打包工具呢?

在没有打包工具之前,浏览器不支持模块化,因此在浏览器中运行 javascript, 只能通过引用脚本的方式。但这种方式带来了作用域,文件大小,可读性和可维护性等一系列问题。

随后出现的 IIFE,用来解决项目中的作用域问题。这时诞生了 gulp, grunt 等工具,用来基于 IIFE 拼接所有项目文件。但对 treeshaking 和脚本重用依然很不友好。

再之后,node.js 带来了模块化的理念,commonjs 引入了 require 机制,允许在文件中加载模块。更加优雅的解决了作用域的问题。但浏览器不支持模块,因此诞生了 Browserify 等工具,允许我们编写的 commonjs 模块运行在浏览器上。

但当时尚未存在一款开箱即用的打包工具,可以自动构建并分析依赖,为开发者提供更方便的开发体验。这时 webpack 诞生了,webpack 不仅可以将模块化的代码打包成可在浏览器中运行的文件外,还提供了代码拆分等丰富的功能,以及繁荣的生态系统。

不可否认 webpack 是一款非常优秀的打包工具,也极大的改善了开发体验。但随着项目越来越庞大,构建工具开始遇到性能瓶颈,文件修改后需要数秒才能看到结果,这无疑损伤了开发者的体验。

但还记得我们最一开始的痛点么?正是因为浏览器不支持模块化而带来了这一系列的问题,随之诞生的 gulp, grunt, commonjs, webpack 也是为了给开发者提供模块化的开发体验。

现代浏览器已逐步支持原生 ES 模块,也就是说,我们或许不再需要构建整个应用,将我们的源码串联成可以在浏览器中运行的文件。而是直接让我们的模块化代码运行在浏览器中!

vite 正是基于这一理念的新打包工具。由于不需要构建整个应用,因此它提供了非常快速的开发体验。

你的 vite

既然我们现在知道 vite 是基于浏览器支持原生 ES 模块这一理念设计的,那不妨想一想,如果是你,会如何设计呢?

首先,可以利用浏览器原生 ES 模块的特性,我们不再需要将文件打包,浏览器原生的 ES 模块会自动请求源码脚本,并将脚本运行在浏览器上。

由于源码本身并非是 javascript 文件,如 JSX, vue等,所以你的 vite 需要针对被请求的源码进行转换。

其次,当文件发生改变时,我们需要 vite 能监听到变化并进行增量编译,所以你的 vite 需要在本地启动一个 server,并能够监听文件变化并处理。

最后,考虑下性能,我们希望每次编译后的源码若无变化,则使用缓存。这一点浏览器就可以为我们做,源码会根据请求头中的 if-not-match 进行协商缓存,从而避免重复处理一份未变化的源码。所以你的 vite 只需要关注下请求头的设置即可。

在接下来的章节里,会详细说明具体的实现。

To be continue...

相关推荐
猫爪笔记几秒前
前端:HTML (学习笔记)【2】
前端·笔记·学习·html
brief of gali12 分钟前
记录一个奇怪的前端布局现象
前端
Json_181790144801 小时前
电商拍立淘按图搜索API接口系列,文档说明参考
前端·数据库
风尚云网2 小时前
风尚云网前端学习:一个简易前端新手友好的HTML5页面布局与样式设计
前端·css·学习·html·html5·风尚云网
木子02042 小时前
前端VUE项目启动方式
前端·javascript·vue.js
GISer_Jing2 小时前
React核心功能详解(一)
前端·react.js·前端框架
捂月2 小时前
Spring Boot 深度解析:快速构建高效、现代化的 Web 应用程序
前端·spring boot·后端
深度混淆2 小时前
实用功能,觊觎(Edge)浏览器的内置截(长)图功能
前端·edge
Smartdaili China2 小时前
如何在 Microsoft Edge 中设置代理: 快速而简单的方法
前端·爬虫·安全·microsoft·edge·社交·动态住宅代理
秦老师Q2 小时前
「Chromeg谷歌浏览器/Edge浏览器」篡改猴Tempermongkey插件的安装与使用
前端·chrome·edge