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 相关文章推荐
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
Oct 29 Javascript
js 格式化时间日期函数小结
Mar 20 Javascript
JavaScript 代码压缩工具小结
Feb 27 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
Aug 09 Javascript
PHP中CURL的几个经典应用实例
Jan 23 Javascript
JavaScript之DOM_动力节点Java学院整理
Jul 03 Javascript
仿京东快报向上滚动的实例
Dec 13 Javascript
JavaScript实现百度搜索框效果
Mar 26 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
Sep 05 Javascript
JS实现倒计时图文效果
Nov 17 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
Nov 09 Javascript
JavaScript 语句之常用 for 循环详解
Mar 29 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防止sql注入代码实例
2013/12/18 PHP
关于jquery动态增减控件的一些想法和小插件
2010/08/01 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
基于JQuery的抓取博客园首页RSS的代码
2011/12/01 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
js转化毫秒为时间格式代码
2014/04/10 Javascript
javascript中定义类的方法详解
2015/02/10 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
微信小程序的动画效果详解
2017/01/18 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
2017/05/03 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
Webpack 服务器端代码打包的示例代码
2017/09/19 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
关于Vue源码vm.$watch()内部原理详解
2019/04/26 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
webpack打包优化的几个方法总结
2020/02/10 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
python实现log日志的示例代码
2018/04/28 Python
python交易记录整合交易类详解
2019/07/03 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
pandas apply多线程实现代码
2020/08/17 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
测绘工程系学生的自我评价
2013/11/30 职场文书
学习党章思想汇报
2014/01/07 职场文书
2014新年元旦活动策划方案
2014/02/18 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
关于MybatisPlus配置双数据库驱动连接数据库问题
2022/01/22 Java/Android
python和anaconda的区别
2022/05/06 Python