【webpack学习笔记—3】ES6 Module和CommonJS的3点对比

1. 前言

在开始阅读本文前,建议先阅读下面的两篇文章:

2. 依赖关系的动态与静态

CommonJS是==动态的==: 模块间的依赖关系是在代码运行阶段确定的
ES6 Module是==静态的==: 模块间的依赖关系是在代码编译阶段确定的

二者的这一点不同,显示出的ES6 Module的优点如下:

  • ES6 Module在编译阶段就能确定出模块间的依赖关系,可以排除掉未引用的模块,减小打包资源的体积
  • 静态结构可以保证模块间值传递的类型正确(因为在编译阶段就会检查)
  • CommonJS本质是导入module对象,而ES6 Module导入的是只读变量,减少层级引用编译,效率更高

3. 模块导入的不同

CommonJS导入的模块是原来模块的拷贝,任何操作都不会对原拷贝有影响;而ES6 Module导入的模块是原来模块的只读引用,虽然是只读引用,但是依然可以设计出通过函数方法对原模块的改变:

// Sam.js
export default {
    name : 'sam',
    age : 25, 
    getAge: function() {
        return this.age++
    }
}

// index.js
import Sam from "./Sam.js";
for (let i = 0; i < 3; i++) {
  console.log(Sam.getAge());
}
// 控制台输出
// 25
// 26
// 27

需要注意的是,用ES6 Module导出的变量不可以直接修改,否则会抛出只读错误。

import count from './calculator' // 假设count是被导出导入的一个数字
// count++ // SyntaxError: "count" is read-only

4. 循环引用

这部分我理解还不够深刻,只是简单地记住概念,暂时先做部分记录,欢迎交流
如果使用CommonJS,模块间的循环引用会出现空值,因为它是脚本式地执行下去,如果执行到某一行当时的值未定义,就会获取到类似空的对象等(因为webpack有做判断为空时创建一个空对象{});
而ES6 Module则会在编译时先把各个模块间关系先生成,再声明对应的变量和函数方法等,利用这个特点,可以跟上一节一样,创建出可以循环引用且不为空的结果,方式参考第三点中的方式,其中CommonJS也可以通过如下方式实现引用:
下面来展示第一种情况,当循环引用时,如果使用CommonJS会怎么样:

// index.js
1 > require('./A.js')

// A.js
2 > const B = require('./B.js')
3 > console.log('value of B: ', B)
4 > module.exports = 'This is A !'

// B.js
5 > const A = require('./A.js')
6 > console.log('value of A:', A)
7 > module.exports = 'This is B !'

// 控制台
// value of A:  {}
// value of B:  this is B !
  • 首先会执行第1行index.js中的代码,然后跳转到A.js中执行2的代码,再跳转到B.js中执行5的代码
  • 此时不会再跳回A,而是往下执行6、7的代码。因为是动态执行,此时还没读到4,所以此时的A会因为webpack的处理,被赋予{},依旧是打印内容为空的对象。
  • 执行完6、 7,B.js中的代码执行完毕,回到A.js中,执行3,因为B.js的导出已经被度去过,所以打印了出来,然后再执行4导出文本,代码执行完毕。

内容均为我个人阅读《Webpack实战:入门、进阶与调优》后的回忆总结,这是一本很不错的书,想深入了解webpack的同学可以去看看这本书

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容