模块化JavaScript设计模式(一)

在可扩展JavaScript的世界里,如果我们说一个应用程序是模块化(modular)的,那么通常意味着它是由一系列存储于模块中的高度解耦,不同的功能片段组成。在可能的情况下,通过一处依赖性,松耦合可以使应用程序的可维护性更加简单。 如果有效地实现了这点,就很容易地了解一部分如何影响另一个部分。

异步模块定义(AMD)的整体目标是提供模块化的JavaScript解决方案,以便开发者使用。诞生于使用XHR+eval的Dojo开发经验,这种格式的支持者希望能够避免未来的任何解决方案受到过去解决方案缺点的影响。 AMD模块格式本身就是对定义模块的建议,其模块和依赖都将可以进行异步加载。

AMD最开始是CommonJS重模块格式的草案规范,但由于没有达到广泛的一致,这种格式的进一步发展就转移到了amdjs社区(https://github.com/amdjs)。

一、模块入门

关于AMD有两个关键概念是值得我们注意的,他们是用于模块定义的define方法和用于处理依赖加载的require方法。试用一下方法,define用于定义已命名或未命名模块:

define(
    module_id /*可选*/,
    [dependencies] /*可选*/,
    definition function /*function for instantiating the module or object实例化模块或对象的函数*/
)

module_id是一个可选参数,它通常只在非AMD 连接工具被使用时才需要。当遗漏这个参数时,我们称这个模块未匿名的(anonymous)。

当使用这个匿名模块时,模块身份的概念是DRY,以便更容易避免文件名和代码重复。因为代码变得更轻便了,不需要修改代码本身或改变其模块ID,就可以将它很容易地移动到其他位置。

Developers可以仅仅通过使用AMD优化器在多个环境中运行相同的代码,AMD优化器在CommonJS环境(譬如r.js https://github.com/jrburke/r.js/)下工作。

       define ("myModule",  //定义一个module
            ['foo', 'bar'],
            function (foo, bar) { //模块定义函数,依赖foo  bar 作为参数映射到函数上
                //这里创建你的模块
                var myModule = {
                    dostuff: function () {
                        console.log('yay, stuff');
                    }
                };
                return myModule;
            }
       );
       //另外一种定义方式
       define('myModule', ['math', 'graph'], function (math, graph) {
            return {
                plot: function(x, y) {
                    return graph.drawPie(math.randomGrid(x, y));
                }
            }
       });

require通常用于加载顶级JavaScript文件或模块的代码。

//foo bar是两个外部模块,两个模块加载以后输出作为回调函数的参数传入
require(['foo', 'bar'], function (foo, bar) {
    //
    foo.doSomething();
})

动态加载依赖

define(function (require) {
    var isReady = false, foobar;
    require(['foo', 'bar'], function (foo, bar) {
        isReady = true;
        foobar = foo() + bar();
    });
    return {
        isReady: isReady,
        foobar: foobar
    }
})

了解 AMD: 插件

//使用AMD可以加载任意格式的内容
//这种方式可以用于模板依赖,以便在页面加载的时候进行做换肤方面的工作
define(['./templates', 'text!./template.md', 'css!./template.css'], function (templates, template) {
    console.log(templates);
});

虽然在上面的示例重包含css!用于加载css依赖,但这种方法会有一些警告。党css完全被加载时,它不一定完全生效。取决于如何处理创建过程,它也可能使用css作为一个依赖文件而被包含在优化的文件中,因此,在将css作为加载依赖使用的情况下,一定要谨慎。

该示例可以简单看作是requirejs([‘app/myModule‘], function () {}),表明加载器的顶级全局对象被使用。这里演示了如何使用不同的AMD加载器加载顶级模块nahor,通过使用define()函数,如果塔接受了一个本地模块参数,那么所有require([])的示例都适用于curl.js 和 RequireJS这两种类型的加载器。

模块化JavaScript设计模式(一),布布扣,bubuko.com

时间: 2024-08-06 04:20:12

模块化JavaScript设计模式(一)的相关文章

模式(一)javascript设计模式

模式有三种:Architectural Pattern.Design Pattern.Coding Pattern,即:框架模式.设计模式.编程模式.本文主要讲解javascript中的设计模式,好的设计模式能够提高代码的重用性,可读性,使代码更容易的维护和扩展.本文适合有一点javascript基础,对javascript的概念有所了解. 一.单例模式: 单例模式是javascript中最常用的模式,它是将自己的代码放在一个命名空间下,这样的好处是可以减少使用全局变量,在多人协同开发时也能避免

【javascript设计模式】构造器模式、模块模式、单例模式

构造器模式(Constructor) 构造器模式是学习js最早接触的一种,实现主要如下: 1 function myObject(name){ 2 this.name = name; 3 } 4 5 myObect.propotype = function sayName(){ 6 alert(this.name); 7 } 使用的时候需要new一个对象. 1 var myObj = new myObject('hello'); 2 myObj.sayName(); 模块模式(Module) 模

JavaScript设计模式 - 迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示. 迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素 许多浏览器都支持 Javascript 的 Array.prototype.forEach 迭代器可以分为 内部迭代器 和 外部迭代器 一.jQuery 中的迭代器 1 $.each( [1,2,3,4], function (i, n) { 2 console.log( "当

javascript设计模式详解之命令模式

每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某些设计模式不自觉的我们都在使用.只不过没有对应起来罢了.本文就力求以精简的语言去介绍下设计模式这个高大上的概念.相信会在看完某个设计模式之后有原来如此的感慨. 一.基本概念与使用场景: 基本概念: 将请求封装成对象,分离命令接受者和发起者之间的耦合. 命令执行之前在执行对象中传入接受者.主要目的相互

javascript设计模式

javascript设计模式 阅读目录 什么是设计模式 单体模式: 工厂模式: 单例模式 观察者模式(发布订阅模式) 策略模式 模板模式 代理模式 外观模式 设计模式太多了,貌似有23种,其实我们在平时的工作中没有必要特意去用什么样的设计模式,或者你在不经意间就已经用了设计模式当中的一种.本文旨在总结平时相对来说用的比较多的设计模式. 回到顶部 什么是设计模式 百度百科: 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用设计模式是

javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)

类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. 先贴上完成的效果. 实现原理不复杂,在动的一条一条的称之为“窗帘条”或者是“strip”,每一个strip都是一个div,类似于雪碧图的方式将其背景图的位置设置为strip的可视位置,然后用jquery的animate让他们按照一定规律动起来就完成窗帘切换效果了. 为了使用方便,将这个功能作为jq

Javascript设计模式系列三

继承,一个类或对象继承另一个类或对象的三种方法.类式继承.原型式继承.掺元类. 一.类式继承,原型链.Extend函数. <script type="text/javascript"> ////定义Person类 var Person = function (name) { this.name = name; }; Person.prototype.getName = function () { return this.name; }; ////原型链 function A

Javascript设计模式系列二

创建对象的基本模式,一.门户大开型,二.采用下划线来表示属性和方法的私用性,三.使用闭包来创建私用的成员. 一.门户大开型.只能提供公用成员.所有属性和方法都公开的.可访问的.这些共用属性都要使用this关键字来创建. <script type="text/javascript"> ////定义Dog对象 var Dog = function (name, age) { this.name = name; this.age = age; } Dog.prototype.Sa

《Javascript 设计模式》-读书笔记

第七章   设计模式类别 一.设计模式有三种类别 1.创建型模式:专注于处理对象机制.包括:构造器.工厂.抽象.原型.单例.生成器 2.结构型模式:用于找出在不同对象之间建立关系密切的简单方法. 包括:装饰者.外观.享元.适配器.代理 3.行为模式:用于改善或简化系统中不同对象之间的通信.包括:迭代器.中介者.观察者.访问者 第八章   设计模式分类 <Javascript 设计模式>-读书笔记,布布扣,bubuko.com