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 相关文章推荐
Prototype 学习 工具函数学习($方法)
Jul 12 Javascript
js或css文件后面跟参数的原因说明
Jan 09 Javascript
一个原生的用户等级的进度条
Jul 03 Javascript
基于javascript 闭包基础分享
Jul 10 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
Jun 23 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
Jan 14 Javascript
详解node HTTP请求客户端 - Request
May 05 Javascript
基于React Native 0.52实现轮播图效果
Aug 25 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
Nov 30 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
Jul 21 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
Sep 16 Javascript
修改NPM全局模式的默认安装路径的方法
Dec 15 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获取随机数字和字母的方法详解
2013/06/06 PHP
php生成图形验证码几种方法小结
2013/08/15 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
让人印象深刻的10个jQuery手风琴效果应用
2012/05/08 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
2013/12/11 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
判断iframe里的页面是否加载完成
2014/06/06 Javascript
javascript表单事件处理方法详解
2016/05/15 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
Bootstrap模态框禁用空白处点击关闭
2016/10/20 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
JS数据类型STRING使用实例解析
2019/12/18 Javascript
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
Python的Django框架中的数据库配置指南
2015/07/17 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
使用sklearn的cross_val_score进行交叉验证实例
2020/02/28 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
为什么要有struct关键字
2012/05/08 面试题
西部世纪面试题
2014/12/05 面试题
英文简历中的自荐信范文
2013/12/14 职场文书
微观物理专业自荐信
2014/01/26 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
法律系毕业生自荐信范文
2014/03/27 职场文书
应用外语系自荐信
2014/06/26 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
2015年老干部工作总结
2015/04/23 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB