Skip to content
On this page

预加载路由组件 v1.1.6+

在过去的版本中,uni-simple-router 虽然提供了按需加载组件的功能,但随着项目规模的不断扩大,路由组件的体积也随之增加。这种情况导致在页面跳转时,需要花费大量时间下载和加载相关组件,进而影响用户的使用体验。

为了应对这一问题,我们很高兴地宣布,在新版本中引入了预加载组件的功能。该功能能够提前加载需要的组件,从而减少页面跳转时的等待时间。这不仅解决了过去版本中由于按需加载组件而导致的加载延迟问题,还显著提升了整体的用户体验。

陷阱提示

当前功能仅为H5提供,当你运行到其他端时请做好条件编译。

基本使用

要想预加载一个路由组件,我们需要先为这个路由组件设置一个 name,假设我们的路由表为如下结构:

ts
import {
	__dynamicImportComponent__
} from '@/uni-simple-router'
	
export const customTabbar=[{
		path:`/customTabbar`,
		name:`customTabbar`,
		component:__dynamicImportComponent__(`../../examples/tabbar/index.vue`,{
			pageType: `top`,
		}),
		children:[
			{
				path:`home`,
				name:`customTabbarHome`,
				component:__dynamicImportComponent__(`~@/examples/tabbar/children/home.vue`),
				children:[
					{
						path:`child/:id(\\d{3})`,
						name:`customTabbarHomeChild`,
						component:__dynamicImportComponent__(`~@/examples/tabbar/children/children/commonChild.vue`)
					}
				],
			},
			{
				path:`class`,
				name:`customTabbarClass`,
				component:__dynamicImportComponent__(`~@/examples/tabbar/children/class.vue`),
			},
			{
				path:`release`,
				name:`customTabbarRelease`,
				component:__dynamicImportComponent__(`~@/examples/tabbar/children/release.vue`),
			},
			{
				path:`news`,
				name:`customTabbarNews`,
				component:__dynamicImportComponent__(`~@/examples/tabbar/children/news.vue`),
			},
			{
				path:`me`,
				name:`customTabbarMe`,
				component:__dynamicImportComponent__(`~@/examples/tabbar/children/me.vue`),
			},
		]
	}
]

我们现在需要加载 namecustomTabbarHomeChild 的路由组件:

ts
import {
	createRouter,
	preloadRoutes
} from '@/uni-simple-router'  // 记得换成自己的路径

const router = createRouter({
  // .... 实例化
})

router.isReady().then(()=>{
  preloadRoutes(['customTabbarHomeChild']).then(res=>{
    console.log(res)
  });
})

如上代码,preloadRoutes 函数会在路由准备就绪后预加载指定的路由组件。这样,当用户导航到 customTabbarHomeChild 时,组件已经加载完毕,从而减少了等待时间。这个函数的使用非常简单,你只需要将你所需要预加载的组件 name 传递给该函数即可完成加载。

陷阱提示

preloadRoutes 函数一定要在 router.isReady() 准备完成之后再调用,否者会加载失败。

使用技巧

preloadRoutes 函数允许你一次预加载多个路由组件,当你预加载的 name 值是嵌套子组件时,插件会自动帮你完成子级到顶级组件的组件,而非每个组件 name 都需要填写,例如,当你预加载 customTabbarHomeChild 组件时,插件会自动预加载其父级 customTabbarHome 及顶级 customTabbar 组件。

ts
/**
 * 目标:预加载 customTabbarHomeChild
 * 实际:会自动加载  customTabbar | customTabbarHome | customTabbarHomeChild
 */
preloadRoutes(['customTabbarHomeChild']).then(res=>{
  console.log(res)
});

// 等效于

preloadRoutes([
  'customTabbar',
  'customTabbarHome',
  'customTabbarHomeChild'
]).then(res=>{
  console.log(res)
});

preloadRoutes 签名

ts
function preloadRoutes(recordName: string | Array<string>): Promise<Array<{
    status: 'fulfilled' | 'rejected';
    value: any;
}>>
预加载路由组件 v1.1.6+ has loaded