webpack:编写一个简单的loader

什么是loader:loader的本质就是一个function,在我们进行打包的时候,帮我们处理需要打包的文件。

编写loader

1.创建一个文件夹,使用npm init -y来初始化

npm init -y

2.安装一些开发依赖

npm i webpack webpack-cli clean-webpack-plugin loader-utils -D

3.创建src目录,并在src下创建index.js

index.js内容:

console.log('hello word');

4.创建loaders目录,并在该目录下创建replaceLoader.js文件

replaceLoader.js内容:

const loaderUtils = require('loader-utils');
module.exports = function (source) {
  const option = loaderUtils.getOptions(this);
  return source.replace('word', option.name);
};

注释:

  • 我们在replaceLoader中导出的function,就是一个loader。
  • 这个函数默认接收一个参数source,就是我们打包的文件的内容,是字符串来的。
  • loader-utils这个插件,使用来帮助我们更方便的获取我们在webpack配置文件中传过来的options。
  • 不使用loader-utils这个插件,我们可以通过this.query.name来获取我们传过来的options中的name
  • loader不要写成箭头函数的形式,因为我们要使用webpack给我提供的this
  • loader一定要有返回值,我们这里就是将index.js文件中的word打包替换成我们在配置文件中自定义的name

5.创建webpack.config.js文件

const path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
  mode: 'development',
  entry: {
    index: './src/index.js',
  },
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: '[name].[contenthash].js',
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: [
          {
          	// 通过文件路径来引用loader
            loader: path.resolve(__dirname, './loaders/replaceLoader.js'), 
            options: {
            	// 传给loader的name参数
              name: 'wjg-webpack-loader',
            },
          }
        ],
      },
    ],
  },
  plugins: [new CleanWebpackPlugin()], // 这里我使用来清除上一次打包的文件
};

6.使用npm run build来打包,查看生成的文件

在这里插入图片描述

番外篇:在loader中使用异步操作和使用多个loader

1.继续在上面的内容中进行,在loaders文件夹中创建replaceLoaderAsync.js

module.exports = function (source) {
  const cb = this.async();
  setTimeout(() => {
    source = source.replace('hello', 'hi');
    cb(null, source);
  }, 1000);
};

注释:

  • 使用this.async()来帮我们在异步操作中返回
  • this.async()返回一个callback函数,上面我简写成了cb
  • cb函数的参数:第一个是错误对象,没有就写null,第二个参数是我们修改的source,第三个是sourceMap,第四个是meta,由于我这里没有用到后面两个,就省略不写了

2.修改webpack.config.js文件

const path = require('path');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
  mode: 'development',
  entry: {
    index: './src/index.js',
  },
  output: {
    path: path.resolve(__dirname, './dist'),
    filename: '[name].[contenthash].js',
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: [
          {
            loader: path.resolve(__dirname, './loaders/replaceLoader.js'),
            options: {
              name: 'wjg-webpack-loader',
            },
          },
          // 新增异步的loader
          {
            loader: path.resolve(__dirname, './loaders/replaceLoaderAsync.js'),
          },
        ],
      },
    ],
  },
  plugins: [new CleanWebpackPlugin()],
};

注:loader的执行顺序:是从后往前执行的。

整个目录文件:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值