详解CommonJS模块与ES6模块

历史上,JS一直没有模块体系,在ES6之前,最主要的是CommonJS和AMD两种。前者用于服务器,后者用于浏览器,ES6在语言标准的层面上实现了模块功能,使用简单,称为浏览器和服务器通用的模块解决方案
CommonJS模块:

上面代码实质上就就是整体加载fs模块,生成一个_fs对象,然后在从这个对象上读取方法,这种加载称为运行时的加载,因为只有运行的时候才会得到这个对象,导致完全没有办法在编译的时候做“静态优化”
ES6模块:

ES6模块不是对象,而是通过export命令显示指定输出的代码,再通过import命令输入

CommonJS模块的特点

  1. 对于基本数据类型,属于复制。即会被模块缓存,如果在另外一个模块导入相同的变量也可以对该变量进行赋值
  2. 对于复杂数据类型,是浅拷贝。由于两个模块引用对象指向同一内存空间,因此对该模块的值作出修改时会影响到另一个模块
  3. 当使用require命令加载某一个模块时,就会运行整个模块的代码
  4. 当使用require命令加载同一个模块的时候,不会再执行该模块,而是取到缓存之中的值,CommonJS模块无论加载多少次,都只会在第一次加载的时候运行一次,以后在加载都是在缓存中取值返回第一次运行的结果,除非手动清除系统缓存
  5. 循环加载时,属于加载时执行。即脚本代码在require的时候就会全部执行,一旦出现某个模块被“循环加载”,就只输出已经执行的部分,还未执行的部分不会输出

es6模块的特点

  1. 静态化,必须定义在顶部,不能使用条件语句,自动采用严格模式
  2. treeshaking(webpack会在打包的时候忽略掉没有用的代码)和编译优化,以及在webpack3中作用域的提升
  3. 外部可以拿到实时的值而不是缓存中的值,是引用而不是拷贝
  4. es6模块中的值是属于动态只读引用
  5. 对于只读来说,就是不能修改引入变量的值,import变量是只读的,无论是基本数据类型还是复杂数据类型,当模块遇到import命令的时候。就会生成一个只读引用。等到脚本真正执行的时候,再根据这个只读引用到被加载的那个模块里面去取值
  6. 对于动态来说,原始值发生变化,import加载的值也发生变化,无论是基本数据类型还是复杂数据类型
  7. 循环加载时,es6模块时动态引用的,只要两个模块之间存在某个引用,代码就能构执行

二者的区别

  1. CommonJS 模块输出的是一个值的拷贝(也就是说,一旦输出一个值,模块内部的变变化影响不到这个值),ES6 模块输出的是值的引用。
  2. CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。

相同点:

都可以对对象内部的属性进行改变

补充(循环加载)

循环加载指的是a脚本执行以来b脚本,b脚本的执行又依赖a脚本,通常,循环加载存在强耦合,如果处理不好还可能导致递归加载,使得程序无法执行,因此应该避免,但是在复杂的大项目会有这种情况,模块加载机制必须考虑循环加载的情况
CommonJS 模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存。
es6模块时动态引用的,只要两个模块之间存在某个引用,代码就能构执行

详解CommonJS模块与ES6模块相关推荐

  1. es6 混合commjs_详谈commonjs模块与es6模块的区别

    到目前为止,已经实习了3个月的时间了.最近在面试,在面试题里面有题目涉及到模块循环加载的知识.趁着这个机会,将commonjs模块与es6模块之间一些重要的的区别做个总结.语法上有什么区别就不具体说了 ...

  2. 关于JavaScript的模块(CommonJS, AMD, CMD, ES6模块)的理解

    Javascript模块化就是解决将代码进行分隔,作用域隔离,模块之间的依赖管理等多个方面问题. 这样的优点不言而喻:1.可维护性2.命名空间私有化,可以避免污染全局环境3.代码重用,通过模块可以方便 ...

  3. 吃透Chisel语言.15.Chisel模块详解(二)——Chisel模块嵌套和ALU实现

    Chisel模块详解(二)--Chisel模块嵌套和ALU实现 稍微复杂点的硬件设计就需要用嵌套的模块层级来构建了,上一篇文章中实现的计数器其实就是个例子,计数器内部嵌套了一个寄存器.一个Mux和一个 ...

  4. python stdout_详解使用python的logging模块在stdout输出的两种方法

    详解使用python的logging模块在stdout输出 前言: 使用python的logging模块时,除了想将日志记录在文件中外,还希望在前台执行python脚本时,可以将日志直接输出到标准输出 ...

  5. python中configparser详解_Python中的ConfigParser模块使用详解

    1.基本的读取配置文件 -read(filename) 直接读取ini文件内容 -sections() 得到所有的section,并以列表的形式返回 -options(section) 得到该sect ...

  6. 一文详解OpenCV中的CUDA模块

    如果您使用OpenCV已有一段时间,那么您应该已经注意到,在大多数情况下,OpenCV都使用CPU,这并不总能保证您所需的性能.为了解决这个问题,OpenCV在2010年增加了一个新模块,该模块使用C ...

  7. python argparse模块详解_python学习之argparse模块

    一.介绍 argparse是python用于解析命令行参数和选项的标准模块,用于代替已经过时的optparse模块.argparse模块的作用是用于解析命令行参数. 我们很多时候,需要用到解析命令行参 ...

  8. python自己创建模块引用失败_详解Python import方法引入模块的实例 Python怎么import自己写的模块...

    python中 import导入模块失败的问题? python中的import引用不了模块我傻,为你傻;我痛,为你痛;深夜里,你是我一种惯性的回忆. 为什么我用from lianxi import*就 ...

  9. node js并发加载页面缓慢_详解如何利用前端Node模块zlib开启gzip压缩使页面加载速度更快...

    前言 这篇文章我们来聊一聊Node的原生模块zlib,它的主要作用是压缩和解压缩数据,我们都知道数据在压缩后可以减小体积,在网络传输时提高传输速度和节约带宽! API用法 zlib这个模块提供了很多的 ...

最新文章

  1. 【LeetCode从零单排】No22.Generate Parentheses
  2. 成功解决matplotlib\cbook\deprecation.py:107: MatplotlibDeprecationWarning: Passing one of 'on', 'true',
  3. XML 和 JSON 的使用场景
  4. mongodb 导出时间格式_MongoDB批量将时间戳转为通用日期格式示例代码 _ 蚂蚁视界...
  5. maven + grunt + tomcat + cmd + sublime
  6. 常州模拟赛d7t2 数组
  7. android游戏开发学习笔之九 (学习书籍 Android游戏编程之从零开始)
  8. Kvaser—灵活多变的CAN总线接口方案
  9. [Android] 安卓迅雷带云盘内测版7.0 简洁 无广告 官方版
  10. 通过tcpdump+wireshark来抓包分析TCP长连接和短连接的区别
  11. 领接矩阵结构的图的遍历(广度和深度遍历)
  12. JavaEE 13个核心规范
  13. 西南大学通信学硕成功上岸,初试专业课113分(专业课最高分)
  14. 赚多多V10自动任务网抢单源码+会员自营版+教程
  15. 从有道云笔记迁移到另一个有道云笔记账号
  16. Glyphs for Mac 2.6.5 — 字体设计工具
  17. 【实战案例】分享6种常用的信用卡欺诈检测算法(附 Python 代码)
  18. 75个顶级开源安全应用
  19. 传奇自定义技能栏技术分享-GEE
  20. IDEA——手把手教你mybatis的使用(新手教程)

热门文章

  1. latexdiff使用
  2. dhl:AjaxPro的使用后感
  3. 黑莓CEO John Chen
  4. ful join关联字段都含null值报错
  5. 领域模型(失血,贫血,充血,胀血)
  6. A star算法的一些研究
  7. java 26个英文字母_java 如何判断是否是26个英文字母
  8. 八股文真的有必要背吗?当代科举考试制度的答案就在这里
  9. 设置: SystemSettings.exe - 系统错误+缓冲区溢出 解决方法
  10. 怎么用计算机算出未来身高,预测一下宝宝未来的身高,用这个公式计算一下你家宝宝有多高...