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

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

相关推荐
CAD老兵2 分钟前
在浏览器里对比 DWG/DXF 图纸 —— @mlightcad/cad-diff-viewer
前端·javascript·github
JasonYin8 分钟前
AI 定义的 H5移动端 开发规范,直接抄作业!
前端
诗章与猫10 分钟前
Leaflet 渲染 100 万 marker 卡成 PPT?我用 WebGL 重写了渲染器
前端
用户9210802628616 分钟前
在 AI 代码生成项目里接入 Thought:别展示“玄学思维链”,只展示用户真正关心的工具调用
前端
WL_arm33 分钟前
Vibe Coding(氛围编程)入门
javascript·css·人工智能·html5
艾醒(AiXing-w)35 分钟前
LangChain 1.0 入门(二):LangChain 全模型标准化接入最佳实践(小白参数详解版)
前端·javascript·langchain
计算机魔术师1 小时前
我看了 Hugging Face 的 Daily Papers,发现这件事
前端
yu俞娥宝2 小时前
Codex官网前端可抄吗?技术拆解、风险边界与合规借鉴方案
前端
捧 花2 小时前
FastAPI 基础语法:从一个完整接口理解 Web API 的设计
前端·python·fastapi·middleware
Hilaku2 小时前
一行 CSS 新特性干掉 20 行 JavaScript ?
前端·javascript·程序员