webpack 执行原理

54 阅读1分钟

当我们npm install webpack -g的时候,webpack会在全局注册一个命令,名字为webpack,然后在package.json,写入一下内容,执行npm run build,webpack会检测是否安装webpack-cli,webpack-cli是一个cli工具有提供了一些命令,进行使用。

\

// package.json
"scripts": {
    "build": "webpack"
},

\

webpack本质是个函数,函数接受一个webpackConfig和一个callback,并返回一个Compiler对象,compiler内部提供了一个run函数,用来执行我们的webpack,首先webpack会执行getOptions,判断是否含有mode,webpack会根据mode选项来开启一些内置插件优化,没有则会抛出警告,然后获取入口文件,并根据入口文件,递归得到依赖树,开始进行编译。并向外部广播相应的事件,方便插件进行处理。webpack内部有3个对象需要重点关注

\

  1. Compiler
  2. Compilation
  1. Tapable

\

Compiler是webpack函数返回的一个对象,通过一个class实现,内部接收webpackOptions参数

\

Compilation是webpack每次重新构建产生新的资源生成的

\

Tapable是webpack的事件核心

\

webpack Compiler生命周期

事件描述tapable
entryOption获取入口选项SyncHook
afterPlugins设置初始插件SyncBailHook
afterResolvers
environment
afterEnvironment
beforeRun
run开始编译
watchRun监听模式下执行
normalModuleFactory
contextModuleFactory
beforeCompile
compile产生一次新的编译,即compilation(webpack每次重新触发编译都会生成)
thisCompilation
compilation
make
afterCompile
shouldEmit
needAdditionalPass
emit输出到dist目录之前
afterEmit输出到dist目录之后
done输出完成
failed输出失败
invalid监听模式下,编译无效
watchClose停止监听模式