loader1、loader的配置和执行顺序

本文深入解析Webpack中Loader的配置方法,包括单个与多个Loader的配置,执行顺序及如何使用行内Loader。探讨了Loader的执行流程,以及如何通过enforce属性调整执行优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

loader的配置

配置单个loader请见上一个文件

配置多个loader

  1. 数组形式
 let path = require('path');

 module.exports = {
  mode:'development',
  entry:'./src/index.js',
  output:{
   filename:'bundle.js',
   path:path.resolve(__dirname,'dist')
  },
  resolveLoader:{
   modules:['node_modules',path.resolve(__dirname,'loaders')]//先在node_modules文件夹下查找,找不到就去后面的loaders路径下查找
  },
  module:{
   rules:[
    {
     test:/\.js$/,
     use:['loader3','loader2','loader1']//loader执行顺序从右向左
    }
   ]
  }
 }
  1. 对象形式
 let path = require('path');

 module.exports = {
  mode:'development',
  entry:'./src/index.js',
  output:{
   filename:'bundle.js',
   path:path.resolve(__dirname,'dist')
  },
  resolveLoader:{
   modules:['node_modules',path.resolve(__dirname,'loaders')]//先在node_modules文件夹下查找,找不到就去后面的loaders路径下查找
  },
  module:{
   rules:[
    {
     test:/\.js$/,
     use:{
      loader:'loader3'
     }
    },
    {
     test:/\.js$/,
     use:{
      loader:'loader2'
     }
    },
    {
     test:/\.js$/,
     use:{
      loader:'loader1'
     }
    }
   ]
  }
 }

loader的执行顺序

  1. 一般情况下,loader的执行顺序为从右往左,从下往上。
  2. 可以通过enforce属性去改变执行顺序。
    • enforce:‘pre’ 前置 权重最高
    • enforce:‘normal’ 不变 权重第二
    • enforce:‘inline’ 行内 权重第三
    • enforce:‘post’ 后置 权重第四
     module:{
    rules:[
    {
     test:/\.js$/,
     use:{
      loader:'loader3'
     },
     enforce:'pre'
    },
    {   
     test:/\.js$/,
     use:{
      loader:'loader2'
     }
    },
    {
     test:/\.js$/,
     use:{
      loader:'loader1'
     }
    }
    ]
    

}
```
>上面的执行顺序就是 loader3、loader1、loader2

行内loader(inline-loader)的使用

 //inline-loader
 function loader(source){
     console.log('inline-loader');
     return source;
 }
 module.exports = loader;

 //a.js
 module.exports = 'yuhua';

 //index.js
 let str = require('inline-loader!./a.js');//这句话的意思就是把a.js的内容导入,并传递到inline-loader,然后require的是inline-loader处理后的结果

重点:let str = require(‘inline-loader!./a.js’);这句话的意思就是把a.js的内容导入,并传递到inline-loader,然后require的是inline-loader处理后的结果

inline-loader的执行顺序举例(重点)

  1. 现在有以下文件
 //webpack.config.js
 module:{
  rules:[
   {
    test:/\.js$/,
    use:{
     loader:'loader3'
    },
    enforce:'pre'
   },
   {
    test:/\.js$/,
    use:{
     loader:'loader2'
    }
   },
   {
    test:/\.js$/,
    use:{
     loader:'loader1'
    }
   }
  ]
 }


 //某某-loader
 function loader(source){
  console.log('某某-loader~~~~~~~~')
  return source;
 }

 module.exports = loader;

 //a.js
 module.exports = 'yuhua';
 //index.js
 let str = require('inline-loader!./a.js')

  1. 执行顺序
  2. 先找到入口文件index.js,对index.js按照loader先后顺序进行loader的处理,先后打印出:
 loader3~~~~~~~~
 loader1~~~~~~~~
 loader2~~~~~~~~
  1. 然后发现index.js中有引入a.js,那么对a.js按照loader先后顺序进行loader的处理,因为a.js是使用inline-loader的,并且引用方式为’inline-loader!./a.js’,所以先后打印出:
 loader3~~~~~~~~
 loader1~~~~~~~~
 loader2~~~~~~~~
 inline-loader~~~~~~~~
  1. 所以总共先后打印顺序为:
 loader3~~~~~~~~
 loader1~~~~~~~~
 loader2~~~~~~~~
 loader3~~~~~~~~
 loader1~~~~~~~~
 loader2~~~~~~~~
 inline-loader~~~~~~~~

inline-loader的前缀符号的含义

  1. 我们一般使用inline-loader的方式为:
 let str = require('inline-loader!./a.js')
  1. 其实,使用inline-loader不止这一种方式,不同的前缀代表不同的意思。
  2. 无前缀:所有类型loader都要处理
 let str = require('inline-loader!./a.js')
  1. -!前缀:不会让文件再去通过pre和normal loader来处理
 let str = require('-!inline-loader!./a.js')
  1. !前缀 不会通过normal loader来处理
 let str = require('!inline-loader!./a.js')
  1. !! 只通过inline-loader来处理
 let str = require('!!inline-loader!./a.js')

loader的组成——pitchLoader和normalLoader

每个loader都由pitchLoader和normalLoader这两部分组成。pitch和normal的执行顺序正好相反,当pitch没有定义或者没有返回值时,会先依次执行pitch在获取资源执行loader,如果定义的某个pitch有返回值则会跳过读取资源和自己的loader

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值