Angular-ui-router + oclazyload + requirejs实现资源随route懒加载

本文主要说明在用AngularJS开发web应用中如何实现lazyload,使用AngularJS需要在前端实现路由功能,本文就介绍利用此点实现前端资源的懒加载。

问题

目前大部分AngularJS的应用用requirJS组织模块,但是很多都没有使用lazyload功能,在app.js中启动时将全部依赖加载进来,在模块功能较少,前端资源少的情况下没问题。那么问题来了,依赖资源过多时怎么办?

  1. build时利用grunt-contrib-requirejs提取合并文件,减少http请求,但是存在问题:build后文件大;线上调试不方便,尤其在html2js后问题更明显。
  2. 开发中尽量在原有文件里进行新业务添加,不增加额外的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,强大的多。

时间: 2024-10-27 01:24:04

Angular-ui-router + oclazyload + requirejs实现资源随route懒加载的相关文章

angular懒加载的一些坑

写在前面 最近在工作中接触到angular模块化打包加载的一些内容,感觉中间踩了一些坑,在此标记一下. 项目背景: 项目主要用到angularJs作为前端框架,项目之前发布的时候会把所有的前端脚本打包压缩到一个文件中,在页面初次访问的时候加载,造成页面初始载入缓慢,在此基础上,提出按需加载,即只有当用户访问某个模块的时候,该模块的脚本才会加载. 工具类: 项目使用grunt打包根据AMD规范,使用grunt-contrib-requirejs来压缩合并模块,同时用ocLazyLoad来完成ang

vue+element ui项目总结点(一)select、Cascader级联选择器、encodeURI、decodeURI转码解码、一级mockjs用法、路由懒加载三种方式

不多说上代码: <template> <div class="hello"> <h1>{{ msg }}</h1> <p>Element UI简单Cascader级联选择器使用</p> <el-cascader :options='options' v-model="selectedOptions" @change="handleChange"> </el-

iOS开发UI篇—懒加载

iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 2.使用懒加载的好处: (1)不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 (2)每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 3.代码示例 1 // 2 // YYViewController.m 3

IOS 开发笔记-基础 UI(6)照片浏览器(控件的懒加载)

使用UIImageView.UILabel.UIButton实现一个综合小案例 功能分析 (1)点击箭头切换序号.图片.描述 (2)如果是首张图片,左边箭头不能点击 (3)如果是尾张图片,右边箭头不能点击 步骤分析 (1)搭建UI界面 (2)监听按钮点击 切换序号.图片.描述 1. 界面分析 1> 需要读取或修改的属性的控件 // 序号标签 // 图片 // 图片描述 // 左边按钮 // 右边按钮 2> 需要监听响应事件的对象,需要添加监听方法 // 左边按钮 // 右边按钮 uiimage

iOS开发UI中懒加载的使用方法

1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其getter方法.说的通俗一点,就是在开发中,当程序中需要利用的资源时.在程序启动的时候不加载资源,只有在运行当需要一些资源时,再去加载这些资源. 我们知道iOS设备的内存有限,如果在程序在启动后就一次性加载将来会用到的所有资源,那么就有可能会耗尽iOS设备的内存.这些资源例如大量数据,图片,音频等等,所以我们在使用懒加载的时候一定要注意先判断是否已经有了,如果没有那么再去进行实例化 2.使

iOS开发UI基础—懒加载

iOS开发UI基础-懒加载 1.懒加载基本 懒加载--也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化 2.使用懒加载的好处: (1)不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 (2)每个控件的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 3.代码示例 1 // 2 // YYViewController.m

收藏文章 写的很好 可惜有些还是看看不懂额。。。RequireJS进阶:模块的定义与加载

文 RequireJS进阶:模块的定义与加载 javascript requirejs 两仪 2014年12月01日发布 推荐 4 推荐 收藏 15 收藏,6.9k 浏览 概述 模块不同于传统的脚本文件,它良好地定义了一个作用域来避免全局名称空间污染.它可以显式地列出其依赖关系,并以函数(定义此模块的那个函数)参数的形式将这些依赖进行注入,而无需引用全局变量.RequireJS的模块是模块模式的一个扩展,其好处是无需全局地引用其他模块. RequireJS的模块语法允许它尽快地加载多个模块,虽然

UI控件懒加载问题01

UI 控件懒加载问题: 1, 什么时候使用懒加载加载UI控件? 2, 加载控件的什么属性? 3, 用什么类型的指针修饰控件? code : (ARC) 定义属性, @property(nonatomic,weak) UIButton *customBtn1;   重写getter方法 -(UIButton *)customBtn1{ if (_customBtn1 == nil) { _customBtn1 = [UIButton buttonWithType:UIButtonTypeCusto

前端项目首屏加速 gzip打包 路由懒加载 cdn资源优化

目前主流的Vue, React 等单页项目中 build 把所有开发遇到的代码打包在一起形成一个js和一个css, 服务器请求, 然后加载js, css 等依赖进行渲染. 因此会经常遇到,个人写的项目,打开十分缓慢,需要加载很长时间才能加载完毕. 就算不是白屏,做了loading处理 但还是会很影响体验 排除服务器带宽实在太低, 服务器压力实在太大, 文件的大小是速度的第一影响. gzip打包 gzip打包很好理解. 请求的东西可以通过压缩的方式, 到了客户端再解压 采用nginx即可 配置方案