webpack(6) loader

webpack做的事情, 仅仅是分析各个模块间的依赖关系, 将chunk里的资源合并成资源列表, 然后输出打包文件;

更多的事情, 需要loader和plugin来完成;

 一.  loader

         本质是一个函数, 它的作用是将某个源码字符串转换成为另一个源码字符串.

loaders执行过程:在webpack读取文件之后, 经过loader后形成转换后的代码, 然后交给AST分析

 

处理loaders流程

 在webpack.config.js中配置loader

 1 module.exports = {
 2   module: {
 3     rules: [
 4       {
 5         test: /.js$/,//匹配规则
 6         use: [        //用什么处理, 可以写多个loader
 7           { loader: "xxloader" }  //loader的路径,webpack内部会用require(loader的路径)来获取该loader函数
 8         ]
 9       }
10     ]
11   },

练习: 自己手写一个简单的loader, 实现"变量 a = 1" 跑起来, 也就是将 "变量" 换成 "var";

 1. loader本质就是一个函数, 所以创建一个文件, 导出一个函数. 注意不能用es6导出, 要用commonjs导出,

     因为此时是nodejs运行环境.

 

1 //myloader.js
2 
3 module.exports = function(sourcecode){ //参数表示该loader处理前的源码
4   console.log(sourcecode);
5      return sourcecode.replace(/变量/g,"var");//return结果就是该loader处理后的源码
6 }

2. 配置webpack.config.js中配置该loader

 1 //webpack.config.js
 2 const path = require("path");
 3 module.exports = {
 4   module: {
 5     rules: [
 6       {
 7         test: /.js$/,//匹配规则
 8         use: [        //用什么处理, 可以写多个loader
 9           { loader: "./src/myloader/myloader.js" }  //loader的路径
10         ]
11       }
12     ]
13   },
14   devtool: "source-map",
15   mode: "development",
16   entry: {
17     index: "./src/index.js"
18   },
19   output: {
20     filename: "[name].[chunkhash:5].js",
21     path: path.resolve("./", "output")
22   }
23 
24 }

这样配置后, 就可以针对所有js文件进行转换了.

loader的参数: 有两种写法, 一种是写在options里, 一种可以直接写在loader后用?xx=yy这种形式;

module.exports = {
  module: {
    rules: [
      {
        test: /.js$/,//匹配规则
        use: [        //用什么处理, 可以写多个loader
// 第一种:
          // { loader: "./src/myloader/myloader.js" },  //loader的路径
// 第二种:
          // {
          //   loader: "./src/myloader/myloader2.js",
          //   options:{
          //     changevalue: "我的吧"
          //   }
          // }
// 第三种:
          {loader:"./src/myloader/myloader2.js?changevalue=我的吧"}
        ]
      }
    ]
  },
1 //loader2.js 可以获取webpack.config.js中loader的配置
2 const { getOptions } = require("loader-utils");
3 
4 module.exports = function (sourcecode) {
5   const options = getOptions(this)
6   console.log(options);
7   var reg = new RegExp(options.changevalue, "g");
8   return sourcecode.replace(reg, "var");
9 }

loader们的执行顺序, 从下往上, 从右向左.与加载顺序相反

原文地址:https://www.cnblogs.com/dangdanghepingping/p/14495789.html