02 Vite 命令 vite dev 执行了什么

234 阅读3分钟

前言

上一篇文章中我们初步认识了一下Vite

在这一篇中我们将详细介绍vite dev命令背后的运行原理

我们不采用脚手架创建的项目来辅助演示,依旧使用手动创建的项目作为我们本次旅行的基建

目录结构介绍

  1. 上一篇中我们手动创建了一个Vite初体验的项目如下所示
  2. index.html是vite默认的入口文件
  3. main.js是我们创建的一个js文件用于演示

Vite dev的工作原理

本地打开入口文件

  1. 浏览器是可以直接识别html,css,js文件的,所以我们右键index.html文件在浏览器中打开,也可以访问入口文件
  2. 这种方式浏览器是通过file协议获取的本地文件,而我们在index.html中加载了main.js作为脚本,会发现浏览器提升跨域,这是由浏览器的同源策略导致的

vite dev启动项目

  1. 在命令行中执行yarn vite dev 后,vite会在我们本地启动一个开发服务器,设置访问端口为5173,同时将我们当前的项目目录作为服务器的访问目录,index.html文件作为入口文件,因此我们在浏览器中访问localhost:5173可以访问到index.html
  2. 这种方式浏览器是通过http协议获取的服务器的文件,同时浏览器并没有报错,这就是vite为我们做的第一件事,为所有的浏览器请求在响应头中加上允许跨域配置项。

vite处理模块化

  1. 现在我们来编写一个模块化的文件,首先安装loadsh,yarn add lodash
  2. 现在在main.js中导入lodash,如下
  3. 页面自动热更新,并有如下结果,我们可以看出main.js中的内容和我们实际编写的是不一样的,如下
  4. 导入语句被替换成了 import __vite__cjsImport0_lodash from "/node_modules/.vite/deps/lodash.js?v=5ca39abe";
  5. 默认情况下在导入第三方模块时,是从当前目录开始往外查找node_modules目录,直到找到对应的目录名为止。
  6. 但是我们发现,上述的路径中是在node_modules下的.vite/deps中查找目录名,这是vite为我们做的第二件事,对导入的非绝对路径和非相对路径的模块进行依赖预构建。
    1. 依赖预构建首先会调用esbuild将这些模块统一为esmodule规范。
    2. 将这些转换后的模块放到node_modules/.vite/deps中方便访问和后续路径处理时的重写
    3. 分析并重写这些模块内导入的其他模块,将其导入语句导入的模块,直接继承在当前文件中,防止多个导入导致的多个网络请求问题

总结

基于我们当前项目分析

  1. vite dev 帮我们搭建了服务器模拟真实项目的访问方式,解决了跨域问题
  2. 对我们的文件进行了读写,并返回给浏览器
  3. 统一第三方模块化规范,重写模块内容,优化网络性能