-
主要配置
javascriptimport path from "path"; const HtmlWebpackPlugin = require("html-webpack-plugin"); module.exports = { entry: "./src/index.js", //入口文件 output: { //出口文件 path: path.resolve(__dirname, "dist"), filename: "bundle.js", }, mode: "development", //模式 // development 开发模式速度块,内置调试工具 // production 生产模式,打包慢,会进行压缩优化 // none 原始模式 plugins: [ //plugin 配置区域 new HtmlWebpackPlugin({ //它是一个类,需要实例化,作用是把html文件处理以及打包到我们的出口 template: path.join(__dirname, "./index.html"), }), ], module: { // loader 配置区域 rules: [ //规则数组 { test: /\.js$/, //匹配需要处理的文件类型 exclude: /node_modules/, //排除目录 include: /src/, //包含目录 use: [ //use多个loader 处理使用数组,单个loader使用字符串或者对象 "style-loader", // 插入 <style> 这里默认配置 "css-loader", // 解析 CSS 这里使用默认配置 { loader: "sass-loader", // 转换 Sass → CSS 手动配置 options: { //loader 需要的参数 loader实现内部 使用 loader-uitls 的 getOptions获取 sourceMap: true, }, }, ], }, ], }, }; -
loader对比plugin
- loader 把不同的文件翻译成webpack 能理解的模块,在文件被导入(import/require)的时候触发;
- plugin是在webpack 的生命周期中做扩展或者优化。
-
手写loader
javascript//一个简单的markdown转html //配置webpack.config { test: /\.md$/, exclude: /node_modules/, use: { loader: path.resolve(__dirname, "loader/md-loader.js"), }, }, // loader/md-loader 文件 import { marked } from 'marked'; export default (source) => { const html = marked.parse(source); return `module.exports = ${JSON.stringify(html)}`; //转出html字符串 }; // index.js使用 import readme from "./readme.md"; //md const div = document.createElement("div"); div.innerHTML = readme; document.body.appendChild(div); -
手写plugin
javascript// 自定义一个构建的时间的监控 // plugin/build-time.js class BuildTimePlugin { constructor(options) { this.options = options; this.startTime = null; } apply(compiler) { //compiler 提供了很多钩子供我们使用 compiler.hooks.beforeRun.tap("BuildTimePlugin", () => { this.startTime = Date.now(); console.log("开始构建..."); }); compiler.hooks.done.tap("BuildTimePlugin", stats => { const endTime = Date.now(); const buildTime = (endTime - this.startTime) / 1000; console.log(`构建完成!耗时: ${buildTime.toFixed(2)}s`); }); } } export default BuildTimePlugin; // webpack.config import BuildTimePlugin from "./plugin/build-time.js"; plugins: [ new HtmlWebpackPlugin({ template: path.join(__dirname, "index.html"), meta: { charset: { charset: "UTF-8" }, //防止乱码 viewport: "width=device-width, initial-scale=1.0", }, }), new BuildTimePlugin(), //构建时间监控 new CleanWebpackPlugin() //自动删除输出目录中的旧文件,确保输出目录只包含最新的构建文件 ], -
webpack运行机制
-
初始化阶段
- 合并命令行参数和配置文件
- 创建Compoler, 核心编译器实例,控制构建的生命周期
- 注册插件(plugin),调用插件的apply方法,挂载到各个钩子上
-
编译阶段
- 入口解析,从entry 出发
- 模块构建
- 读取文件内容
- loader 处理
- AST 分析,webpack内部解析为AST, 分析依赖关系
- 依赖收集,找到所有导出的模块(import/require)
- 递归对于模块进行上述模块构建的步骤
- module.exports.pitch 函数的执行顺序相反
- chunk生成,根据代码分割规则将模块分组到不同的chunk
-
optimization中配置代码分割规则
javascriptoptimization:{ splitChunks: { chunks: 'all', } }
-
-
输出阶段
- 将chunk转换为最终的文件内容
- 将生成的js、css 等写入输出目录
-
-
HMR 热更新
- devServer 启动 注入 HMR runtime
- 页面首次加载建立一个 ws 连接
- webpcak 监听文件变化,会执行变化模块的complier,增量更新,并且推送hash 和 ok 事件
- 浏览器接收到 ok 事件,会拉取更新清单以及更新代码
- 加载更新的模块
- 执行模块的 module.hot.accept() 回调函数
构建工具webpack
开心不就得了2025-10-04 16:19
相关推荐
rgeshfgreh21 分钟前
Spring事务传播机制深度解析Mr -老鬼40 分钟前
Rust适合干什么?为什么需要Rust?Hilaku1 小时前
我用 Gemini 3 Pro 手搓了一个并发邮件群发神器(附源码)IT_陈寒1 小时前
Java性能调优实战:5个被低估却提升30%效率的JVM参数快手技术1 小时前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!颜酱1 小时前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)Mr -老鬼1 小时前
Rust与Go:从学习到实战的全方位对比全栈前端老曹1 小时前
【包管理】npm init 项目名后底层发生了什么的完整逻辑HHHHHY1 小时前
mathjs简单实现一个数学计算公式及校验组件boooooooom1 小时前
Vue3 provide/inject 跨层级通信:最佳实践与避坑指南