vite源码 - 开始

要学习 vite 源码,一开始需要看 vite 包的 package.json 文件。

package.json 文件中,会配置 bin 字段,该字段用来配置可执行命令。也是 vite 的入口文件。

package.json 复制代码
{
  "bin": {
    "vite": "bin/vite.js"
  },
}

bin/vite.js

这个文件是一个壳文件,主要做了以下几件事:

  1. 初始化调试和错误处理逻辑
  2. 处理命令行参数
  3. 处理编译缓存
  4. 加载真正的 cli 逻辑

这里的逻辑相对简单,最重要的就是加载真正的 cli 逻辑。

js 复制代码
function start() {
  try {
    // 开启编译缓存
    module.enableCompileCache?.()
    // 定时清除编译缓存
    setTimeout(() => {
      try {
        module.flushCompileCache?.()
      } catch {}
    }, 10 * 1000).unref()
  } catch {}
  // 加载真正的 cli 逻辑
  return import('../dist/node/cli.js')
}

cli

cli 文件的作用一句话就可以说清,那就是使用 cac 定义 cli 命令,并启动。这里的 cac 包是一个命令行框架。

伪代码 复制代码
// 初始化
const cli = cac('vite')
// 定义命令
cli
  .command(....)
// 启动
cli.parse()

定义的命令有以下几个:

  1. dev
  2. build
  3. optimize
  4. preview

这里重点看开发环境的命令。

dev 命令

csharp 复制代码
cli
  .command('[root]', 'start dev server') // 配置默认命令
  .alias('serve') // 配置别名 serve
  .alias('dev') // 配置别名 dev
  // 删除命令配置相关
  .action(async (root: string, options: ServerOptions & GlobalCLIOptions) => {
    filterDuplicateOptions(options)
    const { createServer } = await import('./server')
    try {
      const server = await createServer({
        root,
        base: options.base,
        mode: options.mode,
        configFile: options.config,
        configLoader: options.configLoader,
        logLevel: options.logLevel,
        clearScreen: options.clearScreen,
        server: cleanGlobalCLIOptions(options),
        forceOptimizeDeps: options.force,
      })

      await server.listen()
      server.printUrls()
      // 快捷键相关逻辑
      // ...
    } catch (e) {
      // 错误处理逻辑
    }
  })

可以看到,整个命令的核心代码非常简单,就是引入 createServer 函数,创建一个 server,并启动。

结束

以上的内容已经在 vite 源码中找到一个入口了,知道在调用 vite 时会发生什么,但是也有很多问题。比如:

  • 如何创建 server 的?
  • 配置文件怎么生效的?
  • 插件怎么执行的?
  • 如何处理静态资源文件?
  • 在请求时发生了什么?

等等问题,还需要进一步学习。

相关推荐
Highcharts.js1 小时前
Highcharts 云端渲染的真相:交互式图表与服务器端生成的边界
前端·信息可视化·服务器渲染·highcharts·图表渲染
zhuyan1082 小时前
Linux 系统磁盘爆满导致无法启动修复指南
前端·chrome
编程牛马姐2 小时前
独立站SEO流量增长:提高Google排名的优化方法
前端·javascript·网络
NotFound4862 小时前
实战指南如何实现Java Web 拦截机制:Filter 与 Interceptor 深度分享
java·开发语言·前端
Dontla3 小时前
高基数(High Cardinality)问题介绍(Prometheus、高基数字段、低基数字段)
前端·数据库·prometheus
whuhewei5 小时前
为什么客户端不存在跨域问题
前端·安全
妮妮喔妮5 小时前
supabase的webhook报错
开发语言·前端·javascript
qq_12084093716 小时前
Three.js 大场景分块加载实战:从全量渲染到可视集调度
开发语言·javascript·数码相机
yivifu6 小时前
手搓HTML双行夹批效果
前端·html·html双行夹注
奔跑的卡卡6 小时前
Web开发与AI融合-第一篇:Web开发与AI融合的时代序幕
前端·人工智能