说明
玩转 webpack 学习笔记
webpack-cli 做的事情
- 引入 yargs,对命令行进行定制
- 分析命令行参数,对各个参数进行转换,组成编译配置项
- 引用webpack,根据配置项进行编译和构建
从 NON_COMPILATION_CMD 分析出不需要编译的命令
webpack-cli 处理不需要经过编译的命令
const { NON_COMPILATION_ARGS } = require("./utils/constants"); const NON_COMPILATION_CMD = process.argv.find(arg => { if (arg === "serve") { global.process.argv = global.process.argv.filter(a => a !== "serve"); process.argv = global.process.argv; } return NON_COMPILATION_ARGS.find(a => a === arg); }); if (NON_COMPILATION_CMD) { return require("./utils/prompt-command")(NON_COMPILATION_CMD, ...process.argv); } })
NON_COMPILATION_ARGS 的内容
webpack-cli 提供的不需要编译的命令
const NON_COMPILATION_ARGS = [ "init", // 创建一份 webpack 配置文件 "migrate", // 进行 webpack 版本迁移 "add", // 往 webpack 配置文件中增加属性 "remove", // 往 webpack 配置文件中删除属性 "serve", // 运行 webpack-serve "generate-loader", // 生成 webpack loader 代码 "generate-plugin", // 生成 webpack plugin 代码 "info" // 返回与本地环境相关的一些信息 ];
命令行工具包 yargs 介绍
- 提供命令和分组参数
- 动态生成 help 帮助信息
webpack-cli 使用 args 分析
参数分组 (config/config-args.js),将命令划分为9类:
Config options: 配置相关参数(文件名称、运行环境等)
Basic options: 基础参数(entry设置、debug模式设置、watch监听设置、devtool设置)
Module options: 模块参数,给 loader 设置扩展
Output options: 输出参数(输出路径、输出文件名称)
Advanced options: 高级用法(记录设置、缓存设置、监听频率、bail等)
Resolving options: 解析参数(alias 和 解析的文件后缀设置)
Optimizing options: 优化参数
Stats options: 统计参数
options: 通用参数(帮助命令、版本信息等)
通过 convert-argv 组装 options 参数
处理输出的 outputOptions,看 processOptions 函数
实例化 webpack ,将 options 传给 webpack
new 了一个内置的插件 ProgressPlugin,通过有没有 watch 参数去分别执行,最后执行 compilerCallback
webpack-cli 执行的结果
webpack-cli 对配置文件和命令行参数进行转换最终生成配置选项参数 options
最终会根据配置参数实例化 webpack 对象,然后执行构建流程