webpack如何自定义一个loader

我们在使用脚手架的搭建项目的时候往往都会帮我们配置好所需的loader,接下来讲一下我们要如何自己写一个loader应用到项目中(完整代码在最后)

1. 首先搭建一个项目并找到webpack配置文件(webpack.config.js)
在module中匹配js文件并指定loader处理js文件,写法如图所示下面的options就是在调用咱们的loader时传递的参数,关键点在于指定咱们本地的js文件(firstLoader.js)
2. 接下来就是创建firstLoader.js并编写脚本代码,假设我们要实现一个功能将源代码中变量名a转成b

loader文件需要导出一个函数交给webpack去执行,代码如下

复制代码
module.exports = function () {
  
}

想要处理源代码,那我们得拿到源代码,怎么拿呢?webpack在调用我们loader函数得时候会把源代码通过参数传过来

复制代码
module.exports = function (source) {
  console.log("源代码", source)
}

我们运行webpack打印一下看看,下面的报错是因为没有将代码返回给webpack,loader处理完文件后必须要返回

这个时候我们拿到源代码了要如何操作呢,怎么实现将const a = 1; 变成 const b = 1; 这个时候就要使用到babel这里先不过多介绍,简单来讲就是通过babel去操作源代码变成我们想要的效果

先引入babel相关的依赖此时loader文件代码如下,记得先安装

复制代码
const { traverse } = require('@babel/core');
const babel = require('@babel/parser');
const generator = require("@babel/generator").default;

module.exports = function (source) {
  console.log("源代码", source)
}

第一步先将源代码转成ast抽象语法树,(不懂的可以去看一下babel相关的文章)

复制代码
const ast = babel.parse(source, {
    sourceType: 'module'
});

第二步根据需求修改ast,咱们的需求是将变量名a转成b

复制代码
  traverse(ast, {
    Identifier(path) {
      if (path.node.name === "a") {
        path.node.name = "b";
      }
    }
  })

第三步将ast转成代码返回给webpack

复制代码
const newCode = generator(ast).code;
 return newCode

整个loader的完整代码如下

复制代码
const { traverse } = require('@babel/core');
const babel = require('@babel/parser');
const generator = require("@babel/generator").default;

module.exports = function (source) {
  console.log("源代码", source);
  // 1.将源代码转换成ast
  const ast = babel.parse(source, {
    sourceType: 'module'
  });

  // 2.修改ast
  traverse(ast, {
    Identifier(path) {
      if (path.node.name === "a") {
        path.node.name = "b";
      }
    }
  })

  // 3. 将ast转换成代码返回给webpack
  const newCode = generator(ast).code;
  console.log("newCode", newCode)
  return newCode
}

至此我们的小需求就实现了

webpack如何自定义一个loader

原文链接:https://juejin.cn/post/7366557738266279970

相关推荐
开开心心_Every10 分钟前
免费窗口置顶小工具:支持多窗口置顶操作
服务器·前端·学习·macos·edge·powerpoint·phpstorm
闲蛋小超人笑嘻嘻44 分钟前
Vue 插槽:从基础到进阶
前端·javascript·vue.js
梦6501 小时前
Vue2 与 Vue3 对比 + 核心差异
前端·vue.js
tiandyoin1 小时前
给 MHTML 添加滚动条.mhtml
前端·chrome·html·mhtml
遗憾随她而去.1 小时前
前端大文件上传(切片并发/断点续传/秒传/WebWorker 计算Hash) 含完整代码
前端
AKA__老方丈2 小时前
vue-cropper图片裁剪、旋转、缩放、实时预览
前端·vue.js
梦6503 小时前
Vue 单页面应用 (SPA) 与 多页面应用 (MPA) 对比
前端·javascript·vue.js
清铎3 小时前
大模型训练_week3_day15_Llama概念_《穷途末路》
前端·javascript·人工智能·深度学习·自然语言处理·easyui
岛泪3 小时前
把 el-cascader 的 options 平铺为一维数组(只要叶子节点)
前端·javascript·vue.js
Kiyra4 小时前
阅读 Netty 源码关于 NioEventLoop 和 Channel 初始化部分的思考
运维·服务器·前端