翻译Angular Router-模块预加载

Posted Angular中文社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了翻译Angular Router-模块预加载相关的知识,希望对你有一定的参考价值。

原文作者是Victor Savkin,他是Angular核心团队成员,路由模块就是他开发的。

懒加载机制会把应用切分成多个bundle(包、块)然后按需加载,从而提升加载速度。我们在设计路由机制的时候就考虑了对懒加载的支持,并且这种支持是透明的,你可以轻松选择是否需要启用懒加载。

当然,懒加载也有自己的问题,那就是当用户导航到启用了懒加载的模块的时候,路由不得不即时到服务器上去获取所需要的模块,而这个过程需要消耗一些时间。

为了解决这个问题,我们引入了预加载机制。现在,在用户与应用交互的过程中,路由可以在后台悄悄地预先加载那些需要懒加载的模块。

本文是以Angular 2 Router这本书为基础的,你可以在以下链接找到这本书( 。这本书的内容远胜于入门手册,它深入解析了关于路由的方方面面。心智模型、设计约束,以及API里面的各种细节,可以说无所不包。如果你觉得这篇文章不错,强烈推荐去看看这本书!

以下是它的工作原理。

我们首先加载初始模块,这个模块里面只包含启动应用所必需的组件。这样可以保持这个模块尽可能的快。

【翻译】Angular Router-模块预加载 

然后,我们就用这个很小的代码块启动应用。

【翻译】Angular Router-模块预加载 

这时候,应用已经开始运行起来了,用户已经可以进行交互了。与此同时,我们在后台预加载其它模块。

【翻译】Angular Router-模块预加载 

最后,当用户点击一个需要懒加载的模块链接的时候,导航可以瞬间完成。

【翻译】Angular Router-模块预加载 

这样我们就同时获得了两种方式带来的好处:初始加载时间尽可能地短,而随后的导航又足够快。

启用预加载

为了启用预加载,我们需要给forRoot方法传递一个预加载策略。

【翻译】Angular Router-模块预加载 

最新版本的路由内置了两种策略:不进行预加载、预加载所有模块。当然,你也可以提供你自己的策略。实际上这样做比看起来的更加简单。

自定义预加载策略

假设我们不想预加载所有模块,可以在路由的配置项里面明确指定需要预加载什么内容。

【翻译】Angular Router-模块预加载 

我们从创建自定义预加载策略开始。

 

preload方法可以接受2个参数:第一个参数是route;第二个参数是一个函数,它会实际负责预加载工作。在这个函数里面,我们会检查一下preload属性是不是被设置成了true。如果是,我们就会调用load函数。

最后,为了启用这个自定义策略,我们需要把它添加到providers列表里面并传递给RouterModule.forRoot。

 

学习更多

果你想要学习更多关于Angular路由方面的内容,请检出我写的关于这个主题的书:https://leanpub.com/router

 Angular Router:https://vsavkin.com/angular-2-router-d9e30599f9ea

● Declarative Lazy Loading:https://vsavkin.com/angular-router-declarative-lazy-loading-7071d1f203ee

以上是关于翻译Angular Router-模块预加载的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 Angular 中预加载字体?

Dojo:覆盖预加载模块

如何使用 Vue CLI 4.3 默认禁用链接(异步模块)预取/预加载?

使用 AngularJS 路由时有没有办法预加载模板?

js的 image 属性 和一个预加载模块

Elasticsearch将数据预加载到文件系统缓存中