使用import.meta.url实现传递路径动态加载资源

背景

在开发 Vue 项目时,动态路由是必要功能,从后端或本地获取到菜单列表的 component 都是是字符串,要转成动态加载方式。因为项目用到了 monorepo,有多个子模块,但有的子模块是直接被引用的,不会单独打包,没有 vite.config.ts 配置,也就没有 @ 别名,转换路由的功能又抽成公共函数,这时模块路径就不好处理,因为动态导入路径默认是相对当前模块的。从别名设置处获得灵感,使用 import.meta.urlimport.meta.url 返回当前模块的完整 URL,在调用的地方把 import.meta.url 当作参数传递给转换路由的函数,这样在函数中就可以得到该子模块的相对路径了,相当于传递了相对路径。

示例

调用处

typescript 复制代码
setAsyncRouter(import.meta.url, 'monitor')

转换函数

typescript 复制代码
const setAsyncRouter = (path: string, module: string) => {
		const menuStore = useMenuStore();
		const baseUrl = new URL("./", path).href;
		const baseRouter: any[] = [
			{
				path: `/${module}`,,
				name: "layout",
				component: "views/layout/index.vue",
				meta: {
					title: "底层layout",
				},
				children: [],
			},
		];
		const menus = menuStore.asyncMenus;
		const asyncRouter = getMenuList(menus, module););
		baseRouter[0].children = asyncRouter;
		asyncRouterHandle(baseRouter, baseUrl);
	};
typescript 复制代码
function asyncRouterHandle(asyncRouter: Router[], path: string) {
	asyncRouter.forEach((item) => {
		if (item.component) {
			const component = `${path}${item.component}`;
			item.component = () => import(component); // 这里要先定义变量再用
		}
		if (item.children) {
			asyncRouterHandle(item.children, path);
		}
	});
}

需要传递路径的地方都可以这么用。

相关推荐
Bigger1 分钟前
第一章:我是如何剖析 Claude Code 整体架构与启动流程的
前端·aigc·claude
小恰学逆向7 分钟前
【爬虫JS逆向之旅】某球网参数“md5__1038”逆向
javascript·爬虫
竹林8188 分钟前
从“连接失败”到丝滑登录:我用 ethers.js v6 搞定 MetaMask 钱包连接的全过程
前端·javascript
oi..11 分钟前
《Web 安全入门|XSS 漏洞原理、CSP 策略与 HttpOnly 防护实践》
前端·网络·测试工具·安全·web安全·xss
UXbot21 分钟前
2026年AI全链路产品开发工具对比:5款从创意到上线一站式平台深度解析
前端·ui·kotlin·软件构建·swift·原型模式
一拳不是超人30 分钟前
前端工程师也要懂的服务器部署知识:从 Nginx 到 CI/CD
服务器·前端
AlkaidSTART35 分钟前
TanStack Query 技术指南:异步状态管理核心实践
前端·react.js
三原36 分钟前
超级好用的三原后台管理v1.0.0发布🎉(Vue3 + Ant Design Vue + Java Spring Boot )附源码
java·vue.js·开源
前端那点事36 分钟前
前端必看!JS高频实用案例(单行代码+实战场景+十大排序)
javascript
之歆36 分钟前
RBAC权限模型设计与实现深度解析
vue.js