vite2.0原理简析

本文仅作阅读笔记,建议阅读原文。
地址:浅谈 Vite 2.0 原理,依赖预编译,插件机制是如何兼容 Rollup 的?

vite原理

  • 速度快的原因

    1. 利用了 ES Module加载模块支持,所有依赖模块不是一股脑的编译,而是代码按需进行实时加载。

      (img-7qiMggfJ-1629388833231)(G:\noteBook\blog阅读\工程化\1.vite2.0原理.assets\image-20210818224544900.png)]

      传统的 bundle 模式是这样的:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sIdnulfH-1629388833237)(G:\noteBook\blog阅读\工程化\1.vite2.0原理.assets\image-20210818224819635.png)]

    2. 依赖预加载

      如果我们不进行预先加载的话,在访问的时候模块依赖按需加载时可能会突然出现几百上千的请求,这样反而会影响网页加载的速度。

      如:引入 lodashdeboundce,又会发现内部有 2 个 import,再这样延伸下去,这个函数内部竟然带来了 600 次请求,耗时会在 1s 左右。

      在这里插入图片描述

      所以需要预先处理依赖模块。

      尤老师想了个折中的办法,正好利用 Esbuild 接近无敌的构建速度,让你在没有感知的情况下在启动的时候预先帮你把 debounce 所用到的所有内部模块全部打包成一个传统的 js bundle

      Esbuild 使用 Go 编写,并且比以 JavaScript 编写的打包器预构建依赖快 10-100 倍。
      在这里插入图片描述

      启动过程

      启动服务器会通过数据劫持的方式,把我们的预加载处理函数植入进去。

      // server/index.ts
      const listen = httpServer.listen.bind(httpServer)
      httpServer.listen = (async (port: number, ...args: any[]) => {·
        try {
          await container.buildStart({})
          // 这里会进行依赖的预构建
          await runOptimize()
        } catch (e) {
          httpServer.emit('error', e)
          return
        }
        return listen(port, ...args)
      }) as any
      
      

      这个过程主要进行了两步:

      1. 依赖收集:生成一个对应的依赖MAP

        {
          "lodash-es": "node_modules/lodash-es"
        }
        
        

        这个过程会把一些多个模块引入打包成一个bounder,还有把CommonJS模块转化成ES Module

插件机制

简单的介绍一下 Rollup 插件,其实插件这个东西,就是 Rollup 对外提供一些时机的钩子,还有一些工具方法,让用户去写一些配置代码,以此介入 Rollup 运行的各个时机之中。

只要确保 Rollup 插件只使用了这些共有的钩子,就很容易做到插件的通用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值