当前位置: 首页 > news >正文

Webpack loader 的执行机制

Webpack loader 的执行机制是 Webpack 核心功能之一。让我详细解释 loader 的执行顺序和工作原理。

1. Loader 的基本概念

Loader 就像是 Webpack 的"翻译官",负责将各种类型的文件转换为 Webpack 能够处理的 JavaScript 模块。

// webpack.config.js
module.exports = {module: {rules: [{test: /\.css$/,use: ['style-loader', 'css-loader']}]}
};

2. Loader 的执行顺序

2.1 从右到左,从下到上

// 示例 1:数组形式
{test: /\.css$/,use: ['style-loader', // 第三个执行'css-loader',   // 第二个执行  'sass-loader'   // 第一个执行]
}// 示例 2:函数形式
{test: /\.js$/,use: [{loader: 'babel-loader',options: { presets: ['@babel/preset-env'] }},'eslint-loader' // 先执行 eslint-loader,再执行 babel-loader]
}

2.2 执行流程示例

对于 .scss 文件:

{test: /\.scss$/,use: ['style-loader',  // 3. 将 CSS 插入到 DOM'css-loader',    // 2. 将 CSS 转换为 CommonJS'sass-loader'    // 1. 将 SCSS 编译为 CSS]
}

执行顺序:sass-loadercss-loaderstyle-loader

3. Loader 的链式调用

每个 loader 都将前一个 loader 的结果作为输入,形成处理管道:

// 伪代码表示 loader 执行流程
const source = '/* scss source code */';// 1. sass-loader 处理
const cssCode = sassLoader(source);// 2. css-loader 处理  
const jsModule = cssLoader(cssCode);// 3. style-loader 处理
const finalResult = styleLoader(jsModule);

4. Loader 的 pitch 阶段

Loader 实际上有两个执行阶段:

4.1 Normal 阶段(正常阶段)

从右到左执行 loader 函数

4.2 Pitch 阶段(前置阶段)

从左到右执行 loader 的 pitch 方法

// loader 结构
function loader(source) {// normal loader:处理文件内容return transformedSource;
}loader.pitch = function(remainingRequest, previousRequest, data) {// pitch loader:在 normal loader 之前执行// 可以中断 loader 链
};

4.3 Pitch 阶段执行顺序

// webpack 配置
use: ['loader-a', 'loader-b', 'loader-c']// 执行顺序:
// pitch-a → pitch-b → pitch-c → 读取资源 → normal-c → normal-b → normal-a

5. Loader 的类型

5.1 前置 loader (pre)

{enforce: 'pre',test: /\.js$/,loader: 'eslint-loader'
}

5.2 后置 loader (post)

{enforce: 'post', test: /\.js$/,loader: 'babel-loader'
}

5.3 普通 loader (normal)

{test: /\.css$/,loader: 'css-loader' // 默认就是 normal
}

6. 完整的执行顺序

module.exports = {module: {rules: [{enforce: 'pre',test: /\.js$/,loader: 'eslint-loader' // 1. 最先执行},{test: /\.js$/,use: ['babel-loader'] // 3. 然后执行},{enforce: 'post', test: /\.js$/,loader: 'uglify-loader' // 4. 最后执行},{test: /\.css$/,use: ['style-loader', // 6. 执行'css-loader',   // 5. 执行'sass-loader'   // 2. 执行(与 js loader 并行)]}]}
};

7. Loader 的开发示例

了解 loader 执行顺序有助于编写自定义 loader:

// simple-loader.js
module.exports = function(source) {console.log('Normal loader executing');return source + '\n// Processed by simple-loader';
};module.exports.pitch = function(remainingRequest, previousRequest, data) {console.log('Pitch loader executing');// 如果返回内容,会跳过后续 loader// return 'module.exports = "skipped"';
};

总结

  1. 执行方向:normal loader 从右到左,pitch loader 从左到右
  2. 优先级:pre → normal → post
  3. 链式处理:每个 loader 处理前一个 loader 的输出
  4. 可中断:pitch 阶段可以中断 loader 链
  5. 单一职责:每个 loader 只完成一个特定任务

理解 loader 的执行顺序对于优化构建流程和调试构建问题非常重要。

http://www.dtcms.com/a/553936.html

相关文章:

  • 前端基础之《React(6)—webpack简介-图片模块处理》
  • 西格电力绿电直连通信实战指南:5G、工业以太网、光纤核心对比与协议无缝兼容方案
  • 企业网站有哪些功能?淘宝网页版电脑版入口
  • 排序(选择排序、直接插入排序、冒泡排序、二路归并排序)
  • 少儿编程:6-16 岁孩子的思维启蒙与能力进阶之路
  • 10/31作业
  • 前端样式局部作用域:从Scoped到CSS Modules 的完整指南
  • 穆棱建设局网站seo 哪些媒体网站可以发新闻
  • 物联网卡摄像头从前端至后台的实现过程
  • 整合多中心临床试验的转录组与病理切片数据,提出面向晚期非小细胞肺癌免疫治疗疗效预测的解决方案
  • 【计算机网络】考研408计算机网络:传输介质(导向/非导向)考点梳理
  • 网站开发合同适用印花税互联网专业主要学什么
  • iFluor 594 Styramide,水溶性荧光探针
  • 零基础网站建设及维护视频课程东莞有哪些好的网站建设公司
  • (151页PPT)大型制造集团十五五产业数字化转型规划方案(附下载方式)
  • 新能源硬件架构设计前沿:DFX思维如何平衡可靠性、成本与可维护性
  • 跨平台直播美颜sdk集成攻略:Android、iOS与Web的统一方案
  • Go环境搭建(vscode调试)
  • 宜兴做网站哪个好南充市建设局官方网站
  • 网站建设 交单流程wordpress收录
  • STM32的DH11温湿度模块和LED灯的综合实训
  • 模型微调实现案例分析
  • Blender云渲染农场怎么收费?渲一个一分钟的Blender动画需要多少钱?
  • 搜狐登陆password参数逆向
  • 官宣:Ray 正式加入 PyTorch 基金会
  • 惠州网站设计培训什么网站可以接模具做
  • 进入这个网站宽屏网站源码
  • 【学习笔记】强化学习从原理到实践
  • SIMATIC HMI Operator Panels: Unified Comfort Panels西门子面板固件更新下载
  • 张家港网站开发培训广告代理网页设计代码开头