requirejs按需加载angularjs文件实例


Posted in Javascript onJune 08, 2017

之前分享了一篇用ocLazyLoad实现按需加载angular js文件的博客.本来当时想会使用一种方法就行了.可最近刚好有时间,在网上查找了一下requirejs实现angular js文件按需加载的资料.方案如下:

项目的主结构如下图:

requirejs按需加载angularjs文件实例

1.index.html是最外层的页面,页面代码如下:

<!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <title>require angularjs</title>

</head>

<body>

<a href="#module1" rel="external nofollow" >module1</a><br/>

<a href="#module2" rel="external nofollow" >module2</a>

<div style="height: 30px;width: 100px">{{str}}</div>

<div id="container" ui-view></div>

<script data-main="main.js" src="require.js" id="main"></script>

</body>

</html>

2.页面中的script标签中,会首先引用require.js这个文件,然后再去引用main.js这个文件,main.js主要是一些关于require的config信息,代码如下:

var config = {

  baseUrl: './',      //依赖相对路径

  paths: {          //如果某个前缀的依赖不是按照baseUrl拼接这么简单,就需要在这里指出

    domReady:'domReady',

    angular: '../node_modules/angular/angular',

    app:'app',

    router:'../node_modules/angular-ui-router/release/angular-ui-router'

  },

  shim: {           //引入没有使用requirejs模块写法的类库。例如underscore这个类库,本来会有一个全局变量'_'。这里shim等于快速定义一个模块,把原来的全局变量'_'封装在局部,并导出为一个exports,变成跟普通requirejs模块一样

    'router': {

      deps: ['angular'],  //依赖什么模块

       

    },

    'angular': {

      exports: 'angular'

    }

  }

};

require.config(config);

// deps:['webapp']

require(['domReady','app','angular'],function(){

  angular.bootstrap(document, ['webapp'])//这里会去执行app.js这个文件

})

3.接下来进入app.js

/**

 * Created by Administrator on 2016/7/28.

 */

define(['router'], function () {

  var app = angular.module('webapp', ['ui.router']);

  app.config(

    function($stateProvider, $urlRouterProvider) {

      $urlRouterProvider.otherwise('module1');//如果没有指定路由,会默认访问module1

      $stateProvider.

      state('module1', {

        url:"/module1",

        // controller: 'ctr1',      //这里如果写了controller,那么在加载module1.js时,js文件里面的console.log()会运行两次

        templateUrl: 'module1/module1.html',

        resolve: {

          loadCtrl: ["$q", function($q) {

            var deferred = $q.defer();

            //异步加载controller/directive/filter/service

            require([

              'module1/module1'

            ], function() { deferred.resolve(); });

            return deferred.promise;

          }]

        }

      })

      .state("module2",{

        url:"/module2",

        // controller: 'ctr2',

        templateUrl: 'module1/module2.html',

        resolve: {

          loadCtrl: ["$q", function($q) {

            var deferred = $q.defer();

            //异步加载controller/directive/filter/service

            require([

              'module1/module2'

            ], function() { deferred.resolve(); });

            return deferred.promise;

          }]

        }

      })

    });

  app.config(function($controllerProvider,$compileProvider,$filterProvider,$provide){

    app.register = {

      //得到$controllerProvider的引用

      controller : $controllerProvider.register,

      //同样的,这里也可以保存directive/filter/service的引用

      directive: $compileProvider.directive,

      filter: $compileProvider.register,

      service: $provide.service

    };

  })

  return app;

});

4.module1.js代码如下:

define(['app'],function(app){

  app.register

    .controller('ctr1', function($scope){

      $scope.str = 'home page';

      console.log('page1')

    })

})

5.module2.js代码如下:

define(['app'],function(app){

  app.register

    .controller('ctr2',function($scope){

      $scope.str = 'local page';

      console.log('page2')

    })

})

6.module1.html代码如下:

<div ng-controller="ctr1">

这是tp1

<div id="navigator" style="width: 100%;height: 40px;line-height: 40px">

    <a href="http://www.cnblogs.com/" rel="external nofollow" >博客园首页</a>

    <a href="http://www.cnblogs.com/Ricky-Huang/" rel="external nofollow" >Ricky的首页</a>

    <a href="http://i.cnblogs.com/EditPosts.aspx?opt=1" rel="external nofollow" >新随笔</a>

    <a href="http://msg.cnblogs.com/send/Ricky_Huang" rel="external nofollow" >联系我</a>

    <a href="http://www.cnblogs.com/Ricky-Huang/rss" rel="external nofollow" >订阅他</a>

    <a href="http://i.cnblogs.com/" rel="external nofollow" >管理</a>

  </div>

</div>

7.module2.html2代码如下:

<div ng-controller="ctr2">

  这是tp2

  {{str}}

</div>

到了这一步,我们运行index.html文件,我们得到如下效果:(右图是控制台输出)

requirejs按需加载angularjs文件实例

requirejs按需加载angularjs文件实例

点击module2可以尽心正常切换,而且也可以看到js文件确实动态加载了;

注意:module1.js,module1.html,module2.js,module2.html折四个文件全部在module这个文件夹里面

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

Javascript 相关文章推荐
JavaScript CSS修改学习第六章 拖拽
Feb 19 Javascript
用js脚本控制asp.net下treeview的NodeCheck的实现代码
Mar 02 Javascript
Javascript之旅 对象的原型链之由来
Aug 25 Javascript
解决IE6的PNG透明JS插件使用介绍
Apr 17 Javascript
jquery foreach使用示例
Sep 12 Javascript
JavaScript修改css样式style动态改变元素样式
Dec 16 Javascript
js简单实现点击左右运动的方法
Apr 10 Javascript
获取JavaScript异步函数的返回值
Dec 21 Javascript
vue实现表格增删改查效果的实例代码
Jul 18 Javascript
webpack+vue中使用别名路径引用静态图片地址
Nov 20 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
Nov 21 Javascript
原生JavaScript实现的无缝滚动功能详解
Jan 17 Javascript
简单谈谈关于 npm 5.0 的新坑
Jun 08 #Javascript
微信小程序开发之toast提示插件使用示例
Jun 08 #Javascript
jquery实现放大镜简洁代码(推荐)
Jun 08 #jQuery
原生JS发送异步数据请求
Jun 08 #Javascript
vue2 自定义动态组件所遇到的问题
Jun 08 #Javascript
vue.js中过滤器的使用教程
Jun 08 #Javascript
了解VUE的render函数的使用
Jun 08 #Javascript
You might like
PHP函数utf8转gb2312编码
2006/12/21 PHP
php header Content-Type类型小结
2011/07/03 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
自动检查并替换文本框内的字符
2006/06/30 Javascript
JavaScript 数组运用实现代码
2010/04/13 Javascript
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
Javascript面向对象编程
2012/03/18 Javascript
告诉你什么是javascript的回调函数
2014/09/04 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
jquery使用slideDown实现模块缓慢拉出效果的方法
2015/03/27 Javascript
jQuery入门基础知识学习指南
2015/08/14 Javascript
javascript常用经典算法详解
2017/01/11 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
微信小程序实现选项卡功能
2020/06/19 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
jquery实现简单自动轮播图效果
2020/07/29 jQuery
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
[49:20]2014 DOTA2国际邀请赛中国区预选赛5.21 CIS VS TongFu
2014/05/22 DOTA
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
python实现用户登录系统
2016/05/21 Python
python实现决策树分类算法
2017/12/21 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
Pytorch如何切换 cpu和gpu的使用详解
2021/03/01 Python
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
奢华的意大利皮革手袋:Bene Handbags
2019/10/29 全球购物
仓库管理员岗位职责
2014/03/19 职场文书
个人投资计划书
2014/05/01 职场文书
2014年保险公司工作总结
2014/11/22 职场文书
《神奇的鸟岛》教学反思
2016/02/22 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android
python数字图像处理:图像简单滤波
2022/06/28 Python
react中useState使用:如何实现在当前表格直接更改数据
2022/08/05 Javascript