浅谈angular懒加载的一些坑


Posted in Javascript onAugust 20, 2016

写在前面

最近在工作中接触到angular模块化打包加载的一些内容,感觉中间踩了一些坑,在此标记一下.

项目背景:

项目主要用到angularJs作为前端框架,项目之前发布的时候会把所有的前端脚本打包压缩到一个文件中,在页面初次访问的时候加载,造成页面初始载入缓慢,在此基础上,提出按需加载,即只有当用户访问某个模块的时候,该模块的脚本才会加载.

工具类:

项目使用grunt打包根据AMD规范,使用grunt-contrib-requirejs来压缩合并模块,同时用ocLazyLoad来完成angular模块的懒加载.

项目进程:

模块打包

项目中代码基本按照AMD规范来编写,使用grunt-contrib-requirejs来将每一个模块压缩到一个js文件中.

问题一:在项目代码中,各个模块都会依赖第三方库/项目中公共服务/项目中公共指令,如果不对这部分内容进行处理的话, grunt-contrib-requirejs会在压缩每个模块的时候,将其依赖的所有模块都加载过来,然后压缩到同一个js文件中.

应对:将第三方库/公共服务和指令分别压缩为三个模块,然后每个模块的打包脚本中使用” exclude”将其移除.如下图所示:

浅谈angular懒加载的一些坑

需要注意的是,公共模块的模块名 需要在相应的路径下有同名的js文件

按需加载

将脚本按模块打包为一个个的js文件后,下一步的工作就是将根据用户请求来加载不同的模块,项目用使用ui-router来处理路由跳转,可以从route入手来完成模块的懒加载.

具体方法是:在用户操作路由跳转时,根据用户要跳转到的state,去加载此state所属的模块.基于此,需要添加一个state和模块之间的映射,最开始的时候使用requireJS来加载,发现脚本可以加载进来,但是angular中注册的控制器/services/filter等均不起作用.调查发现,angular在调用bootstrap方法之后注册的控制器之类的服务不会再被调用.基于此,引入ocLazyLoad来加载(ocLazyLoad对angular源码有一些注入修改).

至此为止,基本实现按需加载,但还有以下几个问题:

模块之间项目依赖

因为存在一些模块之间项目之间有强依赖,对此的处理是在配置文件中添加模块之间的依赖关系,在加载某个模块之前查看其是否有依赖模块,如果有的话,优先加载其依赖模块,待依赖模块加载完成后再去加载当前模块

指令懒加载;

Angular中可以通过$compile来实现指令之间的相互依赖,对此的处理是配置指令名和指令模块的依赖,当用到某个指令的时候,先去加载其模块,然后执行编译方法.这种解决方案能解决大部分的指令依赖.

指令的位置问题.项目中大多用到的都是长页面,每一个长页面划分为若干个区域,每一个区域都是一个指令.使用拦截的时候会有一个问题,就是每个指令加载时间的长短不一样,先回来的指令会优先append到dom上,从而导致页面布局的不确定性.解决方案是,使用deffer机制,待所有指令加载/编译完成后,再往dom树上添加执行.

指令之间的依赖:指令之间也存在项目依赖,对此的解决方案是将相互依赖的指令合并为一个模块,打包到同一个脚本文件中.这个方案能解决大部分的指令依赖,但是无法解决初始化过程中的依赖.可能存在某个指令编译的时候,其依赖的指令还未完成编译.对于这样的超级特殊例子,只有在页面初始化的时候加载脚本和template.

以上就是在整个项目进程中遇到的问题,基本每前进一次都是踩着坑,好多东西都是第一次接触,感觉还是学到了一些东西.可能好多问题的解决方案不是很明确.以上所有问题其他人都遇到过,只要用好搜索引擎,加上自己好好阅读/理解别人的代码.所有问题都可以得到圆满的解决

关于这篇浅谈angular懒加载的一些坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 图像裁剪插件Jcrop的简单使用
May 22 Javascript
js拆分字符串并将分割的数据放到数组中的方法
May 06 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
Mar 04 Javascript
基于jquery实现ajax无刷新评论
Aug 19 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
Oct 26 Javascript
JQuery和PHP结合实现动态进度条上传显示
Nov 23 Javascript
scroll事件实现监控滚动条并分页显示(zepto.js)
Dec 18 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
Feb 28 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
May 01 Javascript
详解Vuex下Store的模块化拆分实践
Jul 31 Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
Apr 14 Javascript
原生js生成图片验证码
Oct 11 Javascript
javascript验证内容为数字以及长度为10的简单实例
Aug 20 #Javascript
js显示动态时间的方法详解
Aug 20 #Javascript
javascript数字验证的实例代码(推荐)
Aug 20 #Javascript
javascript之IE版本检测超简单方法
Aug 20 #Javascript
基于JavaScript Array数组方法(新手必看篇)
Aug 20 #Javascript
老生常谈JavaScript 正则表达式语法
Aug 20 #Javascript
浅谈时钟的生成(js手写简洁代码)
Aug 20 #Javascript
You might like
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
php提交post数组参数实例分析
2015/12/17 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
php+js实现裁剪任意形状图片
2018/10/31 PHP
PHP验证类的封装与使用方法详解
2019/01/10 PHP
laravel框架如何设置公共头和公共尾
2019/10/22 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
jquery easyui的tabs使用时的问题
2010/03/23 Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
为开发者准备的10款最好的jQuery日历插件
2014/02/04 Javascript
jquery.validate.js插件使用经验记录
2014/07/02 Javascript
jQuery自带的一些常用方法总结
2014/09/03 Javascript
简介JavaScript中的italics()方法的使用
2015/06/08 Javascript
基于javascript实现全屏漂浮广告
2016/03/31 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
python字典DICT类型合并详解
2017/08/17 Python
python自动化测试之DDT数据驱动的实现代码
2019/07/23 Python
python TK库简单应用(实时显示子进程输出)
2019/10/29 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
校园餐饮创业计划书
2014/01/10 职场文书
教师求职自荐信
2015/03/26 职场文书
CSS实现漂亮的时钟动画效果的实例代码
2021/03/30 HTML / CSS
浅谈Web Storage API的使用
2021/06/23 Javascript
解决vue中provide inject的响应式监听
2022/04/19 Vue.js
详解MySQL的内连接和外连接
2023/05/08 MySQL