【重学webpack系列——webpack5.0】
1-15节主要讲webpack的使用,当然,建议结合《webpack学完这些就够了》一起学习。
从第16节开始,专攻webpack原理和高级API,只有深入原理和高级API,才能学到webpack设计的精髓,从而将技术点运用到实际项目中。
可以点击上方专栏订阅哦。
以下是本节正文:
commonjs与commonjs2的区别
// commonjs
exports.add = function(a, b){
return a + b;
}
// commonjs2
module.exports = {
add(a, b){
return a + b;
}
}
library与libraryTarget
- library为导出库的名称
- libraryTarget为导出结果的形式
- var
- commonjs
- commonjs2
- this
- window
- global
- umd
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-db6MdAKq-1629172313136)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813142617850.png)]](/https://i-blog.csdnimg.cn/blog_migrate/a5e4a311069405073925a483ef9fed78.png)
上面var的模式,在webpack中就会编译成:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Qli4bUO-1629172313139)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813142743917.png)]](/https://i-blog.csdnimg.cn/blog_migrate/fab09972a5366d9e5a7940ded6e8a494.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R8tj20q6-1629172313140)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813143523320.png)]](/https://i-blog.csdnimg.cn/blog_migrate/fed327642f9b39a9a277164fc6b8fd45.png)
(上面最后一条注释请忽略)
如果libraryTarget是commonjs的话,webpack中就会编译成:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3CruM7g5-1629172313143)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813143235125.png)]](/https://i-blog.csdnimg.cn/blog_migrate/92cae1f1e86e138a476ee97d7e7fb66d.png)
**特别注意:**这个图是修改过了,请自行查看编译后的内容,exports.calculator = exports;这是会有问题的,原因是:webpack返回的是module.exports,而不是exports,所以,如果光给exports赋值的话,module.exports还是为初始值,即{},那么引入的时候还是{} —— 这一点也是libraryTarget为commonjs时,会导致的问题!
举个例子:
// a.js
exports = {age: 10}
// Index.js
const obj = require('./a.js')
console.log(obj) // {}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HctxNb5V-1629172313147)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813143550988.png)]](/https://i-blog.csdnimg.cn/blog_migrate/1c98bbb1cf8a7e8ac2f418e6c24134a6.png)
(上面最后一条注释请忽略)
如果libraryTarget是commonjs2的话,webpack中就会编译成:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w0Lj2Mvx-1629172313148)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813143650064.png)]](/https://i-blog.csdnimg.cn/blog_migrate/8ef4012933d561497b7c99fe0b90b42c.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jLeYLSDY-1629172313149)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813143745514.png)]](/https://i-blog.csdnimg.cn/blog_migrate/a2b87dd776c525f4e29e2b4fd7be1fd4.png)
(上面最后一条注释请忽略)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eyWmFOhN-1629172313150)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813143808594.png)]](/https://i-blog.csdnimg.cn/blog_migrate/540e242ea3c79d7f9c97d23de596b00f.png)
注意:webpack返回的是module.exports,而不是exports,所以,如果光给exports赋值的话,module.exports还是为初始值,即{},那么引入的时候还是{} —— 这一点也是libraryTarget为commonjs时,会导致的问题!
举个例子:
// a.js
exports = {age: 10}
// Index.js
const obj = require('./a.js')
console.log(obj) // {}
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UM4k6FWt-1629172313151)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813172005475.png)]](/https://i-blog.csdnimg.cn/blog_migrate/b74709e7af8d124a3b10f68633a399b4.png)
(上面最后一条注释请忽略)
导出的内容会挂载到this上,而这个this=module.exports=exports,所以this就是我们导出的内容
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1nJhvEAE-1629172313152)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813172453783.png)]](/https://i-blog.csdnimg.cn/blog_migrate/612549bb418771558f4c76329d924427.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6KVFgSN8-1629172313153)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813180701012.png)]](/https://i-blog.csdnimg.cn/blog_migrate/70f03df9e4ce1360c30d228f9f72d7ef.png)
(上面最后一条注释请忽略)
window代表导出的内容挂载到window上
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WiXjS32C-1629172313154)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813180739162.png)]](/https://i-blog.csdnimg.cn/blog_migrate/a55785b617dd02f992d64332091a9564.png)
(上面最后一条注释请忽略)
global代表导出的内容挂载到global上
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2LwTwXQD-1629172313155)(C:\Users\yuhua7\AppData\Roaming\Typora\typora-user-images\image-20210813181017005.png)]](/https://i-blog.csdnimg.cn/blog_migrate/53213776250d9ccd096a396360594bb7.png)
(上面最后一条注释请忽略)
umd的话,会根据导出的数据类型,去走不同的逻辑。也就是同时支持commonjs、commonjs2、amd、全局变量等。比如moment这个库用的就是umd
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object') // 如果exports是对象并且commonjs2中的module是对象
module.exports = factory();// commonjs2才有modle
else if(typeof define === 'function' && define.amd)
define([], factory);// 如果define是函数并且define.amd存在,也就是说是amd
else if(typeof exports === 'object')
exports['MyLibrary'] = factory(); // 如果是对象
else
root['MyLibrary'] = factory(); // 全局变量
})(typeof self !== 'undefined' ? self : this, function() {
return _entry_return_;
});
另外:cmd、amd已经退出历史舞台了,淘汰了
本文讲解了Webpack 5.0中CommonJS与CommonJS2的区别,library与libraryTarget的用法,以及针对不同libraryTarget的编译差异。重点剖析了如何解决commonjs模式下module.exports初始化问题,并介绍了umd模式的通用性。

2969

被折叠的 条评论
为什么被折叠?



