1. 前言
Angular是一个单页面应用,随着系统的迭代,首屏代码会越来越大,所以需要对《AngularJS入门》中的代码进行改造,实现AngularJS可以按需加载js和css。
实现这个需求,有三个方案:
1、利用requirejs。
requirejs并不是按照angular规范开发的第三方插件,后期估计会有很多坑,放弃。
2、利用ui-router和ocLazyLoad。
- 每次“页面跳转”都要额外请求js并加载,浪费带宽增加页面加载时间,基本抛弃了预加载。
- 每一个路由都需要配置resolve属性,太low。
- 模块化程度太低,不利于以后代码移植和维护。
3、自己写需要的组件。
最好的方案,然而技术要求太高,放弃。
综上,第一种方案坑太多,放弃;第三种方案能力有限,放弃;第二种方案也不好,但是相对容易,而且是针对angular的插件,就它了。
参考文档:
2. 安装依赖
1 2 3 4
| bower install angular#1.5.8 bower install angular-ui-router bower install oclazyload bower install bootstrap
|
3. 核心代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="bower_components/bootstrap/dist/css/bootstrap.min.css"> <style> body{ font-family: "Microsoft Yahei"; } .navigator{ width: 500px;margin: 0 auto } .navigator li{ color: #000;font-size: 14px; } </style> <title>按需加载js</title> </head> <body ng-app="myApp"> <ul class="navigator nav nav-pills"> <li role="presentation" class="active"><a href="#home" ng-click="isActive($event)">主页</a></li> <li role="presentation" class="active"><a href="#page2">Page2</a></li> <li role="presentation" class="active"><a href="#page3" ng-click="isActive($event)">Page3</a></li> </ul> <div ui-view style="width: 500px;margin: 50px auto 0"></div>
<script src="bower_components/angular/angular.min.js"></script> <script src="bower_components/angular-ui-router/release/angular-ui-router.min.js"></script> <script src="bower_components/oclazyload/dist/ocLazyLoad.min.js"></script> <script src="public/js/index.js"></script> </body> </html>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
var myApp=angular.module("myApp",["ui.router","oc.lazyLoad"]); myApp.config(function ($stateProvider,$urlRouterProvider) { $urlRouterProvider.when("","/home");
$stateProvider.state('home',{ url:"/home", templateUrl: 'views/homepage.html', controller: 'homeController', resolve:{ loadMyCtrl:['$ocLazyLoad',function ($ocLazyLoad) { return $ocLazyLoad.load({ name:"homeApp", files:["public/js/homepage.js"] }) }] } });
$stateProvider.state('page2',{ url:"/page2", templateUrl:'views/page2.html', resolve:{ loadMyCtrl:function ($ocLazyLoad) { return $ocLazyLoad.load({ name:'page2App', files:["public/js/page2.js"] }) } } }) $stateProvider.state('page3',{ url:"/page3", templateUrl:'views/page3.html', resolve:{ loadMyCtrl:function ($ocLazyLoad) { return $ocLazyLoad.load({ name:'page3App', files:["public/js/page3.js","public/js/page3-ext.js"] }) } } }) });
|
1 2 3 4 5
| <div id="home" ng-controller="homeController"> <h1>首页</h1> {{content}} </div>
|
1 2 3 4 5 6 7
|
angular.module('myApp').controller('homeController', function ($scope) { $scope.content = '这是主页的内容'; });
|
完整代码github自取:https://github.com/voidking/angulardemo/tree/master/dynamic