接上篇,angular 實戰(zhàn)部分,angular比較適合spa項目,這里不借助任何seed和構建工具,直接從零搭建,基本的angular項目結構大致包含如下幾個部分:
  1)app.js 入口

  2)index.html html框架頁

  3)lib(vendor)第三方類庫

  4)components 業(yè)務組件

  5)styles/images 靜態(tài)資源部分

1、常規(guī)實現

  創(chuàng)建文件夾demo1,按照上述結構分別創(chuàng)建app.js ,index.html文件,創(chuàng)建lib、components、styles和images文件夾,最終如下圖所示:

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

在此基礎上,我們增加三個業(yè)務組件home,about,contact,并初始化基本代碼如下:

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

核心代碼文件

index.html

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

 1 <!DOCTYPE html>  2 <html lang="en" ng-app="app">  3 <head>  4     <meta charset="UTF-8">  5     <meta name="viewport" content="width=device-width, initial-scale=1.0">  6     <meta http-equiv="X-UA-Compatible" content="ie=edge">  7     <title>demo1</title>  8     <script src="https://cdn.bootcss.com/angular.js/1.6.0/angular.js"></script>  9     <script src="https://cdn.bootcss.com/angular-ui-router/1.0.3/angular-ui-router.js"></script> 10  11     <script src='./app.js'></script> 12     <script src='./components/home/home.controller.js'></script> 13     <script src='./components/about/about.controller.js'></script> 14     <script src='./components/contact/contact.controller.js'></script> 15  16 </head> 17 <body> 18     <div class="nav"> 19         <ul> 20             <li><a ui-sref="home">Home</a></li> 21             <li><a ui-sref="about">About</a></li> 22             <li><a ui-sref="contact">Contact</a></li> 23         </ul> 24     </div> 25     <div class="container"> 26         <div ui-view></div> 27     </div> 28 </body> 29 </html>

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

app.js

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

 1 angular.module('app', ['ui.router'])  2     .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {  3         //默認指向  4         $urlRouterProvider.otherwise('/home');  5   6         $stateProvider.state('home', {  7             url: '/home',  8             templateUrl: './components/home/home.tpl.html',  9             controller: 'HomeController', 10             controllerAs: 'vm' 11  12         }).state('about', { 13             url: '/about', 14             templateUrl: './components/about/about.tpl.html', 15             controller: 'AboutController', 16             controllerAs: 'vm' 17         }).state('contact', { 18             url: '/contact', 19             templateUrl: './components/contact/contact.tpl.html', 20             controller: 'ContactController', 21             controllerAs: 'vm' 22         }) 23  24     }])

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

controller中文件格式一直,tpl為view文件以home模塊為例:

home.controller.js

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

1 angular.module('app') 2     .controller('HomeController', HomeController); 3  4 HomeController.$inject = ['$scope']; 5  6 function HomeController($scope) { 7     console.log("HomeController created successfully!!!"); 8 }

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

home.tpl.html

<h2>Page Home</h2>

對命名做如下規(guī)定,所有文件夾都用小寫,多詞用點號隔開,所有文件都小寫,多詞用點號分割,控制器以.controller.js結尾,類似的有.service.js,.tpl.html,.directive.js,.filter.js等。

最終運行效果如下:

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

上述代碼能正常運行,但是我們發(fā)現一個問題,當前js文件或者說模塊較少,我們引入不會有很大的問題,但是當我們的應用變得很大,文件幾十甚至上百個,如何處理呢,有人說當然使用構建工具了,一個一個引入多慢呢,構建工具當然可以做到批量引入js文件,但是我們還需要考慮按需加載的問題,舉例來說,我們在打開home的時候,about和contact是沒必要加載的,但是按照我們傳統(tǒng)的模式,所有腳本都完成了加載,這首先增加了http請求次數,腳本過多的加載解析也影響瀏覽器的渲染,用戶體驗并不友好,基于此,我們有幾種方式來實現,1、基于requirejs來做,這也是本章內容要講的部分;2、使用webpack分塊打包,實現按需加載,后期看時間會加入對應的文章;3、使用oclazyload(可自行google)。本文就以requirejs來實現一下業(yè)務模塊的按需加載,在此之前首先引入requirejs。

2、引入Requirejs

  RequireJS 是一個JavaScript模塊加載器。它非常適合在瀏覽器中使用,但它也可以用在其他腳本環(huán)境,就像 Rhino and Node。使用RequireJS加載模塊化腳本將提高代碼的加載速度和質量,實現的是AMD規(guī)范,當然類似的還有CMD規(guī)范的實現框架seajs。

  Requirejs中,簡單的說一個文件一個模塊,即是單文件模塊,所以對模塊的加載其實本質上是對文件的加載。

  假設讀者已經了解requirejs的基本使用方式。

  上一節(jié)中,講到了提了一下controller的注冊方式,其中說到了動態(tài)注冊,當然除了controller之外,還有service、directive等都可以實現動態(tài)注冊,這也是我們實現按需加載的基礎,現在對我們的項目做一下修改,增加requirejs配置文件,main.js

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

 1 require.config({  2     paths:{  3         angular:'https://cdn.bootcss.com/angular.js/1.6.0/angular',  4         ui_router:'https://cdn.bootcss.com/angular-ui-router/1.0.3/angular-ui-router',  5         app:'./app'  6          7     },  8     shim:{  9         angular:{exports:'angular'} 10     } 11 }); 12  13 require(['angular','./app','ui_router'],function(angular,app){ 14     angular.element(document).ready(function(){ 15         angular.bootstrap(document,[app.name]); 16     }) 17 })

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

app.js修改如下:

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

 1 define(['angular', 'ui_router'], function (angular) {  2     var app = angular.module('app', ['ui.router'])  3         .config(['$controllerProvider', '$provide', function ($controllerProvider, $provide) {  4             app.register = {  5                 controller: $controllerProvider.register,//動態(tài)注冊controller  6                 factory: $provide.factory//動態(tài)注冊服務  7             }  8         }])  9         .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) { 10             //默認指向 11             $urlRouterProvider.otherwise('/home'); 12  13             $stateProvider.state('home', { 14                 url: '/home', 15                 templateUrl: './components/home/home.tpl.html', 16                 controller: 'HomeController', 17                 controllerAs: 'vm', 18                 resolve: { 19                     deps: loadCtrl(['./components/home/home.controller']) 20                 } 21  22             }).state('about', { 23                 url: '/about', 24                 templateUrl: './components/about/about.tpl.html', 25                 controller: 'AboutController', 26                 controllerAs: 'vm', 27                 resolve: { 28                     deps: loadCtrl(['./components/about/about.controller']) 29                 } 30             }).state('contact', { 31                 url: '/contact', 32                 templateUrl: './components/contact/contact.tpl.html', 33                 controller: 'ContactController', 34                 controllerAs: 'vm', 35                 resolve: { 36                     deps: loadCtrl(['./components/contact/contact.controller']) 37                 } 38             }) 39  40         }]); 41     return app; 42  43  44     function loadCtrl(path_arr) { 45         return ['$q', function ($q) { 46             var defered = $q.defer(); 47             require(path_arr, function () { 48                 defered.resolve(); 49             }); 50  51             return defered.promise; 52  53         }] 54     }; 55 })

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

修改controller注冊方式如下:

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

1 define(['app'], function (app) { 2     app.register.controller('HomeController', HomeController); 3  4     HomeController.$inject = ['$scope']; 5  6     function HomeController($scope) { 7         console.log("HomeController created successfully!!!"); 8     } 9 })

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

最后修改修改index.html中腳本引入方式,以及去掉ng-app指令啟動方式,angular應用啟動已在main.js中通過domready后使用腳本啟動。

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

<!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <meta http-equiv="X-UA-Compatible" content="ie=edge">     <title>demo1</title>     <script src="https://cdn.bootcss.com/require.js/2.3.3/require.js" data-main="./main"></script> </head> <body>     <div>         <ul>             <li><a ui-sref="home">Home</a></li>             <li><a ui-sref="about">About</a></li>             <li><a ui-sref="contact">Contact</a></li>         </ul>     </div>     <div>         <div ui-view></div>     </div> </body> </html>

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

最終運行效果如下,可以看到只有在點擊了對應的菜單時,才加載了對應的controller:

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

由于代碼簡單,注釋很少,有疑問可直接提交。

http://www.cnblogs.com/Johnzhang/p/7197980.html