全部学科
Python全栈
python
NodeJS全栈
nodejs
📅 2026-05-23 7 分钟 ✍️ juanwangdev

模块图与依赖分析

Vite 维护模块图追踪依赖关系,用于热更新和构建分析。

模块图结构

JavaScript
// Vite 模块图
{
  url: '/src/App.vue',
  file: '/project/src/App.vue',
  id: '/project/src/App.vue',
  imports: ['/src/router/index.js', '/src/store/index.js'],
  importers: ['/src/main.js'],
  isHmrBoundary: false
}

依赖追踪

JavaScript
main.js
  → imports: [App.vue, router/index.js]
    → App.vue imports: [components/Button.vue]
      → Button.vue imports: [styles/button.css]

注意:每个模块记录导入者和被导入者,形成双向依赖图。

动态导入处理

JavaScript
// 动态导入
const About = () => import('./views/About.vue')

// 模块图记录
{
  url: '/src/views/About.vue',
  isDynamicImport: true,
  importers: ['/src/main.js']
}

动态导入创建独立 chunk,按需加载。

循环依赖处理

JavaScript
// A.js
import { b } from './B.js'

// B.js
import { a } from './A.js'

// Vite 处理:
// 1. 检测循环依赖
// 2. 使用引用延迟解决
// 3. HMR 时标记边界

HMR 边界计算

JavaScript
修改 Button.vue
  → 查找 importers: [App.vue]
  → App.vue 不是 HMR 边界
  → 继续向上: [main.js]
  → main.js 是 HMR 边界
  → 更新边界内所有模块

模块图 API

text
// 在插件中访问模块图
export default function myPlugin() {
  return {
    name: 'my-plugin',
    handleHotUpdate({ server, modules }) {
      const moduleGraph = server.moduleGraph

      // 掷取模块
      const module = moduleGraph.getModuleById(id)

      // 获取导入者
      const importers = module.importers
    }
  }
}

依赖关系可视化

text
// 使用插件可视化依赖
import { visualizer } from 'rollup-plugin-visualizer'

export default defineConfig({
  plugins: [
    visualizer({
      filename: 'deps.html',
      open: true
    })
  ]
})

要点总结

  • 模块图追踪双向依赖关系
  • 动态导入标记为独立 chunk
  • 循环依赖使用延迟引用处理
  • HMR 边界基于模块图计算
想在手机上练习这篇文章的配套题目?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一篇 Rollup 生产构建原理
下一篇 → HMR 边界计算算法
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码