模块化编程:阮一峰 模块化编程

由于一个页面写的js太多了,都写在一个文件中,不好调试。所以我的目标就是如何能把所需的js文件,分割成易于维护的代码块,之间能相互调用方法和属性。虽然采用命名空间也能应付,但是不知道什么才是最好的做法。

看了这一系列文章,感觉是处理模块间的依赖关系。这也确实是需要做的事情,比如使用jquery UI,bootstrap等好用的库时,就需要处理好模块的关系。

javascripts模块化编程(一):模块的写法

一、原始写法:函数的堆积

二、对象写法:会暴露所有的模块成员

三、立即执行函数:不暴露私有成员

四、放大模式:一个模块很大,需要分成几个部分;一个模块需要继承另一个模块

var module1 = (function (mod){
  mod.m3 = function () {
    //...
  };
  return mod;
})(module1);  //module1模块添加了一个新方法m3(),然后返回新的module1模块。分成几部分写的话,从第二部分起,就不用加var了吧?

五、宽放大模式:与"放大模式"相比,就是"立即执行函数"的参数可以是空对象。

var module1 = ( function (mod){
  //...
  return mod;
})(window.module1 || {});

六、全局变量:为了在模块内部调用全局变量,必须显式地将其他变量输入模块

var module1 = (function ($, YAHOO) {
  //...
})(jQuery, YAHOO);   //其实可以传一个对象:module1_argu,包含需要的参数。

  

javascripts模块化编程(二):AMD规范

node使用CommonJS规范,由于它是同步加载,不适合浏览器端,所以在浏览器上使用AMD规范。

AMD也采用require()语句加载模块,但是不同于CommonJS,它要求两个参数:第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback,则是加载成功之后的回调函数。如果将前面的代码改写成AMD形式。

 

问题:server和client不是用同一套规范,不统一呀。

 

Javascript模块化编程(三):require.js的用法

目标:js异步加载,管理模块的依赖关系。

加载:

<script src="js/require.js" defer async="true" ></script>
<script src="js/require.js" data-main="js/main"></script>

主模块的写法:

require(['moduleA', 'moduleB', 'moduleC'], function (moduleA, moduleB, moduleC){
  // some code here
});

模块的加载:

require.config({
  baseUrl: "js/lib",
  paths: {
    "jquery": "jquery.min",
    "underscore": "underscore.min",
    "backbone": "backbone.min"
  }
});  //如果这些模块与main.js不在一个目录时。

AMD模块的写法:

// math.js
  define(function (){
    var add = function (x,y){
      return x+y;
    };
    return {
      add: add
    };
  });

加载非规范的模块:

require.config({
    shim: {

      'underscore':{
        exports: '_'
      },
      'backbone': {
        deps: ['underscore', 'jquery'],
        exports: 'Backbone'
      }
    }
  });

require.config()接受一个配置对象,这个对象除了有前面说过的paths属性之外,还有一个shim属性,专门用来配置不兼容的模块。具体来说,每个模块要定义(1)exports值(输出的变量名),表明这个模块外部调用时的名称;(2)deps数组,表明该模块的依赖性。

 

  

 

posted on 2015-02-01 22:07  j.w  阅读(1228)  评论(0编辑  收藏  举报