Vite 的模块导入寻址机制
Vite 的模块导入寻址机制
Vite 的模块导入寻址系统是基于 ES Modules (ESM) 的,同时兼容 Node.js 的模块解析规则,并在此基础上进行了扩展和优化。以下是 Vite 中 import 语句的详细寻址过程:
基本寻址规则
-
裸模块导入 (Bare Module Imports)
import vue from 'vue'- 从
node_modules查找 - 查找顺序:当前目录 → 父目录 → 直到项目根目录
- 支持
package.json中的exports和imports字段
- 从
-
相对路径导入
import './module.js' import '../utils/helper'- 相对于当前文件位置解析
- 可以省略扩展名 (Vite 会自动尝试
.js,.ts,.jsx,.tsx等)
-
绝对路径导入
import '/src/components/Button'- 从项目根目录开始解析
特殊寻址特性
1. 文件扩展名解析
Vite 会自动尝试以下扩展名(按顺序):
.js,.ts,.jsx,.tsx.mjs,.cjs.json.css,.scss,.less等样式文件.vue,.svelte等框架单文件组件
2. 目录索引文件
当导入路径是目录时,Vite 会查找:
- 目录下的
package.json的main或exports字段 - 目录下的
index文件(如index.js,index.ts等)
3. 路径别名 (Aliases)
在 vite.config.js 中配置:
import { defineConfig } from 'vite'
import path from 'path'
export default defineConfig({
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
'components': path.resolve(__dirname, './src/components')
}
}
})
使用示例:
import Button from '@/components/Button' // 解析为 /src/components/Button
import Header from 'components/Header' // 解析为 /src/components/Header
4. 依赖预构建
首次导入第三方模块时,Vite 会:
- 分析依赖关系
- 将 CommonJS 模块转换为 ESM
- 合并多个小文件为单个文件
5. 特殊查询参数
Vite 支持通过查询参数修改导入行为:
import Worker from './worker.js?worker' // 作为 Web Worker 导入
import wasm from './program.wasm?init' // 作为 WASM 初始化函数导入
import raw from './shader.glsl?raw' // 作为原始字符串导入
自定义解析
可以通过 resolve.resolveId 钩子自定义解析逻辑:
// vite.config.js
export default defineConfig({
plugins: [{
name: 'custom-resolver',
resolveId(source, importer) {
if (source.startsWith('custom:')) {
return path.resolve(__dirname, source.replace('custom:', ''))
}
}
}]
})
与 Node.js 寻址的区别
- 开发环境:Vite 使用浏览器原生 ESM,Node.js 使用自己的模块系统
- 扩展名处理:Vite 自动尝试更多扩展名
- 静态资源:Vite 可以直接导入图片、CSS 等非 JS 资源
- 构建优化:Vite 有依赖预构建和更好的缓存机制
调试技巧
-
使用
--debug标志启动 Vite 查看详细解析日志:vite --debug -
在浏览器开发者工具的 Network 面板查看实际加载的模块
Vite 的模块解析系统设计旨在提供快速的开发体验,同时保持与 Node.js 生态系统的兼容性。
浙公网安备 33010602011771号