JavaScript 中的模块化

JavaScript 中的模块化 最早的基于立即执行函数,闭包的模块化 const MountClickModule = function(){
  let num = 0;
  const handleClick = ()=>{
    console.log(++num);
  }

  return {
    countClick:()=>{
      document.addEventListener('click',handleClick)
    }
  }
}();

MountClickModule.countClick();

(function(module{
module.say = ()=>{
  console.log(num)  //undefined
  //do something
}
})(MountClickModule);

MountClickModule.say();

这种闭包的坏处:

扩展模块间无法访问私有变量。

强依赖模块导入的顺序,项目变大后不好维护。

AMD 和 CommonJS 模块化JavaScript 应用

AMD 和 CommonJS 是两个互相竞争的标准,均可定义 JavaScript 模块。除了语法和原理的区别之外,主要区别是 AMD 的设计理念是明确基于浏览器,而 CommonJS 的设计是面向通用 JavaScript 环境

使用 AMD 定义模块依赖

AMD 异步模块定义规范制定了定义模块的规则,这样模块和模块的依赖可以被异步加载。这和浏览器的异步加载模块的环境刚好适应(浏览器同步加载模块会导致性能、可用性、调试和跨域访问等问题)。

目前,AMD 最流行的实现是 RequireJS。

  define("alpha", ["require""exports""beta"], function (require, exports, beta{
       exports.verb = function() {
           return beta.verb();
           //Or:
           return require("beta").verb();
       }
   });

AMD 提供名为 aplha 的函数,它接收一下参数:

第一个参数,id,是个字符串。它指的是定义中模块的名字,这个参数是可选的。如果没有提供该参数,模块的名字应该默认为模块加载器请求的指定脚本的名字。

第二个参数,dependencies,是个定义中模块所依赖模块的数组。

第三个参数是初始化模块的工厂函数,该函数接收dependencies作为参数 AMD异步获取依赖,以避免阻塞,如果依赖来自服务器,那么这个过程将花费一些时间,知道依赖全部加载完成后,调用模块的工厂函数,并传入所有的依赖。

可以看出,AMD 有一下几项有点:

异步加载模块,避免阻塞。

自动处理依赖,我们无需考虑模块的引入顺序。

在同一个文件中可以定义多个模块。

CMD

CMD 是 SeaJS 在推广过程中对模块定义的规范化产出,在 CMD 规范中,一个模块就是一个文件。代码的书写格式如下:

define(function (require, exports, module{
  const foo = require('./foo')
  a.doSomething()
  // ...
  const bar = require('./bar'// 依赖可以就近书写
  b.doSomething()
  // do something else
})
CommonJS

AMD 的设计明确基于浏览器,而 CommonJS 的设计是面向通用 JavaScript 环境。CommonJS 目前在 Nodejs 社区中具有最多的用户。CommonJS 使用基于文件的模块,所以每个文件中都只能定义一个模块,CommonJs 提供变量 module,该变量具有属性 exports,通过 exports 很容易扩展属性。最后,module.exports 作为模块的公共接口。

const beta = require('beta');
function alpha(){
    return beta.verb();
    //Or:
    return require("beta").verb();
}

module.exports = alpha;

CommonJS 要求一个文件就是一个模块,文件中的代码就是模块的一部分,所以不需要使用立即执行函数来包装变量,在模块中定义的变量都是安全的再模块中,不会泄露到全局作用域。只有通过 module.exports 对象暴露的对象或函数才可以在函数外部访问 CommonJS 具有以下特点:

基于文件系统。

引入模块时文件同步加载,可以访问模块的公共接口。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfjzw.html