美文网首页
webpack基础(四)手写loader

webpack基础(四)手写loader

作者: Viewwei | 来源:发表于2021-01-18 11:29 被阅读0次
  • 为什么需要loader
    因为webpack只支持.js,.json文件,webpack打包其他文件类型会报错。因此需要借助loader来实现打包其他类型的文件。loader可以理解为一种特定类型文件的解析方式。理论上讲,只要有对应的loader,就能解决任何类型的文件
  • loader是什么?
    自定义loader其实是一个函数。这个函数不能是一个箭头函数,这是因为它需要继承this,如果需要使用webpack的方法,那么需要使用webpack的this方法,比如this.version etc这个函数接收一个参数source,source代表匹配到文件的值,是一个字符串
    webpack api 所以关于loader的接口都在这里
  • 简单实现loader
    1. 创建loader文件夹,在文件夹中创建一个replace.js文件
      replace
module.exports = function(source){
    // 把webpack替换成view
//source 代表匹配到文件内容,是字符串
    console.log("query:",this.query);
    // return source.replace("webpack","view")
    return source.replace(this.query.test,"view")
}
/**
 * 自定义loader其实是一个函数
 * 这个函数不能是一个箭头函数,这是因为它需要继承this,如果需要使用webpack的
 * 方法,那么需要使用webpack的this方法,比如this.version etc
 * 这个函数接收一个参数source,source代表匹配到文件的值,是一个字符串
*/
  1. 在webpack中加载loader
   {
                test:/\.js$/,
                use:[
                    {
                   
                        loader:path.resolve(__dirname,"./src/loaders/replace.js"),
                        options:{
                            test:"webpack" //loader传递的参数
                        }
                    },

                ]
            } 

在配置中loader的导入需要导入绝对路径,不然会显示导入失败。如果希望像第三方插件那样导入,那么需要配置resolveLoader 中的modules属性

  resolveLoader:{
        modules:["./node_modules","./src/loaders"] //这句话的意思是,loader首先从node_modules下面找,如果找不到在到./src/loadersloader下面找
    },

配置好了之后,把webpack修改为下面所示

 {
                test:/\.js$/,
          
                use:[
                    {
                        loader:"replace",
                        options:{
                            test:"webpack"
                        }
                    },
                ]
            } 

如果一个匹配项需要多个loader,那么需要添加创建多个loader。

  • 注意:需要注意loader的顺序,先后在前的原则
  • 简单介绍几个webpack api方法
  • this.callback:表示返回特定格式的参数,可以使用在异步模式
module.exports = function (source) {
  //source
  //   console.log(this.query);
  //   ;
  const callback = this.async();
  setTimeout(() => {
    const result = source.replace("laohan", "阿西吧");
    callback(null, result);
  }, 3000);
  //   this.callback(null, result);
};

  • this.query:返回webpack的参数即options的对象
  • this.async :将这个loader异步的回调,返回的对象为this.callback

相关文章

网友评论

      本文标题:webpack基础(四)手写loader

      本文链接:https://www.haomeiwen.com/subject/ytotzktx.html