webpack使用自定义loader

配置的loader也可以改为
 

module:{
        rules:[
               {
                 test:/\.js/,
     use:[
         {
          loader:path.resolve(__dirname,"./loaders/replaceLoader.js"),
           options:{
                             name:'lee'
                           }
         },
         {
                   }
                  ]
                  //使用自己定义的loader
                 
               }
          ]
     }
 }



//通过query就可以拿到name是lee的数据,replaceLoader.js中的内容

module.exports=function(source/*引入的源代码*/){
   return source.replace('dell',this.query.name)//把替换的内容改为loader中定义的内容
  }

编写loader的官网:https://webpack.js.org/api/loader/

//我们自己编写loader,官方提供了loader-util ,帮助我们编写loader
//安装命令
npm i loader-utils --save-dev

// replaceLoader.js中的内容

//引入loader-utils

const loaderUtils= require('loader-utils');
module.exports=function(source/*引入的源代码*/){
   //使用引入的loader
     const options = loaderUtils.getOptions(this)//自动帮我们分析this.query
   return source.replace('dell',options.name)//把替换的内容改为loader中定义的内容
  }

//可以打包运行测试 npm run build

//replaceLoader.js中新配置
使用this.callback,把sourceMap带出去。

this.callback(
  err:error|null,
  content:string|Buffer,
  sourceMap?:SourceMap,
  meta?:any
)
module.exports=function(source/*引入的源代码*/){
   //使用引入的loader
     const options = loaderUtils.getOptions(this)//自动帮我们分析this.query
  //替换这一部分内容 return source.replace('dell',options.name)//把替换的内容改为loader中定义的内容
  this.callback(null,result)//等价于return,要传递源代码出去,return就不好用了,要用calback
  }

异步操作的使用
使用 async

const calback=this.async();//再replaceLoader.js中使用异步要用 
callback(null,/*返回的结果*/)//可以返回多个

//replaceLoader.js中新配置

const loaderUtils=require("loader-utils");
module.exports=function(source){
 const options=loaderUtils.getOptiions(this)
 const callback=this.async();
 setTimeout(()=>{
        const result=source.replace('dell',options.name);
        calback(null,result);
 },1000)
}

//使用异步操作之后打包。 npm run build


//replaceLoader.js中新配置

const loaderUtils=require("loader-utils");
module.exports=function(source){
 return source.replace('lee','world');
}

//使用多个loader
配置的loader也可以改为
 

//replaceLoader.js中新配置

const loaderUtils=require("loader-utils");
module.exports=function(source){
 const options=loaderUtils.getOptiions(this)
 const callback=this.async();
 setTimeout(()=>{
        const result=source.replace('dell',options.name);
        calback(null,result);
 },1000)
}
module:{
        rules:[
               {
                 test:/\.js/,
     use:[
         {
          loader:path.resolve(__dirname,"./loaders/replaceLoader.js"),
           options:{
                             name:'lee'
                           }
         },
                      path.resolve(__dirname,'./loaders/replaceLoaderAsync.js')
         {
                   }
                  ]
                  //使用自己定义的loader
                 
               }
          ]
     }
 }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值