写一个webpack loader

40 阅读2分钟

首先 需要去创建一个webpack项目

mkdir webpack-demo
cd webpack-demo
npm init -y
npm install webpack webpack-cli --save-dev

构建文件目录

webpack-demo
  |- package.json
+ |-dist
  + |- index.html
+ |- /src
+   |- index.js
+ |-webpack.config.js

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>起步</title>
    <script src="https://unpkg.com/lodash@4.17.20"></script>
  </head>
  <body>
    <script src="./bundle.js"></script>
  </body>
</html>

index.js

document.write("hello world");
console.log("执行js");

webpack.config.js

const path = require("path");

module.exports = {
  entry: "./src/index.js",
  output: {
    path: path.resolve(__dirname, "dist"),
    filename: "bundle.js",
  },
  devServer: {
    contentBase: "./dist",
    overlay: {
      warnings: true,
      errors: true,
    },
    open: true,
  }
};

下面开发一个简单的loader: 在 src下新建 myLoader/my-loader.js

module.exports = function (source) {
  // 在这里按照你的需求处理 source
  console.log("source==========", source, "===========");
  // 获取配置项
  console.log(this.query);
  //替换world为webpack
  return source.replace("world", "webpack");
};

修改webpack.config.js,添加module和rule

rules: [
      {
        test: /\.js$/,
        use: [
          {
            loader: path.resolve("./src/myLoader/my-loader.js"),
            options: {
              aa: 1,
            },
          },
        ],
      }
      ]

使用npx webpack去打包生成dist/bundle.js. index.html已经通过script标签引用bundle.js 在浏览器打开index.html 可以看到 能够展示我们修改的内容

总结:

可以将Loader视为在Webpack构建过程中对原始代码进行拦截和处理的中间件。Loader在模块加载阶段被调用,可以修改模块的源代码、转换文件格式、执行静态分析、应用代码检查等操作。

当Webpack加载模块时,它会根据文件类型匹配相应的Loader,并将模块的源代码传递给Loader进行处理。Loader可以对源代码进行转换、解析、处理和修改,然后返回处理后的代码供Webpack继续处理。

这种拦截和处理的机制使得Webpack具有了很大的灵活性和可扩展性。通过使用不同的Loader,开发者可以根据项目需求对不同类型的文件进行定制化的处理。Loader的拦截和处理能力是Webpack实现一切资源模块化的基础。

附上官网关于loader链接:

编写 loader | webpack 中文文档 (docschina.org)

一个简单的 raw-loader 帮助大家理解 loader的编写流程,个人认为是一个很好的示例:

raw-loader/src/index.js at master · webpack-contrib/raw-loader (github.com)

如果不使用raw-loader 进行如下操作

import txt from "./1.txt";
console.log(txt);
document.write(txt);

会发生报错