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

对CommonJS、AMD、CMD、ES Module的理解

CommonJS
常用于:服务器端,node,webpack
特点:同步/运行时加载,磁盘读取速度快
语法:

// 1. 导出:通过module.exports或exports来暴露模块  
module.exports = {  
  attr1,  
  attr2  
}  
exports.attr = xx  

注意点
不可以写exports = xxx,这样写会无效,因为更改了exports的地址,而 exports 是 module.exports 的引用指向的是同一个内存,模块最后导出的是 module.exports

// 2. 引用:require('x')  
const xx = require('xx') // 整体重命名  
const { attr } = require('xx') // 解构某一个导出

AMD
常用于:不常用,CommonJs的浏览器端实现
特点:

异步加载:因为面向浏览器端,为了不影响渲染肯定是异步加载
依赖前置:所有的依赖必须写在最初的依赖数组中,速度快,但是会浪费资源,预先加载了所有依赖不管你是否用到
语法:

// 1. 导出:通过define来定义模块  
// 如果该模块还依赖其他模块,则将模块的路径填入第一个参数的数组中  
define(['x'], function(x){  
  function foo(){  
      return x.fn() + 1  
  }  
  return {  
      foo: foo  
  };  
});  
// 2. 引用  
require(['a'], function (a){  
  a.foo()  
});

CMD
常用于:不常用,根据CommonJs和AMD实现,优化了加载方式
特点:

异步加载
按需加载/依赖就近:用到了再引用依赖,方便了开发,缺点是速度和性能较差
语法:

// 1. 导出:通过define来定义模块  
// 如果该模块还依赖其他模块,在用到的地方引用即可  
define(function(){  
  function foo(){  
      var x = require('x')  
      return x.fn() + 1  
  }  
  return {  
      foo: foo  
  };  
});  
// 2. 引用  
var x = require('a');  
a.foo();
ES module
常用于:目前浏览器端的默认标准
特点:静态编译: 在编译的时候就能确定依赖关系,以及输入和输出的变量
语法:

// 1. 导出:通过export 或 export default 输出模块  
// 写法1: 边声明,边导出  
export var m = 1;  
export function m() {};  
export class M {};  

// 写法2:导出一个接口 export {},形似导出对象但不是, 本质上是引用集合,最常用的导出方法  

export {  
  attr1,  
  attr2  
}  

// 写法3:默认导出  

export default fn  

// 2. 引用  
import { x } from 'test.js' // 导出模块中对应的值,必须知道值在模块中导出时的名字  
import { x as myx } from 'test.js' // 改名字  
import x from 'test.js' // 默认导出的引用方式  


注意点
export default在同一个文件中只可存在一个(一个模块只能有一个默认输出)
一个模块中可以同时使用export default 和 export

// 模块 test.js
var info = {  
  name: 'name',  
  age: 18  
}  
export default info  
export var name= '海洋饼干'  
export var age = 18  

// 引用  
import person, {name, age as myAge} from 'test.js'  
console.log(person); // { name: 'name', age: 18 }  
console.log(name+ '=' + myAge); // 海洋饼干=18
 

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

相关文章:

  • JVM之类加载与字节码(二)
  • 安装linux操作系统
  • 【SpringBoot】知识
  • react ant add/change created_at
  • OSPF 动态路由协议 路由传递
  • 5.kubeadm安装
  • 【雕爷学编程】Arduino动手做(180)---Seeeduino Lotus开发板2
  • 6.5 池化层
  • etcd
  • W5500-EVB-PICO做DNS Client进行域名解析(四)
  • 单例模式(C++)
  • LeetCode 热题 100 JavaScript--234. 回文链表
  • Redis 6.5 服务端开启多线程源码
  • 嵌入式面试笔试刷题(day6)
  • 24考研数据结构-第五章:树与二叉树
  • 构建稳健的微服务架构:关键的微服务设计原则和最佳实践
  • 消息队列常见问题(1)-如何保障不丢消息
  • Circle of Mistery 2023牛客暑期多校训练营5 B
  • VC9、VC10、VC11等等各对应什么版本的Visual Studio,以及含义
  • 两数相加 LeetCode热题100
  • Python基础 P2数字类型与优先级进阶练习
  • CAPL通过继电器实现CAN容错性自动化测试
  • elasticsearch 配置用户名和密码
  • 侯捷 C++面向对象编程笔记——9 复合 委托
  • 状态模式——对象状态及其转换
  • Linux一阶段复习
  • 宝塔Linux面板怎么升级?升级命令及失败解决方法
  • 前端面试的性能优化部分(6)每天10个小知识点
  • 2023年 Java 面试八股文(20w字)
  • 银河麒麟服务器ky10-server在线一键安装docker