<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Webpack on 404_@林达</title>
        <link>https://linsk27.dpdns.org/tags/webpack/</link>
        <description>Recent content in Webpack on 404_@林达</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>404_@林达</copyright>
        <lastBuildDate>Fri, 21 Mar 2025 11:49:00 +0800</lastBuildDate><atom:link href="https://linsk27.dpdns.org/tags/webpack/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Webpack初步接触</title>
        <link>https://linsk27.dpdns.org/p/0321-webpack%E5%88%9D%E6%AD%A5%E6%8E%A5%E8%A7%A6/</link>
        <pubDate>Fri, 21 Mar 2025 11:49:00 +0800</pubDate>
        
        <guid>https://linsk27.dpdns.org/p/0321-webpack%E5%88%9D%E6%AD%A5%E6%8E%A5%E8%A7%A6/</guid>
        <description>&lt;img src="https://linsk27.dpdns.org/p/0321-webpack%E5%88%9D%E6%AD%A5%E6%8E%A5%E8%A7%A6/webpack.png" alt="Featured image of post Webpack初步接触" /&gt;&lt;h1 id=&#34;webpack-初步接触&#34;&gt;Webpack 初步接触
&lt;/h1&gt;&lt;h2 id=&#34;一什么是-webpack&#34;&gt;一、什么是 Webpack？
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Webpack&lt;/strong&gt; 是一个 &lt;strong&gt;静态模块打包工具&lt;/strong&gt;，用于将多个模块、文件和资源进行打包，以便在浏览器中高效加载和运行。&lt;/p&gt;
&lt;h3 id=&#34;核心功能&#34;&gt;核心功能：
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;模块打包&lt;/strong&gt;&lt;br&gt;
整合 JS、CSS、图片等资源，提升代码可维护性和复用性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;依赖管理&lt;/strong&gt;&lt;br&gt;
自动解析模块依赖关系，确保正确加载顺序，降低手动管理复杂度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码转换与优化&lt;/strong&gt;&lt;br&gt;
通过 Loaders 转换代码（如 ES6 → ES5），并优化输出体积。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发支持&lt;/strong&gt;&lt;br&gt;
支持 HMR（热更新）、Source Maps 调试、代码分割等，提升开发效率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生态系统&lt;/strong&gt;&lt;br&gt;
丰富的插件（Plugins）和加载器（Loaders）扩展功能。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二webpack-构建流程&#34;&gt;二、Webpack 构建流程
&lt;/h2&gt;&lt;p&gt;构建过程是&lt;strong&gt;串行&lt;/strong&gt;的，主要分为以下阶段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;初始化参数&lt;/strong&gt;&lt;br&gt;
合并配置文件与命令行参数，生成最终配置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;启动编译&lt;/strong&gt;&lt;br&gt;
初始化 &lt;code&gt;Compiler&lt;/code&gt; 对象，加载插件并调用 &lt;code&gt;run&lt;/code&gt; 方法。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;确定入口&lt;/strong&gt;&lt;br&gt;
根据 &lt;code&gt;entry&lt;/code&gt; 配置定位所有入口文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编译模块&lt;/strong&gt;&lt;br&gt;
递归处理模块依赖：
&lt;ul&gt;
&lt;li&gt;调用 Loaders 转换文件内容（如编译 Sass → CSS）&lt;/li&gt;
&lt;li&gt;解析模块依赖关系，直至所有模块处理完成。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出资源&lt;/strong&gt;&lt;br&gt;
将模块组合为 &lt;strong&gt;Chunk&lt;/strong&gt;，生成最终文件（如 JS/CSS 文件）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写入文件系统&lt;/strong&gt;&lt;br&gt;
根据 &lt;code&gt;output&lt;/code&gt; 配置输出文件到指定路径。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;插件机制&#34;&gt;插件机制
&lt;/h3&gt;&lt;p&gt;Webpack 在构建生命周期广播事件（如 &lt;code&gt;compile&lt;/code&gt;、&lt;code&gt;emit&lt;/code&gt;），插件通过监听事件调用 API 修改输出结果。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三常见-loaders&#34;&gt;三、常见 Loaders
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Loader&lt;/th&gt;
					&lt;th&gt;功能描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;raw-loader&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;导入文件原始内容（如文本文件）。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;file-loader&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;将文件输出到指定目录，返回 URL 路径。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;url-loader&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;小于阈值的文件转为 Base64，否则调用 &lt;code&gt;file-loader&lt;/code&gt;。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;babel-loader&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;转换 ES6+ 代码为向后兼容的 JavaScript。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ts-loader&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;编译 TypeScript 为 JavaScript。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;sass-loader&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;编译 Sass/SCSS 为 CSS。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;css-loader&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;解析 CSS 文件中的 &lt;code&gt;@import&lt;/code&gt; 和 &lt;code&gt;url()&lt;/code&gt;。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;style-loader&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;将 CSS 注入到 DOM 的 &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; 标签中。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;eslint-loader&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;静态检查 JavaScript 代码规范。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;vue-loader&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;处理 Vue 单文件组件（&lt;code&gt;.vue&lt;/code&gt;）。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四常见-plugins&#34;&gt;四、常见 Plugins
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Plugin&lt;/th&gt;
					&lt;th&gt;功能描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;DefinePlugin&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;定义全局常量（如环境变量）。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;HtmlWebpackPlugin&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;自动生成 HTML 文件并注入资源。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;MiniCssExtractPlugin&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;将 CSS 提取为独立文件。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;UglifyJsPlugin&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;压缩 JavaScript 代码。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CleanWebpackPlugin&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;构建前清理输出目录。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;WebpackBundleAnalyzer&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;可视化分析打包体积。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;SpeedMeasurePlugin&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;统计各 Loader/Plugin 的构建耗时。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五loader-与-plugin-的区别&#34;&gt;五、Loader 与 Plugin 的区别
&lt;/h2&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;特性&lt;/th&gt;
					&lt;th&gt;Loader&lt;/th&gt;
					&lt;th&gt;Plugin&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;核心功能&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;转换特定类型文件（如编译 Sass）。&lt;/td&gt;
					&lt;td&gt;扩展 Webpack 功能（如代码压缩、资源注入）。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;使用场景&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;处理单个文件的转换逻辑。&lt;/td&gt;
					&lt;td&gt;监听构建事件，执行全局操作。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;配置方式&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;在 &lt;code&gt;module.rules&lt;/code&gt; 中定义，按文件类型匹配。&lt;/td&gt;
					&lt;td&gt;在 &lt;code&gt;plugins&lt;/code&gt; 数组中实例化，可传入参数。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;实现原理&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;基于函数链式调用处理文件内容。&lt;/td&gt;
					&lt;td&gt;基于 Tapable 事件流，在生命周期钩子中干预构建。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
</description>
        </item>
        
    </channel>
</rss>
