首页 > Web开发 > 详细

【webpack4x】部分底层原理及手写一个简单打包工具

时间:2019-08-07 21:56:24      阅读:119      评论:0      收藏:0      [点我收藏+]

目录

一、 如何编写一个loader

二、 如何编写一个Plugin

三、 Bundler源码编写(模块分析)

?

一、 如何编写一个loader

1.额外知识点,此处不能是箭头函数,因为我们里面要用到this指向问题,webpack会对里面的this进行变更,去用this调用一些方法

技术分享图片

2. 自己写一个loader

技术分享图片

那么如何使用自己写的loader
技术分享图片

继续加强,可以配置自己的参数
技术分享图片

并通过this.query接收使用
技术分享图片

其他:可以通过this获得很多东西(查阅官方文档)
技术分享图片

官方建议获取参数使用的一种方法
技术分享图片

this.callback(使用比较多)
技术分享图片

return的时候,只能return一个参数,我们写一个等价上面return的语句如下(我们通过它第三个参数可以把整个sourceMap都返回出去)
技术分享图片

3. this.async(),使得有时候我们可以做个异步的处理

技术分享图片

上述写法是错误的,因为代码是从上而下执行的,执行到下面的时候,没有return任何东西,解决办法
技术分享图片

4. 多个loader,配置规则(先使用的放在下面,执行顺序是从下往上执行loader)

技术分享图片

但是上述配置的规则,每次都要匹配路径,继续优化
技术分享图片

通过resolveLoader这个属性,找loader的时候,会先去node_modules找,然后再去loader目录下找,下面使用的loader就可以直接写loader,不再去添加繁琐的路径匹配

5.自定义loader的用武之地

场景1:有时候,我们需要对业务代码做一个异常监控,在外层加上try catch,使得出异常时候,能及时捕获。那么,一种思路是,我们可以实现一个loader,当判断当前是一个function的时候,给他外层包裹上try,catch,使得所有function都运行在try catch中,伪代码例如:
技术分享图片

场景2:文字国际化

技术分享图片

?

二、如何编写一个Plugin

场景: 我们想在打包结束以后,生成一个版权的文件

1. 写一个插件的格式大概如下:

技术分享图片

2. 使用plugin

技术分享图片

3. 参数如何使用

技术分享图片
技术分享图片

4.回到一开始的场景: 当打包结束的时候,往dist目录下放一个版权的文件copyright.txt

技术分享图片

4.1 上述compiler.hooks.emit是一个异步事件,后面使用tapAsync方法,里面传两个参数,第一个参数是插件的名字,第二个参数传的是一个方法, () => {} 该方法有2个参数,第一个参数是complication,第二个参数是一个回调函数cb。

4.2 complication.assets可以看到打包后要输出的文件数,可以往里面添加一个我们要输出的文件。

里面的参数很多(具体看官方文档),这里主要用到2个,一个source表示里面的内容,一个size表示里面内容的大小

4.3 最后,还要调用一下回调函数

5.看一个同步的方法

技术分享图片

6. 插件调试,例如想看下complation.assets里面是否有输出

6.1 添加一个打包命令

技术分享图片

// 详细代码为,传递一些node参数 --inspect表示要开启node调试工具 第二个参数--inspect-brk表示在第一行打个断点
"script": {
"debug": "node --inspect --inspect-brk node_modules/webpack/bin/webpack.js "
}

6.2

技术分享图片

6.3 运行命令,

技术分享图片

打开浏览器
技术分享图片

点击该图标进入调试页面
技术分享图片

?

三、Bundler源码编写(模块分析)

1. 编写代码 bundler.js

技术分享图片
技术分享图片

技术分享图片

2. 装一些插件

技术分享图片
技术分享图片
技术分享图片
技术分享图片

3. 简述上面工作:

  • 3.1 读取了入口文件index.js下面的代码
  • 3.2 使用parser.parse方法,将代码内容转换为一个语法树
  • 3.3 使用traverse对语法树的内容进行分析,把import的内容分析出来,并将结果以key-value的形式保存在一个对象中,key为解析出来的路径,value为处理过后当前项目下的路径
  • 3.4 分析完依赖以后,还吧es6的语法转换成了浏览器可以识别的语法

4. 刚刚只分析了入口文件依赖等信息,接下来的工作是把所有的模块都进行分析,最后得到一个依赖图谱

技术分享图片
技术分享图片

然后console一下graphArray是这样的
技术分享图片

这个图谱不太利于查看,可以再进行下结构转换,放到graph中

5. 接下来写一个可以生成真正可以运行的代码的函数

技术分享图片

【webpack4x】部分底层原理及手写一个简单打包工具

原文:https://www.cnblogs.com/fe-linjin/p/11317718.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!