首页 > 代码库 > 模块化编程:阮一峰 模块化编程

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

由于一个页面写的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="http://www.mamicode.com/js/require.js" defer async="true" ></script><script src="http://www.mamicode.com/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数组,表明该模块的依赖性。

 

  

 

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