Angular-ui-router + oclazyload + requirejs实现资源随route懒加载
刚开始用angularjs做项目的时候,我用的是ng-router,觉得加载并不好。所以就用了ui-router,考虑到在app上网页加载速度太慢,所以我就想到了用懒加载,看下是否能提升性能,提高加载速度。 那使用懒加载,就要对项目进行进一步的拆分,我觉得这个拆分,可以提高我对angularjs的理解。
本文主要说明在用AngularJS开发web应用中如何实现lazyload,使用AngularJS需要在前端实现路由功能,本文就介绍利用此点实现前端资源的懒加载。
问题
目前大部分AngularJS的应用用requirJS组织模块,但是很多都没有使用lazyload功能,在app.js中启动时将全部依赖加载进来,在模块功能较少,前端资源少的情况下没问题。那么问题来了,依赖资源过多时怎么办?
- build时利用grunt-contrib-requirejs提取合并文件,减少http请求,但是存在问题:build后文件大;线上调试不方便,尤其在html2js后问题更明显。
- 开发中尽量在原有文件里进行新业务添加,不增加额外的http请求压力,但是存在问题:多人合作时需要经常处理代码冲突;单个文件(control,directive等)很大,看的是眼花缭乱,容易出问题。
解决问题
基本思路:在路由切换时加载所需要资源。
工具:Angular-ui-router,oclazyload,requirejs。
- 配置oclazyload
在引入oclazyload文件后配置主要参数项
app.config(['$ocLazyLoadProvider',function($ocLazyLoadProvider){
$ocLazyLoadProvider.config({
loadedModules: ['monitorApp'],//主模块名,和ng.bootstrap(document, ['monitorApp'])相同
jsLoader: requirejs, //使用requirejs去加载文件
files: ['modules/summary','modules/appEngine','modules/alarm','modules/database'], //主模块需要的资源,这里主要子模块的声明文件
debug: true
});
}]);
- 配置ui-route
利用angularjs-ui-route配置路由跳转的基本规则和需要懒加载文件
app.config(['$stateProvider', '$urlRouterProvider',function($stateProvider, $urlRouterProvider){
var lazyDeferred;
/**
* 路由切换时调用
* @param param.file 懒加载文件数组
* @param tpl 子模块view视图
* @param module 子模块名
*/
function resovleDep(param,tpl,module){
var resolves = {
loadMyCtrl: ['$ocLazyLoad', '$templateCache', '$q', function($ocLazyLoad,$templateCache,$q) {
lazyDeferred = $q.defer();
return $ocLazyLoad.load({
name : module,
cache: false,
files: param.files
}).then(function() {
lazyDeferred.resolve($templateCache.get(tpl));
});
}]
};
return resolves;
}; $urlRouterProvider.otherwise('/summary');
//路由配置
$stateProvider
.state('module1', {
url:'/module1',
templateProvider: function() { return lazyDeferred.promise; },
controller: 'module1Controller',
resolve : resovleDep({files:[
'controllers/module1Ctrl',
'services/module1Service',
'directives/module1Directive'
]}, 'views/module1.html', 'app.module1')
})
.state('module2', {
abstract: true,
url: '/module2',
templateUrl: 'views/module2.html'
})
.state('module2.list', {
url: '',
templateProvider: function() { return lazyDeferred.promise; },
controller: 'module2Controller',
resolve : resovleDep({files:[
'controllers/module2ListCtrl',
'services/module2Service'
]}, 'views/list.html', 'app.module1')
})
.state('module1.detail', {
url: '/:id',
templateProvider: function() { return lazyDeferred.promise; },
controller: 'detailController',
resolve : resovleDep({files:[
'controllers/detailCtrl',
'services/detailService'
]}, 'views/detail.html', 'app.module2')
});
}]);
结束
ok,至此就可以在路由切换时方便的加载子模块和依赖资源,oclazyload和ui-router还有很多可挖掘的,大家可参考api满足需求。
ps:最初用angular-route+oclazyload做时出现:
multiple directives asking for isolated scope on
multiple asking for template
等问题,不好用,建议使用ui-route,强大的多。
文章来自:http://www.cnblogs.com/pengjv/p/4205962.html
Angular-ui-router + oclazyload + requirejs实现资源随route懒加载的更多相关文章
- Angular性能优化实践——巧用第三方组件和懒加载技术
应该有很多人都抱怨过 Angular 应用的性能问题.其实,在搭建Angular项目时,通过使用打包.懒加载.变化检测策略和缓存技术,再辅助第三方组件,便可有效提升项目性能. 为了帮助开发者深入理解和 ...
- angular 引入ocLazyLoad实现js、controller懒加载
项目之前是直接在index.html中引用了controller.js,其中包含了所有的controller.现引入ocLazyLoad实现按需加载,到指定页面再加载指定js.controller 1 ...
- requirejs:性能优化-及早并行加载
为了提高页面的性能,通常情况下,我们希望资源尽可能地早地并行加载.这里有两个要点,首先是尽早,其次是并行. 通过data-main方式加载要尽可能地避免,因为它让requirejs.业务代码不必要地串 ...
- angular懒加载的一些坑
写在前面 最近在工作中接触到angular模块化打包加载的一些内容,感觉中间踩了一些坑,在此标记一下. 项目背景: 项目主要用到angularJs作为前端框架,项目之前发布的时候会把所有的前端脚本打包 ...
- angular配置懒加载路由的思路
前言 本人记性不好,对于别人很容易记住的事情,我愣是记不住,所以还是靠烂笔头来帮我长长记性. 参考文章:https://blog.csdn.net/xif3681/article/details/84 ...
- angular懒加载机制 刷新后无法回退解决方案
今天在项目中遇到一个很奇怪的问题,使用oclazyload来懒加载angular的模块,刷新页面后,单击回退按钮无法返回上一个页面.估计是使用懒加载机制销毁了angular内部的state关联,导致无 ...
- vue+element ui项目总结点(一)select、Cascader级联选择器、encodeURI、decodeURI转码解码、mockjs用法、路由懒加载三种方式
不多说上代码: <template> <div class="hello"> <h1>{{ msg }}</h1> <p> ...
- 路由懒加载---Vue Router
一.什么是懒加载? 懒加载也就是延迟加载或者按需加载,即在需要的时候进行加载. 二.为什么在Vue路由中使用懒加载? 像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常 ...
- Angular中懒加载一个模块并动态创建显示该模块下声明的组件
angular中支持可以通过路由来懒加载某些页面模块已达到减少首屏尺寸, 提高首屏加载速度的目的. 但是这种通过路由的方式有时候是无法满足需求的. 比如, 点击一个按钮后显示一行工具栏, 这个工具栏组 ...
随机推荐
- 自定义表单-jsonform
项目文件地址:https://github.com/powmedia/backbone-forms#editor-list DEOM:http://jsfiddle.net/evilcelery/dW ...
- nhibernate+autofac+mvc的demo
想自己做一个小的demo.目的是能够提供一个系统架构,在这个基础上,可以快速开发一些小型的系统.
- D13
=-=由于本人有极度强迫症啊.. 然后这个博客又不能改顺序.. 前几天由于台风是在宾馆写题..简直各种没有效率..所以今天就先草草写下题解,之后再完善吧 T1:字符串处理 c++的话,解决读空格继续读 ...
- 安装mysql-python报错:UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 65: ordinal not in range(128)
安装mysql-python报错: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 65: ordinal n ...
- 企业架构研究总结(31)——TOGAF架构内容框架之内容元模型(下)
2.2 治理扩展(Governance Extensions) 治理扩展元模型内容 治理扩展部分的意图在于引入额外的,并且与支持运营治理的目标和业务服务相关的结构化数据. 2.2.1 关注范围 为目标 ...
- Sublime和Codeblocks支持C++11
Sublime和Codeblocks支持C++11 闲来没事看了一下C++11,比起C++0x多了很多新功能,像auto变量,智能指针等,g++4.7以上版本也提供了对C++11的支持,但是,如何在你 ...
- 【Yom框架】漫谈个人框架的设计之一:是IRepository还是IRepository<T>?
前言 ...
- jQuery表格排序组件-tablesorter
一.引入文件 <script type="text/javascript" src="js/jquery.js"></script> & ...
- 进程间通讯之mmap文件共享
进程间通讯之mmap文件共享 引文: 个人名言:“同一条河里淹死两次的人,是傻子,淹死三次及三次以上的人是超人”.经历过上次悲催的面试,决定沉下心来,好好的补充一下基础知识点.本文是这一系列第一篇:进 ...
- Kemaswill 机器学习 数据挖掘 推荐系统 Ranking SVM 简介
Ranking SVM 简介 排序一直是信息检索的核心问题之一,Learning to Rank(简称LTR)用机器学习的思想来解决排序问题(关于Learning to Rank的简介请见我的博文Le ...