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

编写 resolveId 钩子插件

resolveId 钩子用于自定义模块路径解析逻辑。

基本结构

JavaScript
export default function resolvePlugin() {
  return {
    name: 'resolve-plugin',
    resolveId(source, importer) {
      // source 是导入路径
      // importer 是导入者的路径

      // 返回解析后的路径
      return resolvedPath
    }
  }
}

路径重定向

JavaScript
export default function redirectPlugin() {
  return {
    name: 'redirect-plugin',
    resolveId(source, importer) {
      // 将 old-lib 重定向到 new-lib
      if (source === 'old-lib') {
        return this.resolve('new-lib', importer)
      }
      return null
    }
  }
}

自定义路径映射

JavaScript
export default function aliasPlugin(options) {
  const aliases = options.aliases || {}

  return {
    name: 'alias-plugin',
    resolveId(source, importer) {
      for (const [alias, target] of Object.entries(aliases)) {
        if (source.startsWith(alias)) {
          const newSource = source.replace(alias, target)
          return this.resolve(newSource, importer)
        }
      }
      return null
    }
  }
}

虚拟模块识别

JavaScript
export default function virtualResolvePlugin() {
  const virtualModuleId = 'virtual:env'

  return {
    name: 'virtual-resolve',
    resolveId(source) {
      // 识别虚拟模块
      if (source === virtualModuleId) {
        return virtualModuleId
      }
      return null
    }
  }
}

注意:resolveId 返回的 id 会传递给 load 钩子。

返回值说明

JavaScript
resolveId(source, importer) {
  // 返回 null 使用默认解析
  return null

  // 返回字符串作为解析结果
  return '/path/to/module.js'

  // 返回对象提供更多信息
  return {
    id: '/path/to/module.js',
    external: false  // 是否外部化
  }

  // 调用默认解析器
  return this.resolve(source, importer)
}

解析顺序

JavaScript
import 'my-lib'
  → resolveId 钩子执行
  → 返回解析路径
  → load 钩子加载内容
  → transform 钩子转换

与 vite 默认别名配合

text
export default function customAliasPlugin() {
  return {
    name: 'custom-alias',
    enforce: 'pre',  // 在 vite 默认别名之前
    resolveId(source) {
      if (source.startsWith('$')) {
        return source.replace('$', '@company/')
      }
      return null
    }
  }
}

要点总结

  • resolveId 自定义模块路径解析
  • 可实现路径重定向和别名
  • 返回 null 使用默认解析
  • enforce 控制解析顺序

📝 发现内容有误?点击此处直接编辑

← 上一篇 编写 load 钩子插件
下一篇 → 编写 transform 钩子插件
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库