webpack 自定义loader

212 阅读1分钟

1、步骤

  • 1、创建 custom-loader.js,这个模块导出一个函数,这个函数接收源文件作为参数,并返回转换后的内容。
module.exports = function(source) {
  // 将源文件转换为大写
  const upperCaseContent = source.toUpperCase();
  // 返回转换后的内容,并告诉Webpack使用自己的schema
  this.callback(null, upperCaseContent);
};
  • 配置webpack,以便识别你的自定义loader
// webpack.config.js
module.exports = {
  // ...
  module: {
    rules: [
      {
        test: /\.txt$/, // 匹配所有.txt文件
        use: [
          'raw-loader', // 可以使用现有的loader处理源文件
          './path/to/custom-loader.js' // 使用自定义loader
        ]
      }
    ]
  }
  // ...
};

也可以直接通过命令行创建

npx create-new-webpack-app loader ./my-loader --template=default

2、less-loader

  • webpack.config.js
module.exports = {
  // ...
  module: {
    rules: [
      {
        test: /\.less$/,
        use: [
          'style-loader',
          'css-loader',
          {
            loader: 'less-loader',
            options: {
              // 这里可以配置less-loader的选项
            },
          },
        ],
      },
    ],
  },
  // ...
};
module.exports = function(content) {
  // 使用less编译内容
  const less = require('less');
  const callback = this.async();
 
  less.render(content, {
    // 这里可以配置less的选项
  }, (error, output) => {
    if (error) {
      return callback(error);
    }
    callback(null, output.css);
  });
};
module.exports.raw = true;

3、css-loader

4、style-loader

  • 源码地址 github.com/webpack-con…
  • 核心功能:
    • 它将CSS模块作为style标签插入到当前的DOM中。
  • style-loader源码简化版
 
const { getOptions } = require('loader-utils');
const validateOptions = require('schema-utils');
 
// 定义schema验证,确保loader接收到的options是有效的
const schema = {
  type: 'object',
  properties: {
    injectType: {
      type: 'string',
    },
    // 其他options...
  },
};
 
module.exports = function(content) {
  const options = getOptions(this) || {};
  validateOptions(schema, options, 'Style Loader');
 
  // 生成style标签的HTML字符串
  const code = `
    var styles = document.createElement('style');
    var code = document.createTextNode(${JSON.stringify(content)});
    styles.type = 'text/css';
    styles.appendChild(code);
    document.head.appendChild(styles);
  `;
 
  // 返回JavaScript模块代码
  return this.callback(null, code);
};

最后

欢迎关注我的前端自检清单,我和你一起成长