AngularJS 实现按需异步加载实例代码


Posted in Javascript onOctober 18, 2015

AngularJS 通过路由支持多视图应用, 可以根据路由动态加载所需的视图, 在 AngularJS 的文档中有详细的介绍, 网上也有不少教程, 就不用介绍了!

随着视图的不断增加,js文件会越来越多,而 AngularJS 默认需要把全部的js都一次性加载,使用起来非常不便, 因此按需加载模块的需求会越来越强,不过,AngularJS 并没有实现按需加载。

习惯了 seajs 的异步加载方式,也想着 angular 也能同样使用异步加载,但是事实不随人愿。

angularjs 和 requirejs 一样,使用的是预先加载的方式组织模块(这和 seajs 的懒加载正好相反),当一个单页面应用的模块越来越多时,也就意味着需要预加载的模块也会越来越多,这也许也就说明了 angular 更适合用来开发轻应用。

正式开始

路由我使用了angular-ui-router,模块加载器是 requirejs

//路由
{
 state : 'login',
 templateUrl : 'login/login.html',
 controller : 'loginCtrl',
 resolve: {
  realCtrl : function ($q) {
   var def = $q.defer();
   require(['/features/login/login.js'], function (loginCtrl) {
    def.resolve(loginCtrl)
   });
   return def.promise;
  }
 }
},

// 获得$controllerProvider
app.config(function($controllerProvider) {
 app.registerController = $controllerProvider.register;
 // ...
})

// loginControler
app.registerController('loginCtrl', function ($scope) {
 // do something
});

angular应用实现按需加载的方法

我们有个系统是用angular开发的,是一个单页面应用,随着系统的迭代,首屏代码已经过于庞大,所以对系统进行改造。

我们主要面临3个问题

1.是否需要模块加载框架?

2.异步加载回来的页面组件,如何注册?

3.在什么时机加载页面组件?

针对第一个问题,由于angular自身已经有一套模块化方案,再引入模块加载框架有点冗余,而且整体改造量比较大,所以不考虑。

因此只是实现了一个loadscript方法,用来加载组件。稍微需要注意的是加载多个文件时候的串并行,和避免页面重复切换时的重复加载。

第二个问题比较蛋疼,angular有“启动”的说法,“启动”发生在domcontentloaded之后,会把所有注入到主模块中的依赖编译一遍。

AngularJS 实现按需异步加载实例代码

启动之后再想使用controller、deractive等api,会直接报错

AngularJS 实现按需异步加载实例代码

目前来看,解决这个问题,只有一个方法,就是利用主模块的provider主动注册controller,但是由于provider不能直接使用,所以我们把它存在主模块下面。

AngularJS 实现按需异步加载实例代码

通过存下来的方法,可以用来注册异步加载回来的页面组件。缺点就是这样子所有子页面都挂在主模块下了。
针对第三个问题,由于运营平台是单页面应用,最好的加载时机应该是路由监听到哈希变化时,但是由于我们的路由是写死的静态配置,一开始没找到什么好的办法。
后来发现了这样一个api

AngularJS 实现按需异步加载实例代码

大概是说,在$routeChangeSuccess之前,我们还可以做些东西,把加载时机放在这里最适合不过啦
具体实现大概是这样子

AngularJS 实现按需异步加载实例代码

至此,这个方案已经通了,剩下什么工作?
1.整理代码,使代码更通用化,我们以后开发新页面,只需要在路由配置里这样写就可以啦

AngularJS 实现按需异步加载实例代码

2.把现有页面都改造一下,由于之前没有按需加载,不同页面之间的service耦合严重,今后我们开发新页面,就要注意不同页面之间共用的service最好放在component下面

3.改构建,给路由里的js引用换成cdn路径。

Javascript 相关文章推荐
jquery实现pager控件示例
Apr 09 Javascript
js控制网页背景音乐播放与停止的方法
Feb 06 Javascript
ionic组件ion-tabs选项卡切换效果实例
Aug 27 Javascript
javascript简单进制转换实现方法
Nov 24 Javascript
JavaScript奇技淫巧44招【实用】
Dec 11 Javascript
三种Webpack打包方式(小结)
Sep 19 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
Jul 12 Javascript
vscode vue 文件模板的配置方法
Jul 23 Javascript
使用 Element UI Table 的 slot-scope方法
Oct 10 Javascript
Vue中fragment.js使用方法小结
Feb 17 Javascript
JS原形与原型链深入详解
May 09 Javascript
关于小程序优化的一些建议(小结)
Dec 10 Javascript
学习javascript的闭包,原型,和匿名函数之旅
Oct 18 #Javascript
Javascript中的数据类型之旅
Oct 18 #Javascript
谈谈JavaScript自定义回调函数
Oct 18 #Javascript
JS实现的网页背景闪电闪烁效果代码
Oct 17 #Javascript
JavaScript实现点击按钮切换网页背景色的方法
Oct 17 #Javascript
JavaScript实现的背景自动变色代码
Oct 17 #Javascript
jQuery实现有动画淡出效果的二级折叠菜单代码
Oct 17 #Javascript
You might like
destoon常用的安全设置概述
2014/06/21 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
php版微信公众平台开发之验证步骤实例详解
2016/09/23 PHP
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
JavaScript中数组的22种方法必学(推荐)
2016/07/20 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
js初始化验证实例详解
2016/11/26 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
对Vue- 动态元素属性及v-bind和v-model的区别详解
2018/08/27 Javascript
Vue源码探究之虚拟节点的实现
2019/04/17 Javascript
JQuery获取元素尺寸、位置及页面滚动事件应用示例
2019/05/14 jQuery
jQuery实现图片下载代码
2019/07/18 jQuery
JavaScript中的Proxy对象
2020/11/27 Javascript
详解python基础之while循环及if判断
2017/08/24 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
Booking.com西班牙:全球酒店预订
2018/03/30 全球购物
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
团组织推优材料
2014/12/29 职场文书
红旗渠导游词
2015/02/09 职场文书
2015年妇幼卫生工作总结
2015/05/23 职场文书
护理工作心得体会
2016/01/22 职场文书
七年级作文之关于奶奶
2019/10/29 职场文书
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python