使用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);
		}
	});
}

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

相关推荐
程序员黑豆4 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
剪刀石头布啊4 小时前
antd中可编辑表格中巧用useWatch实现联动高性能效果,以及定制延伸学习
前端
油丶酸萝卜别吃5 小时前
前端转全栈学习路线
前端·学习
浮生望5 小时前
前端路由进阶:History API原理与手写HistoryRouter
前端
陆枫Larry5 小时前
JavaScript 中的竞态是什么,为啥会有竟态?
前端
上海安当技术8 小时前
半天接入:USBKey RESTful API + C 动态库,Web 和 C/S 两套集成路径实战
前端·后端·restful·集成·usbkey
DevUI团队8 小时前
从“即兴创作”到“规格先行”,华为云码道(CodeArts)代码智能体持续深耕企业级规范驱动开发能力
前端·人工智能·后端
weixin_431600449 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
avi91119 小时前
[AI教做人]AI平台做2项目;一个3D模型展示,另一个框架多人
javascript·人工智能·ai·3d模型·3d引擎·顶点和法线
kyriewen9 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程