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 相关文章推荐
Js控制弹窗实现在任意分辨率下居中显示
Aug 01 Javascript
Node.js实现批量去除BOM文件头
Dec 20 Javascript
深入剖析JavaScript编程中的对象概念
Oct 21 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
Jun 30 Javascript
详解JavaScript的内置对象
Dec 07 Javascript
angular1配合gulp和bower的使用教程
Jan 19 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
Jul 15 Javascript
jQuery实现的点击按钮改变样式功能示例
Jul 21 jQuery
JS实现根据详细地址获取经纬度功能示例
Apr 16 Javascript
vue.js实现只能输入数字的输入框
Oct 19 Javascript
js实现浏览器打印功能的示例代码
Jul 15 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
Jan 11 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
PHP开发不能违背的安全规则 过滤用户输入
2011/05/01 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
2014/06/25 PHP
浅谈PHP eval()函数定义和用法
2016/06/21 PHP
[原创]PHP实现SQL语句格式化功能的方法
2017/07/28 PHP
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
浅谈JavaScript实现面向对象中的类
2014/12/09 Javascript
javascript实现在网页任意处点左键弹出隐藏菜单的方法
2015/05/13 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
BootStrap 智能表单实战系列(五) 表单依赖插件处理
2016/06/13 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
layui添加动态菜单与选项卡
2019/07/26 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
解决antd的Form组件setFieldsValue的警告问题
2020/10/29 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
Python常用的日期时间处理方法示例
2015/02/08 Python
基于Python对象引用、可变性和垃圾回收详解
2017/08/21 Python
python读文件保存到字典,修改字典并写入新文件的实例
2018/04/23 Python
pycharm执行python时,填写参数的方法
2018/10/29 Python
pandas的相关系数与协方差实例
2019/12/27 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
打印tensorflow恢复模型中所有变量与操作节点方式
2020/05/26 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
python 批量下载bilibili视频的gui程序
2020/11/20 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
高中数学教师求职信
2013/10/30 职场文书
车间班组长岗位职责
2013/11/13 职场文书
学校运动会开幕演讲稿
2014/01/04 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
经理聘任证明
2015/03/02 职场文书
总经理司机岗位职责
2015/04/10 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers