详解基于angular路由的requireJs按需加载js

最近终于不忙了!!有时间沉淀一下之前学到的angular东东!!

angular路由想必大家已经不陌生了!(陌生的去看我之前那篇手把手教你配置angular路由!)

angular路由作为单页面应用,切换页面的时候都是一个页面,所以切换controller和按需加载控件js就成了大问题!!折腾了我半天啊,angular-route内置的办法也没有解决这个问题,最终我是用requireJs解决的这个问题!!上代码!

1.首先引入requireJs,并且在它的下面用闭包写配置 requirejs(['framework']),这句话的意思是首次进入页面,加载framework

<script src="js/lib/require.min.js"></script>
<script>
  (function () {
    var jsDir = '/js/';
    var jsLibDir = '/js/lib/';
    var jsComponentDir = '/components/';
    var paths = {
      angular: jsLibDir + 'angular.min',
      angularRoute: jsLibDir + 'angular-route.min',
      jquery: jsLibDir + 'jquery.min',
      jQueryMD5: jsLibDir + 'jquery.md5',
      highcharts: jsLibDir + 'highcharts',
      radialProgress: jsLibDir + 'radialProgress',
      d3: jsLibDir + 'd3.min',
      echarts: jsLibDir + 'echarts',
      framework: jsDir + 'framework',
      angularUtil: jsDir + 'angular-util',
      standardDashboard: jsDir + 'standard-dashboard',
      standardConsole: jsDir + 'standard-console',
      standardAmountStatistic: jsDir + 'standard-amount-statistic',
      standardReport: jsDir + 'standard-report',
      standardAdvancedReport: jsDir + 'standard-advanced-report',
      standardExpertAnswer: jsDir + 'standard-expert-answer',
      standardService: jsDir + 'standard-service',
      standardStrategyInform: jsDir + 'standard-strategy-inform',
      standardMember: jsDir + 'standard-member',
      standardSchedule: jsDir + 'standard-schedule',
      standardChannel: jsDir + 'standard-channel',
      standardStrategyMerge: jsDir + 'standard-strategy-merge',
      standardIntegrate: jsDir + 'standard-integrate',
      standardPersonalCenter: jsDir + 'standard-personal-center',
      dateTimePicker: jsComponentDir + 'dateTimePicker/date-time-picker',
      fullCalendar: jsComponentDir + 'fullCalendar/fullcalendar',
      moment: jsComponentDir + 'fullCalendar/moment'
    }; 

    requirejs.config({
      paths: paths,
      shim: {
        angular: {
          exports : 'angular',
          deps: ['jquery']
        },
        angularRoute: {
          deps: ['angular']
        },
        jQueryMD5: {
          deps: ['jquery']
        }
      },
      //urlArgs: "timeStamp=" + (new Date()).getTime()
      //urlArgs: 'v=1.47.1&t=20160719'
    });
    requirejs(['framework']);
  }());
</script>

2.framework.js作为首次加载的js,起到至关重要的作用哈!!定义frameworkApp模块作为主模块,另外加载公共服务utilmodel和ngRoute路由,定义一个resolveController方法,回调函数是requireJs,一会儿会讲到!

//引入模块
var frameworkApp = angular.module('FrameworkApp',['ngRoute', 'utilModule']);
//加载对应的controller
var resolveController = function (names, dependancies) {
  //console.log(names)
  //console.log(dependancies)
  return {
    loadController: ['$q', '$rootScope', function ($q, $rootScope) {
      var defer = $q.defer();
      require(names, function () {
        defer.resolve();
        $rootScope.$apply();
      });
      return defer.promise;
    }]
  };
};

3.配置路由,用resolve方法完成回调,注意回调的是一个list,值是步骤一中定义的模块名称

frameworkApp.config(['$routeProvider', '$controllerProvider', '$provide', '$compileProvider', '$filterProvider',
  function ($routeProvider, $controllerProvider, $provide, $compileProvider, $filterProvider) {
    frameworkApp.register = {
      controller: $controllerProvider.register,
      factory: $provide.factory,
      service: $provide.service,
      filter: $filterProvider.register,
      directive: $compileProvider.directive
    };
    $routeProvider
      .when('/',{
        redirectTo: '/dashboard'
      })
      .when('/dashboard',{
        templateUrl: 'dashboard.html',
        controller: 'DashboardCtrl',
        resolve: resolveController(['standardDashboard', 'd3','radialProgress','highcharts'])
      })
      .when('/console',{
        templateUrl: 'console.html',
        controller: 'ConsoleCtrl',
        resolve: resolveController(['standardConsole'])
      })
      .when('/amountStatistic',{
        templateUrl: 'amount-statistic.html',
        controller: 'amountStatisticCtrl',
        resolve: resolveController(['standardAmountStatistic','highcharts','dateTimePicker'])
      })
      .when('/report',{
        templateUrl: 'report.html',
        controller: 'ReportCtrl',
        resolve: resolveController(['standardReport','dateTimePicker'])
      })
      .when('/advancedReport',{
        templateUrl: 'advanced-report.html',
        controller: 'advancedReportCtrl',
        resolve: resolveController(['standardAdvancedReport','highcharts','dateTimePicker'])
      })
      .when('/expertAnswer',{
        templateUrl: 'expert-answer.html',
        controller: 'expertAnswerCtrl',
        resolve: resolveController(['standardExpertAnswer'])
      })
      .when('/service',{
        templateUrl: 'service.html',
        controller: 'ServiceCtrl',
        resolve: resolveController(['standardService'])
      })
      .when('/strategy-inform',{
        templateUrl: 'strategy-inform.html',
        controller: 'StrategyInformCtrl',
        resolve: resolveController(['standardStrategyInform'])
      })
      .when('/member',{
        templateUrl: 'member.html',
        controller: 'MemberCtrl',
        resolve: resolveController(['standardMember'])
      })
      .when('/schedule',{
        templateUrl: 'schedule.html',
        controller: 'ScheduleCtrl',
        resolve: resolveController(['standardSchedule'])
      })
      .when('/channel',{
        templateUrl: 'channel.html',
        controller: 'ChannelCtrl',
        resolve: resolveController(['standardChannel'])
      })
      .when('/strategy-merge',{
        templateUrl: 'strategy-merge.html',
        controller: 'StrategyMergeCtrl',
        resolve: resolveController(['standardStrategyMerge'])
      })
      .when('/integrate',{
        templateUrl: 'integrate.html',
        controller: 'IntegrateCtrl',
        resolve: resolveController(['standardIntegrate'])
      })
      .when('/personalCenter',{
        templateUrl: 'personal-center.html',
        controller: 'PersonalCenterCtrl',
        resolve: resolveController(['standardPersonalCenter'])
      })
      .otherwise({
        redirectTo: '/error'
      }); 

  }]);

4.大功告成啦~完成controller切换,和js按需加载!!!啦啦啦!

5.有一点我也没解决,在引入echarts的时候,用这种方法就报错了,换成highcharts就可以了,折腾半天啊也没把echarts引进来,不过到是发现,在require生效之前引入echarts的话,是可以的!求大神讲解啊!!

<!-- start build -->
  <script src="js/lib/echarts.js"></script>
  <script src="js/lib/require.min.js"></script> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • JavaScript模块化之使用requireJS按需加载

    模块加载器的概念可能稍微接触过前端开发的童鞋都不会陌生,通过模块加载器可以有效的解决这些问题: JS文件的依赖关系. 通过异步加载优化script标签引起的阻塞问题 可以简单的以文件为单位将功能模块化并实现复用 主流的JS模块加载器有requireJS,SeaJS等,加载器之间可能会因为遵循的规范不同有微妙的差别,从纯用户的角度出发,之所以选requireJS而不是SeaJS主要是因为: 功能实现上两者相差无几,没有明显的性能差异或重大问题. 文档丰富程度上,requireJS远远好于SeaJS

  • angularJS+requireJS实现controller及directive的按需加载示例

    最近因为项目的比较大,需要加载的js文件较多,为了提高首屏页面的加载速度,需要对js文件进行按需加载,然后网上参考了一些资料,自己也深入研究一番之后,实现了按需加载控制器js文件及指令js文件的效果: 思路如下 1.借助ui-router里面的resolve属性来实现预加载 2.需要借助$controllerProvider动态去注册控制器,$compileProvider动态去注册指令 3.需要借助$q来帮助我们实现异步加载,具体步骤如下所示: 1.在我们定义的app(在定义app.confi

  • 探索angularjs+requirejs全面实现按需加载的套路

    在进行有一定规模的项目时,通常希望实现以下目标:1.支持复杂的页面逻辑(根据业务规则动态展现内容,例如:权限,数据状态等):2.坚持前后端分离的基本原则(不分离的时候,可以在后端用模版引擎直接生成好页面):3.页面加载时间短(业务逻辑复杂就需要引用第三方的库,但很可能加载的库和用户本次操作没关系):4,还要代码好维护(加入新的逻辑时,影响的文件尽量少). 想同时实现这些目标,就必须有一套按需加载的机制,页面上展现的内容和所有需要依赖的文件,都可以根据业务逻辑需要按需加载.最近都是基于angula

  • 详解基于angular路由的requireJs按需加载js

    最近终于不忙了!!有时间沉淀一下之前学到的angular东东!! angular路由想必大家已经不陌生了!(陌生的去看我之前那篇手把手教你配置angular路由!) angular路由作为单页面应用,切换页面的时候都是一个页面,所以切换controller和按需加载控件js就成了大问题!!折腾了我半天啊,angular-route内置的办法也没有解决这个问题,最终我是用requireJs解决的这个问题!!上代码! 1.首先引入requireJs,并且在它的下面用闭包写配置 requirejs([

  • 详解JavaScript两个实用的图片懒加载优化方法

    目录 一.方法一 二.方法二 InterSectionObserver 一.方法一 重点: 1.getBoundingClientRect().top > window.innerHeight 图片未出现 2.getBoundingClientRect().top < window.innerHeight 图片出现了 HTML: <ul> ...... <li>2222222222</li> <li>2222222222</li> &

  • 详解RequireJS按需加载样式文件

    样式模块化的好处 RequireJS被设计用来加载JavaScript模块的,可是大家有没有联想到其实样式文件可以进行模块化处理,那么问题来了,RequireJS能不能像加载脚本文件一样来加载样式文件呢? 虽然RequireJS本身没有实现这个功能,但官网推荐了一些常用的插件供我们使用,官网插件插件地址为:http://requirejs.org/docs/plugins.html,同时在github上也有社区大量贡献的插件:https://github.com/jrburke/requirej

  • requirejs按需加载angularjs文件实例

    之前分享了一篇用ocLazyLoad实现按需加载angular js文件的博客.本来当时想会使用一种方法就行了.可最近刚好有时间,在网上查找了一下requirejs实现angular js文件按需加载的资料.方案如下: 项目的主结构如下图: 1.index.html是最外层的页面,页面代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

  • 详解Spring简单容器中的Bean基本加载过程

    本篇将对定义在 XMl 文件中的 bean,从静态的的定义到变成可以使用的对象的过程,即 bean 的加载和获取的过程进行一个整体的了解,不去深究,点到为止,只求对 Spring IOC 的实现过程有一个整体的感知,具体实现细节留到后面用针对性的篇章进行讲解. 首先我们来引入一个 Spring 入门使用示例,假设我们现在定义了一个类 org.zhenchao.framework.MyBean ,我们希望利用 Spring 来管理类对象,这里我们利用 Spring 经典的 XMl 配置文件形式进行

  • 详解Android 教你打造高效的图片加载框架

    1.概述 优秀的图片加载框架不要太多,什么UIL , Volley ,Picasso,Imageloader等等.但是作为一名合格的程序猿,必须懂其中的实现原理,于是乎,今天我就带大家一起来设计一个加载网络.本地的图片框架.有人可能会说,自己写会不会很渣,运行效率,内存溢出神马的.放心,我们拿demo说话,拼得就是速度,奏事这么任性. 关于加载本地图片,当然了,我手机图片比较少,7000来张: 1.首先肯定不能内存溢出,但是尼玛现在像素那么高,怎么才能保证呢?我相信利用LruCache统一管理你

  • 详解vue2路由vue-router配置(懒加载)

    vue路由配置以及按需加载模块配置 1.首先在component文件目录下写俩组件: First.vue: <template> <div>我是第一个页面</div> </template> <script> export default { name: 'first', data () { return { msg: 'Welcome to Your Vue.js App' } } } </script> <!-- Add &

  • 详解React Angular Vue三大前端技术

    一.[React] React(也被称为React.js或ReactJS)是一个用于构建用户界面的JavaScript库.它由Facebook和一个由个人开发者和公司组成的社区来维护. React可以作为开发单页或移动应用的基础.然而,React只关注向DOM渲染数据,因此创建React应用通常需要使用额外的库来进行状态管理和路由,Redux和React Router分别是这类库的例子. 基本用法 下面是一个简单的React在HTML中使用JSX和JavaScript的例子. Greeter函数

随机推荐