webpack自定义loader

·  阅读 233

1.定义loader

  • loader就是一个函数 ,不可以是箭头函数,需要用到this做操作
  • 必须有返回值
// 自定义loader
// /myLoaders/replace-loader.js
module.exports = function (source) {
  return source.replace("webpack", "好好笑");
};
复制代码

配置设置

//设置方式1
module: {
    rules: [
     {
      test: /\.js$/,
      use: [
         path.resolve(__dirname, "./myLoaders/replace-loader.js"),
      ],
    },
  }

//设置方式2
//先定义全局加载的路径./myLoaders
module.exports = {
  resolveLoader: {
    modules: ["node_modules", "./myLoaders"],//先去node_modules找,没有就到myLoaders文件夹找
  },
    ...
     {
          test: /\.js$/,
          use: [
            "replace-loader", //在对应配置就可以直接获取 
          ],
        },

}

复制代码

loader高级应用

this.callback 返回多种信息

loader 的 api 都挂载this对象上

module.exports = function (source) {
    const content = source.replace("hello", "xxxx");
   this.callback(null, content); //第一个参数为error,第二个位返回内容
    //等价于
//  return source.replace("webpack", "好好笑");
};
复制代码

this.async处理异步逻辑

  • this.query 接受参数
// /myLoaders/replace-loader-async.js
module.exports = function (source) {
  console.log(this, this.query, source);
  const callback = this.async();//通过 callback引用, 处理异步,跟this.callback功能一样
  setTimeout(() => {
    const content = source.replace("hello", "yeah");
    callback(null, content);
  }, 3000);
};
//webpack.config.js
  {
          test: /\.js$/,
          use: [
         "replace-loader",
            {
              loader: "replace-loader-async",
              options: {
                name: "xxx",
              },
            },
            ]
复制代码

2.定义样式处理loader

// /myLoaders/my-less-loader.js
// 使用 less模块处理less语法
const less = require("less");
module.exports = function (source) {
  less.render(source, (error, output) => {
    let { css } = output;
    this.callback(error, css);
  });
};

// /myLoaders/my-css-loader.js
module.exports = function (source) {
  return JSON.stringify(source);
};

// /myLoaders/my-style-loader.js
module.exports = function (source) {
  // style
  // style ={ source}
  // style -> head
  return `const tag = document.createElement('style');
        tag.innerHTML = ${source};
        document.head.appendChild(tag)
    `;
};
//webpack.config.js
 {
        test: /\.less$/,
        use: [
          "my-style-loader",
          "my-css-loader",
          "my-less-loader",
        ],
      },
}
复制代码
分类:
前端
标签:
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改