前端 | 青训营笔记

109 阅读2分钟

这是我参与「第四届青训营」笔记创作活动的的第12天,今天是关于《Vite知识体系》的学习

Vite和webapck的区别

11.png

  • vite和webpack都是现代打包工具

  • webpack会先打包,然后启动开发服务器,请求服务器时直接给予打包结果。

  • vite直接启动开发服务器,请求哪个模块再对该模块进行实时编译。

    1. 生态不及webpack,加载器、插件不够丰富

Vite

image.png

浏览器原生ESM支持

  1. script标签增加Type="module"
  2. 使用ESM模块导入导出语法

优势:

  • 无需打包项目源代码
  • 天然的按需加载
  • 可以利用文件级的浏览器缓存

内置的Web构建能力

vite开箱即用的功能:

  • webapck
  • webpack-dev-server
  • css-loader
  • css-loader
  • less-loader
  • style-loader
  • sass=loader
  • file-loader
  • postcss-loader

...

项目初始化

//安装pnpm
npm i -g pnpm

//初始化命令
pnpm cerate vite

//安装依赖
pnpm install

启动项目
pnpm run dev
  • 启动界面 1.png

  • package.json 2.png

Tree Shaking

优化原理:

  1. 基于ESM的import/export语句依赖关系,与运行时状态无关
  2. 在构建阶段将未使用到的代码进行删除
  3. 默认开启!

例如定义add方法和multi方法

image.png

只使用add方法并 pnpm run build

3.png

就把没用到的multi删除了

Vite整体架构

image.png

依赖预打包

  1. 避免Node-moduless过多的文件请求
  2. 将CommonJS格式转换为ESM格式

实现原理:

  1. 服务启动前扫描代码中用到的依赖
  2. 用Esbuild对依赖代码进行预打包
  3. 改写import语句,指定依赖为预构建产物路径

单文件编译

image.png

代码压缩

image.png

插件机制

image.png

进阶

深入学习双引擎 esbuild与rollup.js

代码分割 拆包

image.png

Babel JS编译工具

出现的原因:

  • 兼容性

image.png

语法安全降级

image.png

如何在构建产物中避免这类问题?

  • 上层解决方案:
    • @vitejs/plugin-legacy
  • 底层原理:
    • 借助Babel进行语法自动降级
    • 提前注入Polyfill实现

image.png

服务端渲染(SSR)

image.png

底层标准出现时间

image.png

Vite的社区生态

image.png