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 的?
  • 配置文件怎么生效的?
  • 插件怎么执行的?
  • 如何处理静态资源文件?
  • 在请求时发生了什么?

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

相关推荐
梦想平凡12 分钟前
百游棋牌源代码开发搭建教程(十):隔离部署、备份恢复与双端验收
java·前端·javascript·数据库·源代码管理
yume_sibai1 小时前
06-Rust Web 开发实战(Axum 框架 + 数据库 + JWT 认证 + 中间件 + 部署)
前端·数据库·rust
计算机魔术师3 小时前
特朗普上台打给黄仁勋:AI末日论是骗局,我们绝不让它发生
前端
troy1283 小时前
Python 基础语法(八):Web 后端开发、数据分析与可视化、网络爬虫、人工智能 / 大模型应用
前端·python·数据分析
计算机魔术师3 小时前
CEO说要慢下来,黑客说别做梦了——同一篇论文,两种命运
前端
kyriewen4 小时前
我花3天抓了一个幽灵bug,凶手藏在第4层
前端·javascript·程序员
IT_陈寒4 小时前
Java里用Stream.parallel()翻车实录,这性能还不如单线程
前端·人工智能·后端
wangchunyu1144 小时前
JavaScript 零基础入门教程
前端
hanchenxing5 小时前
前端异步任务三方案:Celery vs Redis Stream vs BullMQ 实战对比消息队列
前端·数据库·redis·异步任务·方案对比
mONESY5 小时前
LangGraph.js 从零上手:把 Agent 工作流从一条线变成一张网
javascript