当前位置: 首页 > news >正文

模块化CommonJS、AMD、CMD、ES6

参考链接:https://juejin.cn/post/6844903576309858318

一、 commonjs(node实现、缓存值(浅拷贝),同步,运行时加载)

同步加载模块

  • module.export
  • require
// 定义模块math.js
var basicNum = 0;
function add(a, b) {return a + b;
}
module.exports = { //在这里写上需要向外暴露的函数、变量add: add,basicNum: basicNum
}// 引用自定义的模块时,参数包含路径,可省略.js
var math = require('./math');
math.add(2, 5);// 引用核心模块时,不需要带路径
var http = require('http');
http.createService(...).listen(3000);

二、AMD(requireJS、异步、回调执行,可依赖其他模块、依赖前置、提前执行)

异步加载,允许指定回调函数所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

  • require.config()指定引用路径等
  • define()定义模块
  • require()加载模块。
/** 网页中引入require.js及main.js **/
<script src="js/require.js" data-main="js/main"></script>/** main.js 入口文件/主模块 **/
// 首先用config()指定各模块路径和引用名
require.config({baseUrl: "js/lib",paths: {"jquery": "jquery.min",  //实际路径为js/lib/jquery.min.js"underscore": "underscore.min",}
});
// 执行基本操作
require(["jquery","underscore"],function($,_){// some code here
});

如果我们定义的模块本身也依赖其他模块,那就需要将它们放在[]中作为define()的第一参数。

// 定义math.js模块
define(function () {var basicNum = 0;var add = function (x, y) {return x + y;};return {add: add,basicNum :basicNum};
});
// 定义一个依赖underscore.js的模块
define(['underscore'],function(_){var classify = function(list){_.countBy(list,function(num){return num > 30 ? 'old' : 'young';})};return {classify :classify};
})// 引用模块,将模块放在[]内
require(['jquery', 'math'],function($, math){var sum = math.add(10,20);$("#sum").html(sum);
});

三、CMD(seajs、异步执行,依赖就近,延迟执行)

它与AMD很类似,不同点在于:AMD 推崇依赖前置、提前执行,CMD推崇依赖就近、延迟执行

/** AMD写法 **/
define(["a", "b", "c", "d", "e", "f"], function(a, b, c, d, e, f) { // 等于在最前面声明并初始化了要用到的所有模块a.doSomething();if (false) {// 即便没用到某个模块 b,但 b 还是提前执行了b.doSomething()} 
});/** CMD写法 **/
define(function(require, exports, module) {var a = require('./a'); //在需要时申明a.doSomething();if (false) {var b = require('./b');b.doSomething();}
});/** sea.js **/
// 定义模块 math.js
define(function(require, exports, module) {var $ = require('jquery.js');var add = function(a,b){return a+b;}exports.add = add;
});
// 加载模块
seajs.use(['math.js'], function(math){var sum = math.add(1+2);
});

四、es6模块加载 (异步执行,可全部、也可以单个加载,输出是值的引用,编译时加载)

异步加载

  • import
  • export
  • export default

差异:

1. CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用
2. CommonJS 模块是运行时加载,ES6 模块是编译时输出接口
3. CommonJS加载的是整个模块,将所有的接口全部加载进来,ES6 Module可以单独加载其中的某个接口;
4. CommonJS 模块模块在首次执行后就会缓存,再次加载只返回缓存结果

http://www.lryc.cn/news/29026.html

相关文章:

  • Python GUI界面编程-初识
  • 【Servlet篇4】cookie和session
  • 考研流程,可以进来转一转(考研你不知道的事情)(详细版)
  • 3.2 LED闪烁流水灯蜂鸣器
  • 刷题笔记3 | 203. 移除链表元素、707设计链表,206.反转链表
  • [一篇读懂]C语言十一讲:单链表的删除和单链表真题实战
  • 【C++初阶】list的使用
  • HTML 布局
  • 如何在虚拟机中安装ikuai软路由系统
  • Java 多线程 --- 线程协作 wait/notify
  • 【PyTorch】教程:torch.nn.Hardsigmoid
  • 【手把手一起学习】(八) Altium Designer 20修改和自定义原理图标题栏
  • 业务流程测试
  • [极客大挑战 2019]EasySQL 1
  • vulnhub raven2复现
  • LeetCode 剑指 Offer II 079. 所有子集
  • 打印名片-课后程序(Python程序开发案例教程-黑马程序员编著-第二章-课后作业)
  • 为什么我们在判断字符串不为null后还要判断字符串长度大于0?
  • javaEE 初阶 — 应用层中的 DNS 协议(域名解析系统)
  • 【网络】-- 网络编程套接字(铺垫、预备)
  • 一文打通@SentinelResource
  • 苹果手机备份的文件在电脑什么地方 苹果备份文件怎么查看
  • 【MySQL速通篇001】5000字超详细介绍MySQL部分重要知识点
  • 并发编程——synchronized优化原理
  • LeetCode 剑指 Offer II 083. 没有重复元素集合的全排列
  • JSONObject与JSONArray使用区别
  • 经典C程序例程:通过进程ID得到文件名
  • 【Java】Spring MVC程序开发
  • leetcode题解-704. 二分查找
  • 2.2 C语言程序的错误条件