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

Webpack中的自定义 loader 的简单实现

1.loader简单介绍

webpack 中 loader 是用于对模块的源代码进行转换(处理)的插件。例如 webpack 中常见的loader, css-loader、babel-loader。

2.自定义 loader

关于 loader:

  • loader本质上是一个导出为函数的JavaScript模块,即函数;
  • loader runner库会调用这个函数,然后将上一个loader产生的结果或者资源文件传入进去;
  • 自定义 loader函数的接收参数有content(资源文件的内容)、map(sourcemap的数据)、meta(一些元数据);
例如自定义个 loader 并希望打包时指定类型文件能够经过自定义loader 的函数的处理:
自定义一个 hgf-loader01的 loader
const { validate } = require('schema-utils')
const schema = require('../schema/loader01-schema.json')module.exports = function(context) {console.log('testing hgf-custom-loader111111~~~~~~~~~~~~~~~~~~~');// 获取传入 optionsconst options = this.getOptions()validate(schema, options)console.log('hgf-custom-Options~~~~~~~~~~~~~~~~~~', options);return context + 'hgf-custom-loader'
}module.exports.pitch = function() {console.log('testing hgf-custom-loader111111-pitching~~~~~~~~~~~~~~~~~~~');}

3.关于 pitching loader

webpack 的官方文档中有对 pitching loader 的介绍,即自定义 loader 中的 pitch 属性

 4.多 loader 的执行流程、顺序

例如该 webpack 中配置多个 loader进行打包:

const path = require('path')module.exports = {entry: './src/main.js',mode: 'development',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test:/\.js$/i,use: {loader: 'hgf-loader01',options: {parameter1: 'hgf-loader01----parameter1',parameter2: 2222}},enforce: 'pre'},{test:/\.js$/i,use: {loader: 'hgf-loader02'}},{test:/\.js$/i,use: {loader: 'hgf-loader03'}}]},resolveLoader: {modules: ['node_modules', './src/hgf-loader']}
}

loader 的内容

// hgf-loader01
const { validate } = require('schema-utils')
const schema = require('../schema/loader01-schema.json')module.exports = function(context) {console.log('testing hgf-custom-loader111111~~~~~~~~~~~~~~~~~~~');// 获取传入 optionsconst options = this.getOptions()validate(schema, options)console.log('hgf-custom-Options~~~~~~~~~~~~~~~~~~', options);return context + 'hgf-custom-loader'
}module.exports.pitch = function() {console.log('testing hgf-custom-loader111111-pitching~~~~~~~~~~~~~~~~~~~');}// hgf-loader02
module.exports = function(context) {console.log('testing hgf-custom-loader222222~~~~~~~~~~~~~~~~~~~');return context + 'hgf-custom-loader'
}module.exports.pitch = function() {console.log('testing hgf-custom-loader222222-pitching~~~~~~~~~~~~~~~~~~~');}// hgf-loader03module.exports = function(context) {console.log('testing hgf-custom-loader333333~~~~~~~~~~~~~~~~~~~');return context + 'hgf-custom-loader'
}module.exports.pitch = function() {console.log('testing hgf-custom-loader333333-pitching~~~~~~~~~~~~~~~~~~~');}

打包运行结果:

可看到从上往下依次运行 loader 的 pitching loader,再从下往上的运行 loader,pitching loader从上往下运行,可以在 pitching 阶段,传递给 pitch 方法的 data,在执行阶段也会暴露在 this.data 之下,并且可以用于在循环时,捕获并共享前面的信息。

a.webpack 的 resolveLoader 属性

webpack 中通过配置resolveLoader属性,设置 webpack 解析文件的查找来源

b.webpage 的 enforce 属性

webpack 中 loader 的执行顺序默认是从下往上依次执行 loader 对资源文件进行处理,但是 webpack 也提供了 enforce 属性,可以指定 loader 的执行顺序

"pre": 设置第一个执行, "post"设置最后一个执行

例如将上面代码的 loader 改为如下顺序,配置 enforce 属性后,loader 的执行顺序变化

可看出默认从下往上应该为 loader03 →loader02→loader01,配置 enforce 属性后,基于属性配置值进行了 loader 执行顺序的改变。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C#面:ASP.NET MVC 中如何用表单认证?
  • 二叉树高频题目-上-不含树型dp
  • 认知杂谈25
  • Vue3+Ts封装input组件时遇到的问题
  • C#高级进阶---关于插件开发(初版)
  • 在Ubuntu 16.04上安装MongoDB的方法
  • MySQL多表查询,找出包含全部标签的邮件,包含任意标签的邮件
  • 【Go - 特殊导入包方式 . 和 _】
  • mybatis-plus中Swagger 模式和Kotlin 模式是什么?
  • matlab 计算矩阵元素的标准差
  • 条件拼接 - 根据入参生成where条件
  • 15 种高级 RAG 技术 ——从预检索到生成
  • zabbix对接Grafana
  • turtlebot 测试 Gazebo Harmonic ROS Jazzy
  • 新安装的mariadb 对应的my.cnf 对应的配置
  • 深入了解以太坊
  • hexo+github搭建个人博客
  • 【EOS】Cleos基础
  • 【React系列】如何构建React应用程序
  • 【RocksDB】TransactionDB源码分析
  • 30天自制操作系统-2
  • Angular2开发踩坑系列-生产环境编译
  • GitUp, 你不可错过的秀外慧中的git工具
  • happypack两次报错的问题
  • laravel with 查询列表限制条数
  • October CMS - 快速入门 9 Images And Galleries
  • PaddlePaddle-GitHub的正确打开姿势
  • Redis中的lru算法实现
  • 前端之React实战:创建跨平台的项目架构
  • 如何编写一个可升级的智能合约
  • 用mpvue开发微信小程序
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ![CDATA[ ]] 是什么东东
  • # 职场生活之道:善于团结
  • (11)MSP430F5529 定时器B
  • (14)Hive调优——合并小文件
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (备份) esp32 GPIO
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)IOS中获取各种文件的目录路径的方法
  • .chm格式文件如何阅读
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net mvc 获取url中controller和action
  • .NET的微型Web框架 Nancy
  • .NET开发不可不知、不可不用的辅助类(一)
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • :not(:first-child)和:not(:last-child)的用法
  • @EnableWebSecurity 注解的用途及适用场景
  • [ linux ] linux 命令英文全称及解释
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [20171101]rman to destination.txt
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)