美文网首页
彻底搞清CommonJS、AMD、CMD...

彻底搞清CommonJS、AMD、CMD...

作者: 唐_银 | 来源:发表于2020-12-25 14:27 被阅读0次

    发展过程

    CommonJS、AMD、CMD、requeir, moudle.exports, exports,import,export...原地爆炸...

    先从时间线上大概对这几种规范有个大致了解

    • 2009 -> CommonJS
    • 2010 -> AMD规范
    • 2011 -> CMD规范
    • 2015 -> ES6 Module

    CommonJS

    CommonJS规范诞生比较早,Mozilla工程师Kevin Dangoo在2009年发起,它出现的目的是希望JS可以运行到更多地方,主要是服务端,前期的nodejs采用了这种规范。

    用法示例

    module.exports或exports负责对外暴漏数据,require来引入

    <!--a.js-->
    module.exports = {
        name: '四大名将'
    }
    <!--也可以用exports导出-->
    <!--export.name = '四大名将'-->
    
    <!--b.js-->
    const res = require('./a.js')
    console.log(res.name) // 四大名将
    
    module.exports 和 exports的区别

    乍一看,还以为CommonJS提供了两种方法来导出数据,其实不然,require并不认识exports,之所以它也好使,那是因为模块内部这些代码的作用。

    var module = {
        exports: {
            <!--导出的内容-->
        }
    }
    
    var exports = module.exports
    return module.exports
    

    require方能看到的只有module.exports这个对象,它是看不到exports这个对象的,而我们在编写模块时用到的exports实际上是对module.exports的引用。

    举个例子
    <!--a.js-->
    exports = {
        name: '四大名将'
    }
    如果这样导出,exports被重新赋值,指向的地址便不再是module.exports,所以此时的exports失去了它的导出功能,只会导出一个默认空对象
    

    AMD (Asynchronous Module Definition)

    AMD规范在2010由requireJS提出,CommonJS规范主要是弥补服务端的模块化机制,不像服务器加载速度很快,客户端加载时需要等待,可能存在假死情况,鉴于浏览器的特殊情况,AMD规范出来了,它采用异步方式加载模块定义的所有依赖,在依赖加载完成后再执行回调函数。

    define([module-name?], [dependencies?], [factory])

    • module-name:字符串,模块名称(可选)
    • dependencies:要载入的依赖模块(可选),数组格式,相对路径
    • factory: 工厂方法,返回一个模块函数
    <!-- 定义模块 -->
    <!-- AMD中require的模块会先加载完成 依赖前置 提前执行 -->
    define('module', ['dep1', 'dep2'], function(dep1, dep2){
      function foo(){
          dep1.doSomething();
          dep2.doSomething();
      }
      return {
        foo : foo
      };
    })
    
    <!-- 数组中声明需要加载的模块,可以是模块名、js文件路径 -->
    <!-- 两个参数:加载的模块,加载成功后的回调函数 -->
    require(['module'], function(module){
        module.foo()
    });
    

    CMD (Common Module Definition)

    CMD规范在2011年由seaJS提出,CMD规范和AMD规范类似,主要区别是CMD规范是就近加载依赖,延迟执行,只有到require时依赖才执行。

    <!-- a.js -->
    define(function(require, exports, module) {
      function foo(){
        <!-- require的模块此时才会执行 依赖就近 延迟执行 而AMD中依赖是前置的 一开始就全都执行完毕了  -->
        var dep1 = require('dep1') 
        dep1.doSomething();
     }
     <!--暴漏给外部调用-->
     exports.foo = foo
     
     /** return或者exports都行
     return {
       foo : foo
     };
     **/
    });
    <!-- b.js -->
    seajs.use("./a", function(a){
      a.foo()
    });
    
    

    ES6 Module

    2015年es6横空出世,引入了新特性 ES Module,诸如export, import等命令。

    es6的module比较常用,贴一个阮一峰的es6链接ES6 Module


    最后,圣诞快乐~

    相关文章

      网友评论

          本文标题:彻底搞清CommonJS、AMD、CMD...

          本文链接:https://www.haomeiwen.com/subject/jeabnktx.html