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 相关文章推荐
网页常用特效代码整理
Jun 23 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
Mar 17 Javascript
关于eval 与new Function 到底该选哪个?
Apr 17 Javascript
浅析jQuery对select操作小结(遍历option,操作option)
Jul 04 Javascript
关闭浏览器时提示onbeforeunload事件
Dec 25 Javascript
Javascript玩转继承(三)
May 08 Javascript
js实现非常简单的焦点图切换特效实例
May 07 Javascript
JavaScript 对象深入学习总结(经典)
Sep 29 Javascript
jQuery实现的简单拖动层示例
Feb 22 Javascript
Javascript中将变量转换为字符串的三种方法
Sep 19 Javascript
Vue中使用clipboard实现复制功能
Sep 05 Javascript
JavaScript indexOf()原理及使用方法详解
Jul 09 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字符串截取问题
2006/11/28 PHP
解析php安全性问题中的:Null 字符问题
2013/06/21 PHP
php foreach循环中使用引用的问题
2013/11/06 PHP
PHP中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
利用PHP计算有多少小于当前数字的数字方法示例
2020/08/26 PHP
JavaScript 语言的递归编程
2010/05/18 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
iScroll中事件点击触发两次解决方案
2015/03/11 Javascript
JQuery中模拟image的ajaxPrefilter与ajaxTransport处理
2015/06/19 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
angular2 ng build部署后base文件路径问题详细解答
2017/07/15 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
vue项目中引入Sass实例方法
2019/08/27 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
[40:13]Ti4 冒泡赛第二天 iG vs NEWBEE 2
2014/07/15 DOTA
Python搭建FTP服务器的方法示例
2018/01/19 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
根据tensor的名字获取变量的值方式
2020/01/04 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
药学专业大学生自荐信
2013/09/28 职场文书
商务英语专业应届毕业生求职信
2013/10/28 职场文书
个人授权委托书范本格式
2014/10/12 职场文书
因家庭原因离职的辞职信范文
2015/05/12 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
人生哲理妙语30条:淡写流年,笑过人生
2019/09/04 职场文书
golang gopm get -g -v 无法获取第三方库的解决方案
2021/05/05 Golang