Vite 中的 import.meta.glob vs 动态导入:该用哪个?

Vite 项目里,import.meta.glob(glob 导入)和 动态导入 (import()) 都能按需引入模块,但它们的定位和实现机制不太一样:


1. import.meta.glob

  • 用法

    ini 复制代码
    const modules = import.meta.glob('./pages/*.ts');
    • 返回一个对象,key 是匹配到的文件路径,value 是一个函数(懒加载)或模块对象(配合 eager: true)。
    • 支持 eager: true,会直接加载模块(同步),否则返回一个懒加载函数。
    • 只能在构建时静态分析的路径下使用,不能拼接变量。
  • 应用场景

    • 大量文件批量引入(如 views/ 下的路由、store/ 模块、Markdown 文章等)。
    • 自动化路由 / 自动化注册组件。
    • 按文件模式统一管理资源。
  • 特点

    • 静态分析:vite 会在构建时根据 glob 结果生成一个清单,不会漏文件。
    • 可批量:一次性处理多个文件。
    • 受限于路径:必须写死(或相对/绝对路径),不能动态拼接变量。

2. 动态导入 import()

  • 用法

    javascript 复制代码
    const module = await import(`./pages/${page}.ts`);
    • 返回一个 Promise,需要 await
    • 运行时决定加载哪个模块。
    • 支持 变量拼接路径 ,但 Vite 构建时会做 预打包(code splitting) ,可能会生成多个 chunk。
  • 应用场景

    • 运行时才知道加载哪个文件(比如根据路由参数加载某个页面组件)。
    • 条件导入(某些场景才需要的模块)。
    • 大文件的按需加载,减少初始 bundle。
  • 特点

    • 运行时决定路径:比 glob 更灵活。
    • 懒加载为主:必须异步获取。
    • 会影响代码分割:不同参数可能打包成不同 chunk。

3. 对比总结

特性 import.meta.glob 动态导入 import()
加载方式 静态批量生成映射表,支持懒加载或 eager 运行时动态加载,异步返回
路径 需要写死 glob 模式 可拼接变量,灵活
Subpath imports ❌ 不支持(必须文件路径) ✅ 支持
用途 自动化批量导入 条件/变量驱动的懒加载
构建时优化 Vite 确定文件清单,利于 Tree-shaking Vite 会做 chunk 拆分,可能生成多个 bundle
典型场景 路由自动生成、组件自动注册 按需路由加载、大型依赖的懒加载

👉 简单一句话:

  • import.meta.glob = 静态、批量、自动收集文件,适合 固定目录下的批量路由/组件
  • import() = 灵活、运行时决定,适合 基于变量/条件的动态加载
相关推荐
SoaringHeart12 分钟前
Flutter进阶:基于 EasyRefresh 的下拉刷新封装 n_easy_refresh_mixin.dart
前端·flutter
IT_陈寒2 小时前
Vite的热更新突然不香了,排查三小时差点砸键盘
前端·人工智能·后端
子兮曰3 小时前
Agency-Agents 深度解析:400+ AI 专家的"梦之队"如何重塑开发工作流
前端·后端·vibecoding
竹林8183 小时前
用 The Graph 查询链上数据实战:从手搓 RPC 到 Subgraph,我的 NFT 项目数据加载快了 10 倍
前端·javascript
妙码生花3 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十九):点选验证码代码逐行目检
前端·后端·go
Awu12274 小时前
⚡从零开发 Agent CLI(五)实现一个可治理、可扩展的工具系统
前端·人工智能·claude
咪库咪库咪5 小时前
Vue3-生命周期
前端
莪_幻尘5 小时前
你的 AI Skill 越多越蠢?Token 上下文爆炸的求生指南
前端·ai编程
lichenyang4535 小时前
从 has.echo 到异步 API 注册表:一次 ASCF API 回调不触发的排查复盘
前端
林瞅瞅6 小时前
Nuxt3 项目部署 Nginx 防盗链后特定 JS 文件 403 问题修复方案
前端