angualrjs+AMD规范示例(主要使用requirejs)-实现按需加载 附源码

一、背景说明css

     最近一段时间,一直在研究angularjs及AMD、common规范等。但怎么把angularjs有效的与AMD模块组织结合在一块儿使用,仍是值得深思。html

     本人研究一段时间,为了巩固下研究成果,特地写了一个demo,仅供参考。html5

二、使用技术点说明node

      kendo:主要使用kendo开源一些组件(因为本人对kendo研究比较多)jquery

      angular:angular做为基础框架(MVC、DI、数据绑定、页面路由、相关服务等)webpack

      requireJS:AMD模块加载器angularjs

      bootstrap:主要使用它提供的一些样式web

三、应用APP建立流程npm

     app启动流程以下,json

3.1 bootstrap

     使用angular手动初始化启动angular应用程序,等待页面全部脚本加载完成后,找到html指定节点(默认是根节点),调用api/angular.bootstrap将模板编译成可执行的、数据双向绑定的应用程序

     代码以下,

angular.element(document).ready(function(){
                angular.bootstrap(angular.element("#incidentTest"), ['incident.app.module']);
            });

3.2 AMD模块依赖实现方式

      使用AMD规范实现模块之间的依赖(加载器使用requirejs)。

  这里须要啰嗦二句,有些第三方js库不符合AMD规范,如angularjs,所幸的是requirejs.config中有shim属性,支持非AMD模块加载

      配置代码以下,

require.config({
        //baseUrl: '',
        paths: {
            'angular': "../../../node_modules/angular/angular",
            'kendo': "../../../node_modules/kendo/LICENSE-2.0/kendo.ui.core.min",
            'jquery': "../../../node_modules/jquery/jquery-1.9.1.min"
 
        shim: {
            'angular': {
                deps: ['jquery'],
                exports: "angular"
            },
            'kendo': {
                deps: ['jquery', 'angular']
            }
     }
    });

  AMD模块定义以下,

define(['incidentappeal.module'],function(incidentappealModule){
})

3.3 angular模块依赖实现方式

     使用angularjs提供的依赖注入机制,管理全部模块依赖

  代码以下,

//create ui.module
    angular.module("ui.module",
        [
            "ui.grid",
            'ui.grid.pinning',
            'ui.grid.resizeColumns',
            'ui.grid.saveState',
            'kendo.directives'
        ]);

3.4 模块加载方式

     使用requirejs框架实现对AMD及非AMD模块载入

   代码以下,

 requireIncidentApp(["module.management"], function () {
        //go to app
        requireIncidentApp(['angular', 'incident.app.module'], function (angular) {
        //...
            });
        })
    })

3.5 angular Module中的controller、指令、服务、过滤器实现

  使用angular提供的对应的provider。注入到angular框架体系,根据ui-router提供的resolve属性(若是有不明白resolve这个属性的同窗,能够本身去查查)实现按需加载功能。

  每一个angular模块提供可拓展的register属性(里面包括controller、directive、filter、factory、service),代码以下,

workspaceModule.register={
                    controller:$controllerProvider.register,
                    directive:$compileProvider.directive,
                    filter:$filterProvider.register,
                    factory:$provide.factory,
                    service:$provide.service
                };

     在每一个单独的controller、directive、filter、factory、service中实现本身的注册。代码以下,

workspaceModule.register.controller("workspace",myController);
})

3.6 国际化实现方式

  使用npm 安装angular-translate

  angularjs 国际化模块提供国际化服务,其余模块首先要依赖国际化模块,配置当前模块字条文件(.json),实现对当前模块的国际化。代码以下,

angular.module("incidentcommon.localization.module",
        [
        "pascalprecht.translate",
        'incidentcommon.routeconfig.module'
    ]);
var incidentCommonLocalizationModule = angular.module('incidentcommon.localization.module');

    incidentCommonLocalizationModule.config([
        '$translateProvider',
        'constantRouteConfig'
        ,function (
            $translateProvider,
            constantRouteConfig
        ){
            $translateProvider.useStaticFilesLoader({
                files:[{
                    prefix:constantRouteConfig['translate'].prefix,
                    suffix:constantRouteConfig['translate'].suffix
                }]
            });
            $translateProvider.preferredLanguage(constantRouteConfig['translate'].preferredLanguage);
        }]);

    incidentCommonLocalizationModule.factory('T', ['$translate', function ($translate) {
        var Trans = function (key) {
            if (key) {
                return $translate.instant(key);
            }
            return key;
        };
        return Trans;
    }]);

    return incidentCommonLocalizationModule;

四、UI

4.1 单页面应用(ui-router、state)

     单页面主要使用angular-ui-router技术,在workspace.module中实现。

     ui-router中resolve属性,在view加载以前,angular会先把resolve做为view的一个依赖,按需加载配置的每一个AMD模块,这样,根据用户浏览view的动做按需载入每一个view所须要的依赖,如controller、

     directive、factory等,代码以下,

workspace.left":route.resolve('workspace.left');

  routeConfigs["workspace.left"] ={};
    routeConfigs["workspace.left"].controllerDeps ="";
    routeConfigs["workspace.left"].controller=["workspace/workspace.content.controller"];
    routeConfigs["workspace.left"].url ="workspace/workspace.content.html";

4.2 界面库使用及引入方式

     界面库主要使用kendoui,使用kendo开源控件kendo.ui.core.js。另外加入一些kendo须要收费的控件,如angular-ui(ui-grid/ui-chart/ui-treeview)

  引入方式,代码以下,

angular.module("ui.module",
        [
            "ui.grid",
            'ui.grid.pinning',
            'ui.grid.resizeColumns',
            'ui.grid.saveState',
            'kendo.directives'
        ]);

4.3 样式控制

    css样式直接在html引入,

<!--CSS -->
    <link href="../../styles/bootstrap/bootstrap.min.css" rel="stylesheet" />
   ...
    <link href="../../styles/styles.css" rel="stylesheet" />

4.4 表单验证

   html5/angular/kendo自带的验证方式

五、代码框架结构图

     代码框架结构图以下(这里只是一个简单示意图),

      

六、几个关键点说明

6.1 module.management集中式模块管理的引入

      (1)、为了减小后面模块之间因AMD模块加载顺序致使模块间依赖出现没必要要问题(如循环依赖,固然循环依赖还有其它解决方案)

  (2)、减小AMD模块数量

  (3)、将angualr模块建立及依赖配置放在一个AMD模块中进行管理,更加清晰。

6.2 以view为驱动实现按需加载

  (1)、符合传统web多页面开发思想,每一个view管理本身所依赖的js模块

  (2)、angular-ui-router提供一套完善的注入机制,支持动态加载

  (3)、后面的页面代码都是依赖view的业务去拓展,这些AMD模块会愈来愈多。但进入系统后,有些不经常使用的view通常不操做,致使有些模块的js或许永远都不会被使用,

      这样不须要一次性把全部js文件下载到客户端。

七、缺陷

  一、对打包支持很差。

另外,欢迎各位提出宝贵意见!

demo代码地址

...待续,后面还会介绍一个angular+commonjs规范的demo,依赖webpack打包后才能运行

相关文章
相关标签/搜索