JavaScript模块化编程

时光毁灭记忆、已成空白 提交于 2020-01-10 17:34:24


说起模块化编程,经常会听到什么CMD、AMD、CommonJS,记录一下自己的理解,虽然自己用得不是很多。

CommonJS

NodeJS就是参照CommonJS规范实现的

// 导出
module.export math = ...
// 引入
var math = require('math');

但是存在一个问题,就是必须等模块导入了,才能继续运行。
这样就非常不适合浏览器,因为如果网速慢,就会一直等待等待,就会出现"假死"的情况。
所以就可以采用异步的方式,这个就是AMD。

AMD

AMD(“Asynchronous Module Definition”),就是“异步模块加载”,就是在引入某一个模块时,写入一个回调函数,等模块加载完成就会执行回调函数。
需要提前下载好require.js,并且在html中引入

// 引入require.js
// html内容
<div>
  <h1>Require Demo 1 -- usage of Require()</h1>
  <button id="contentBtn">Click me</button>
  <p id="messagebox"></p>
</div>
<script
  data-main="js/script/main.js"
  src="js/lib/require.min.js"
  type="text/javascript"
></script>
// 导出一个desc.js的文件
define(function() {
  return {
    decs: 'this js will be request only if it is needed'
  };
});
// 使用,一个main.js的文件
require.config({
paths: {
// 可以引入公共模块
    jquery: '../lib/jquery-3.4.1'
  }
});
require(['jquery'], function($) {
  $(document).on('click', '#contentBtn', function() {
    $('#messagebox').html('You have access Jquery by using require()');
  });
});
require(['../script/desc'], function(desc) {
  alert(JSON.stringify(desc));
});

CMD

CMD是国内发展起来的规范,我觉得和AMD很相似,AMD需要一个require.js,CMD需要一个ses.js

// 定义模块  myModule.js
define(function(require, exports, module) {
// 区别:AMD在引入其他模块,是会回调函数的一个参数,而CMD是在回调函数中引入
  var $ = require('jquery.js');
});
// 加载模块
seajs.use(['myModule.js'], function(my){});

AMD和CMD的区别

1、AMD推崇依赖前置,在定义模块的时候就要声明其依赖的模块
2、CMD推崇就近依赖,只有在用到某个模块的时候再去require
其他几乎所有的区别都是基于其他模块的导入使用所衍生:AMD用户体验好,因为没有延迟,依赖模块提前执行了,CMD性能好,因为只有用户需要的时候才执行的原因

requireJS下载地址
seaJS下载地址

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!