模块化

模块化的目的:

解决命名冲突
依赖管理
提高代码可读性
代码解耦,提高复用性

立即执行函数:

从外部调用模块的时候无法修改没有暴露出来的变量、函数。

var myModule = (function(){
    var var1 = 1;
    var var2 = 2;

    function fn1(){

    }

    function fn2(){

    }

    return {
        fn1: fn1,
        fn2: fn2
    };
})();

CommonJS规范(NodeJS标准,服务器端)

  • 定义模块 根据CommonJS规范,一个单独的文件就是一个模块。每一个模块都是一个单独的作用域,也就是说,在该模块内部定义的变量,无法被其他模块读取,除非定义为global对象的属性
  • 模块输出: 模块只有一个出口,module.exports对象,我们需要把模块希望输出的内容放入该对象
  • 加载模块: 加载模块使用require方法,该方法读取一个文件并执行,返回文件内部的module.exports对象
//模块定义 myModel.js
var name = 'Byron';
function printName(){
    console.log(name);
}
function printFullName(firstName){
    console.log(firstName + name);
}
module.exports = {
    printName: printName,
    printFullName: printFullName
}
//加载模块
var nameModule = require('./myModel.js');
nameModule.printName();

不同的实现对require时的路径有不同要求,一般情况可以省略js拓展名,可以使用相对路径,也可以使用绝对路径,甚至可以省略路径直接使用模块名(前提是该模块是系统内置模块)

AMD规范(异步模块定义,RequireJS标准,浏览器端)

requireJS主要解决两个问题:

  • require()函数在加载依赖的函数的时候是异步加载的,这样浏览器不会失去响应
  • 它指定的回调函数,只有前面的模块都加载成功后,才会运行,解决了依赖性的问题。

语法

  • 定义模块define(id?, dependencies?, factory);

  • id:可选参数,用来定义模块的标识,如果没有提供该参数,则为文 件名(去掉拓展名.js)

  • dependencies:是一个当前模块依赖的模块名称数组

  • factory:工厂方法,模块初始化要执行的函数或对象。如果为函数,它应该只被执行一次。如果是对象,此对象应该为模块的输出值

  • 加载模块require([dependencies], function(){});

  • 第一个参数是一个数组,表示所依赖的模块

  • 第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块

// 定义模块 myModule.js
define(['dependency'], function(){
    var name = 'Byron';
    function printName(){
        console.log(name);
    }
    return {
        printName: printName
    };
});
// 加载模块
require(['myModule'], function (my){
  my.printName(); });

你可能感兴趣的:(模块化)