学习一个工具或者库的源码以前,得对一个库进行大概的认识,好比源码的目录结构,如何调试等。属于前置的准备阶段。前端
而webpack是我即vue以后,但愿通读的一个工具库。其实在团队中,本身须要去完成一些技术指标,而相应的技术储备是必不可少的。而就前端工程化领域而言,webpack是避不开的一条路。vue
因此在读源码的同时,但愿能收获更广阔的技术视野,以及以后用到这个东西的时候,知道其原理。node
总历时两个月:每篇文章,将会在最终稿整理完成以后,陆续发送。webpack
本系列基于webpack-4分支,版本4.43.0进行阅读。git
一、在阅读的过程当中,webpack5其实刚出来没多久,对于一些新特性,项目中也会不多用到。咱们能够了解完4的东西以后,再去对比了解5的特性。更加有助于咱们掌握。github
二、对于阅读源码,借鉴资料是必不可少的,网上不少4版本的资料,相对于5来讲,若是版本不一致,容易走弯路。web
// 拉取webpack仓库
git clone https://github.com/webpack/webpack.git
// 切分支
git checkout webpack-4
复制代码
对于一个庞大的开源工程,逐一看代码是不现实的,咱们须要清楚的无非是主流程,以及这个流程完成以后,输出的一些变量值来判断这个流程是干什么的。这种无可避免的须要用到调试工具。chrome
随着vscode逐渐完善debugger模块,目前用vscode来调试node程序已是一件比较轻松的事。npm
新建一个index.js文件。而后在里面写一些简单的逻辑。json
const mergeCache = new WeakMap();
const cachedMerge = (first, second) => { debugger; let innerCache = mergeCache.get(first); if (innerCache === undefined) { innerCache = new WeakMap(); mergeCache.set(first, innerCache); } const prevMerge = innerCache.get(second); if (prevMerge !== undefined) return prevMerge; const newMerge = Object.assign({}, first, second); innerCache.set(second, newMerge); return newMerge; }; cachedMerge(); 复制代码
在.vscode文件夹中,建立launch.json
{
"version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Launch Program", "skipFiles": [ "<node_internals>/**" ], "program": "${workspaceFolder}/index.js" } ] } 复制代码
而后切到调试栏,开启调试
调试例图:
在package.json中的scripts标签中写入debug指令:
"debug": "node --inspect=5858 ./node_modules/webpack/bin/webpack.js --config webpack.pro.js"
复制代码
例图:
修改launch.json文件
{
"version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "debug", "runtimeExecutable": "npm", "runtimeArgs": ["run", "debug"], "port": 5858 } ] } 复制代码
这里有几个重要的概念:
runtimeExecutable:程序的执行器,默认是node,咱们将其改为npm
runtimeArgs:传入执行器的参数。也就是run和debug
port:监听的端口号。由于debug指令中起的端口是5858,因此监听端口5858。
在bin/webpack.js文件中打入debugger断点。
启动调试按钮
进入调试界面:
咱们也能够用chrome来调试代码。
仍是延续上面那个index.js例子。
node --inspect index.js
复制代码
而后打开,chrome://inspect
。
点击Open dedicated DevTools for Node
调试界面
书写debug指令
在package.json中的scripts标签中写入debug指令:
"debug": "node --inspect-brk ./node_modules/webpack/bin/webpack.js --config webpack.pro.js"
复制代码
例图:
–inspect-brk
这个参数是会将断点自动断到第一行。以后只需debugger指令调试便可。
关于调试:调试技巧在日常的工做中也是能够用到的,因为前端会偏向于交互的特性,因此console.log这些我会很经常使用,可是向debug这些,当接触node以后,会发现比console.log实用太多了。因此,这边文章中的调试方式,可适用于大部分场景。
关于webpack:这是第一篇准备篇,但愿是好的开始。但愿本身能产出高质量的东西。
关于公众号:笔者也要开始维护本身的公众号啦,东西分为原创和转载两部分,由于笔者工做忙的缘由,原创尽可能保证两个星期一篇,以源码讨论为主。也但愿本身能把晦涩难懂的东西,写的浅显易懂。