Skip to content

Commit 8ddd895

Browse files
author
dddssw
committed
webpack
1 parent cfc246f commit 8ddd895

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

.vitepress/config.mts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ export default defineConfig({
9898
text: "构建工具",
9999
items: [
100100
{ text: "Vite", link: "bundle/vite/initial" },
101-
{ text: "Webpack", link: "/bundle/webpack/treeShaking" },
101+
{ text: "Webpack", link: "/bundle/webpack/webpack" },
102102
],
103103
},
104104
],
@@ -377,6 +377,10 @@ export default defineConfig({
377377
{
378378
text: "webpack",
379379
items: [
380+
{
381+
text: "webpack",
382+
link: "/bundle/webpack/webpack",
383+
},
380384
{
381385
text: "树摇",
382386
link: "/bundle/webpack/treeShaking",

bundle/webpack/webpack.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
---
2+
layout: doc
3+
outline: deep
4+
---
5+
## 流程
6+
* 初始化:读取合并配置信息,加载plugin,实例化compiler
7+
* 编译:从entry出发,针对每个module调用对应的loader去翻译源代码,再找到该module依赖的module,递归的进行编译处理
8+
* 输出:将编译后的module组合成chunk,将chunk转化为文件,输出到文件系统中
9+
## loader
10+
一个loader其实就是一个Node.js模块,这个模块需要导出一个函数,接收原内容,返回处理之后的内容。
11+
12+
由于loader运行在node.js上,所以我们可以调用任意node.js自带的api,或者按照第三方模块进行调用
13+
14+
```js
15+
const { validate } = require('schema-utils'); // 配置验证工具 [4](@ref)
16+
const loaderUtils = require('loader-utils'); // 工具库(Webpack 内置)
17+
18+
// 1. 定义配置的 JSON Schema(用于参数校验)
19+
const schema = {
20+
type: 'object',
21+
properties: {
22+
prefix: { type: 'string' }, // 示例参数
23+
debug: { type: 'boolean' }
24+
},
25+
additionalProperties: false // 禁止额外参数
26+
};
27+
28+
// 2. Loader 主体函数
29+
module.exports = function(source) {
30+
// 异步模式(通过回调返回结果)
31+
const callback = this.async();
32+
33+
// 3. 获取并验证配置项
34+
const options = loaderUtils.getOptions(this) || {};
35+
validate(schema, options, { name: 'My Loader' }); // 校验失败时抛出错误 [4](@ref)
36+
37+
// 4. 处理内容(示例:为文本添加前缀)
38+
let result = source;
39+
if (options.prefix) {
40+
result = options.prefix + result;
41+
}
42+
43+
// 5. 返回结果(支持多种格式)
44+
callback(null, result);
45+
};
46+
47+
// 6. 声明是否处理二进制文件(默认处理文本)
48+
module.exports.raw = false; // 若需处理图片等二进制数据,设为 true [6](@ref)
49+
```
50+
## plugin
51+
* compiler:Webpack的​​全局单例对象​​,代表​​整个构建环境
52+
* compilation:代表一次新的编译

0 commit comments

Comments
 (0)