Angular 结合RequireJs实现模块化开发

angular的指令是模块化很好的一个体现,下面我将只使用指令(不用控制器),结合requirejs,实现模块化开发。

模块化关系图:

传统开发方式

<!--aaa模块-->
<div>
    <h3>this is aaa</h3>
    <input type="text" ng-model="asd">{{asd}}
    <button ng-click="submit()">submit</button>
</div>
<!--bbb模块-->
<div>
    <h3>this is bbb</h3>
    <ul>
        <li ng-repeat="el in list">{{el}}</li>
    </ul>
    <!--ccc模块-->
    <div>
        <h3>this is ccc</h3>
    </div>
</div>

把所有模块写在一起,可读性差,耦合度高,难以维护。

requires+angular模块化开发方式

index.html:

<aaa></aaa>
<bbb></bbb>

主页面干干净净。

aaa

aaa模块包括aaa.js和aaa.html

aaa.html

<div>
    <h3>this is aaa</h3>
    <input type="text" ng-model="asd">{{asd}}
    <button ng-click="submit()">submit</button>
</div>

aaa.js(引入aaa.html,放入模板中,在link中写业务逻辑,service是用来通信的)

define([‘app‘,‘text!./aaa.html‘],function(app,aaa){
    app.directive("aaa", function(service) {
        return {
            restrict: ‘AE‘,
            template: aaa,
            replace: true,
            scope:true,
            link:function(scope,element,attrs){
                scope.submit=function() {
                    service.updateName(scope.asd);
                };
            }
        }
    });
});

封装在一个文件夹里面,随时调用复用:

require([‘./aaa/aaa‘])即可调用aaa模块;

bbb

bbb模块也是两个文件:

bbb.html

<div>
    <h3>this is bbb</h3>
    <ul>
        <li ng-repeat="el in list">{{el}}</li>
    </ul>
    <ccc></ccc>
</div>

bbb.js

define([‘app‘,‘text!./bbb.html‘,‘./ccc/ccc‘],function(app,bbb){
    app.directive(‘bbb‘,function(service){
        return{
            restrict:‘AE‘,
            template:bbb,
            replace:‘true‘,
            scope:true,
            link: function (scope,element,attrs) {
                scope.list=[1,2,3,4];
                scope.$on(‘nameUpdated‘, function() {
                    scope.list.push(service.name);
                });
            }
        }
    });
});

bbb可以和aaa模块通过service通信,bbb还包含ccc(看bbb.html里面有个<ccc></ccc>)

ccc

ccc模块也是两个文件:

ccc.html

<div>
    <h3>this is ccc</h3>
</div>

ccc.js

define([‘app‘,‘text!./ccc.html‘],function(app,ccc){
    app.directive(‘ccc‘,function(){
        return{
            restrict:‘AE‘,
            template:ccc,
            replace:‘true‘,
            scope:true,
            link: function (scope,element,attrs) {
            }
        }
    });
});

三个模块解耦后,很好维护,因为一个文件的代码量不会超过20行,而且还便于复用。可以称为组件式开发。不要小看这个例子,并非玩玩而已,而是真正的工程化开发思路!

最后一起调用(只调用了aaa,bbb,ccc已经在bbb里调用过了),并启动app:

require([‘angular‘,‘./aaa/aaa‘,‘./bbb/bbb‘,‘service‘],function(angular){
        angular.bootstrap(document,[‘app‘]);
    });

最后看下总体目录:

源代码地址

时间: 2024-10-13 20:38:31

Angular 结合RequireJs实现模块化开发的相关文章

使用requireJs进行模块化开发

requireJs使用 requireJs 使用require.js的第一步,是先去官方网站下载最新版本. 下载后,假定把它放在js子目录下面,就可以加载了. <script src="js/require.js"></script> 有人可能会想到,加载这个文件,也可能造成网页失去响应.解决办法有两个,一个是把它放在网页底部加载,另一个是写成下面这样: <script src="js/require.js" defer async=&

JS模块化开发(requireJS)

使用模块化开发的好处: 通过 exports 暴露接口.这意味着不需要命名空间了,更不需要全局变量.这是一种彻底的命名冲突解决方案. 通过 require 引入依赖.这可以让依赖内置,开发者只需关心当前模块的依赖,其他事情 Sea.js/ Require.js 都会自动处理好.对模块开发者来说,这是一种很好的 关注度分离,能让程序员更多地享受编码的乐趣 实现JS模块化开发,目前有两个规范,一个是AMD规范,一个是CMD规范. RequireJS遵循的是AMD规范.AMD推崇依赖前置. SeaJS

模块化开发RequireJS之shim配置

一.shim requirejs使用AMD规范开发,若开发过程中加载非AMD规范js,需要使用requirejs的shim进行配置. shim配置语法为: //配置文件 requirejs.config({ baseUrl: 'js', //默认是main.js所在的文件夹为基准. paths: { jquery: 'jquery-1.12.4.min' //起个别名 }, //关键配置 shim: { //配置方式一:jQuery.CateNav为模块名称,jquery为依赖的js模块 //'

【模块化开发】------requireJS的基本使用------【凡尘】

前言 为了提高代码的复用度,开发人员会按照功能把大量的js代码分成若干文件,这样在多个页面就可以使用同一个文件了.,下面是某个网站的js引用情况 虽然代码的复用度提升了,但是缺点也体现了出来 缺点: 1.网站加载js时会停止其它资源加载,并停止页面渲染(就是我们常说的白屏现象) 2.加载过多的js文件可能造成浏览器假死(浏览器一直在加载,不能进行页面操作) 3.假如文件有依赖关系,就是使用B.js需要先加载A.js,那我们还要小心翼翼的去引入js,不过这么多文件,鬼理得清依赖关系啊 额 ...容

模块化开发(requireJS)

模块化 在前端使用模块化开发,可以将代码根据功能实施模块的划分,每个模块功能(职责)单一,在需要更改对应的功能的时候,只需要对指定的模块进行修改,其他模块不受任何影响. 为什么要进行前端模块化? 达到公共模块的复用 可以很好的解决全局变量污染的问题 可以很好的解决各个功能之间的依赖关系 如何实现前端模块化开发 JavaScript本身不支持模块化开发,但是可以通过一些手段来实现. CommonJS是一个规范,用来规定模块化开发的标准. CommonJS由于一系列的限制,在前端开发当中,并不能很好

前端模块化开发学习之gulp&amp;browserify篇

 随着web应用的发展,前端的比重占得越来越多,编写代码从而也越来越复杂.而通常我们需要将不同功能或者不同模块的代码分开写,最后在html中一起加载,这样做是可以的,但是当你需要进行维护或者是二次开发的时候,你会觉得十分费劲,因为你不知道文件之间复杂的关系,所以我们需要利用一些插件来配合进行模块化的开发. 所谓模块化的开发,写过nodejs的人都知道,文件之间的依赖可以用require()实现,但是浏览器端是不支持这样的依赖形式的,而browserify却可以解决这个问题,再加上gulp这个强大

UC前端‘搭积木’的模块化开发——scrat.js

模块化开发 将模块所需的js\css\img\tmpl维护在一起,一个模块一个目录 js渲染模板 css只关心模块内样式 开发团队心声:"我们希望每次研发新产品不是从零开始,不同团队不同项目之间能有可复用的模块沉淀下来." 模块生态 每个工程有_工程模块_和_生态模块_. 生态模块:基于_component规范_开发,部署到Github上,可以通过命令行工具将Github上的模块安装到工程中使用.比如:jQuery, iscroll, zepto.js, vue.js 安装命令: sc

前端模块化开发的价值

本文发表在<程序员>杂志 2013 年 3 月刊,推荐购买. 前端模块化开发的价值 随着互联网的飞速发展,前端开发越来越复杂.本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发. 恼人的命名冲突 我们从一个简单的习惯出发.我做项目时,常常会将一些通用的.底层的功能抽象出来,独立成一个个函数,比如 function each(arr) { // 实现代码 } function log(str) { // 实现代码 } 并像模像样地把这些函

angular与requireJs构建项目

1.angular模块依赖 angular可以把代码分成若干模块,然后一个模块可以依赖在模块,使用子模块的功能.被依赖的模块需要在本模块之前被加载.如下所示,app模块依赖Module1和Module2模块. var app = angular.module("app",[Module1,Module2]); 2.requireJs 能够使应用异步按需加载模块,管理模块的依赖性.子模块加载完成后,本模块再加载,并且子模块的加载是异步的. 3.按需加载 使用单页面开发时,应用启动时,主模