官网上的定义:loader 是一个转换器,用于对源代码进行转换。

例如 babel-loader 可以将 ES6 代码转换为 ES5 代码。sass-loader 将 sass 代码转换为 css 代码。

一般 loader 的配置代码如下:

module: {rules: [{test: /\.js$/,use: [{loader: path.resolve('./loader1.js')},{loader: path.resolve('./loader2.js')}]}]
}

rules 数组包含了一个个匹配规则和具体的 loader 文件。

上述代码中的 test: /\.js$/ 就是匹配规则,表示对 js 文件使用下面的两个 loader。

而 loader 的处理顺序是自下向上的,即先用 loader2 处理源码,然后将处理后的代码再传给 loader1。

loader2 处理后的代码就是最终的打包代码。

loader 的实现

loader 其实是一个函数,它的参数是匹配文件的源码,返回结果是处理后的源码。下面是一个最简单的 loader,它什么都没做:

module.exports = function (source) {return source
}

这么简单的 loader 没有挑战性,我们可以写一个稍微复杂一点的 babel-loader:

const loaderUtils = require('loader-utils')
const babel = require('@babel/core')
function loader (source) {let cb = this.async()let options = loaderUtils.getOptions(this)babel.transform(source, {...options,sourceMap: true,filename: this.resourcePath.split('/').pop()}, function (err, r) {cb(err, r.code, r.map)})
}module.exports = loader

异步 loader 需要调用 webpack 的 async() 生成一个 callback,它的第一个参数是 error,第二个参数就是处理后的源码。当你异步处理完源码后,调用 callback 即可。

loader-utils 是一个 webpack 工具类,通过一些方法配合 loader 处理文件。loader 是可以配置 options 参数,然后内部可以直接通过 getOptions 获取。

module: {rules: [{test: /\.js$/,use: [{loader: path.resolve('./loader/loader1.js'),options: {presets: ['@babel/preset-env']}}]}]
}

babel-loader 使用的是 @babel/core 处理代码转换的,但是 @babel/core 本身不转换代码,它是调用 @babel/preset-env 插件转换的。

实现一个 webpack loader相关推荐

  1. 如何编写一个 Webpack Loader

    前言 在平时自己由零搭建项目时,虽然基础配置都比较熟悉,比如配置 file-loader, url-loader, css-loader 等,配置不难,但究竟是怎么起作用的呢,今天就来说说如何编写一个 ...

  2. Webpack: Loader 开发分享

    Webpack: Loader 开发分享 文章目录 Webpack: Loader 开发分享 正文 1. Concept 概念 2. Configuration 配置实例 3. Custom 自定义 ...

  3. webpack loader的套路

    学习webpack loader,最后模拟style-loader.less-loader 什么是loader loader是一个函数,用来把文件转换成webpack识别的模块. loader API ...

  4. 从零开始一个webpack+react项目

    从零开始一个webpack+react项目 最近在做react组件化的分享,从项目中抽离组件,那么第一步自然是搭建相关的环境 本篇旨在从零开始,用最少的配置.最少的代码.最少的依赖来搭建一个最简单的w ...

  5. 一次搞懂Webpack Loader

    50 亿观众的 "云上奥运",顶级媒体背后的数智化力量 东京 2020 奥运会即将闭幕,本届奥运会由于疫情限制,东京地区赛事以无观众的空场形式举行,在无法亲临现场的情况下,全球观众 ...

  6. 【javascript】手写一个webpack loder

    [javascript]手写一个webpack loder 手写一个loader 为什么需要loader?  webpack 实际上只能处理js文件,那么对于除了js文件的其他类型的文件 比如 css ...

  7. webpack 复习(四)webpack loader

    loader webpack 只是一个打包工具,它只负责分析各个模块的依赖关系,然后形成资源清单,最终打包生成到指定的文件中. 其他的功能需要借助 webpack loader 和 webpack p ...

  8. webpack loader解析及自定义loader

    自定义实现webpack loader加载模块,解析指定的类型文件 loader loader是一个导出为函数的node模块,可通过this访问上下文. 特点: loader单一职责,只负责解决单一的 ...

  9. 用 vue-cli 手脚架 建立一个 webpack 模板 vue 项目

    用 vue-cli 手脚架 建立一个 webpack 模板 vue 项目 一:vue 环境安装 如果环境安装好了,可以直接用vue-cli手脚架生成 模板项目, 一般用的是webpack模板. 1.去 ...

最新文章

  1. 【综述】闲话模型压缩之网络剪枝(Network Pruning)
  2. 【收藏】goland报错:报错package xxx is not in GOROOT or GOPATH 或者 cannot find package “xxx“ in any of
  3. 用最少数量的箭引爆气球
  4. 最新版富文本编辑器UEditor操作教程
  5. MySQL - Found option without preceding group in config file
  6. Actor-ES框架:Ray-Handler之ToReadHandler编写
  7. C/C++日志写入系统log(/var/log/syslog)
  8. php切割文件上传,php+ajax实现文件切割上传功能示例
  9. 干货:虚拟机兼容性和文件格式详解
  10. WinForm 快捷键设置
  11. CV2.imread得到的图像显示成蓝色的原因和3种BGR转RGB的方法
  12. [导入]警告:不能将项目“project”中的依赖项“file”复制到运行目录,因为它将改写引用“file”。...
  13. java数据读取容量,spring batch使用reader读数据的内存容量问题详解
  14. tl494cn逆变器电路图_用TL494制作的逆变电源
  15. CMMI基础知识扫盲 笔记
  16. word文档解密方法
  17. 一个30岁转行IT行业从小兵到主管的崎岖成长之路
  18. C#数据库教程5-ADO.NET登录页面设计
  19. 频率变标算法(FSA,Frequency Scaling)
  20. SpringBoot整合——阿里云对象存储(OSS)

热门文章

  1. 管理大型共享数据库,做到这几点不再头疼!
  2. 深度揭秘垃圾回收底层,这次让你彻底弄懂它
  3. 程序员过关斩将——搞定秒杀,只需要这几步!!
  4. 2021 年了,算法岗位应该怎样准备面试?
  5. 十年厚积!Arm Neoverse 重磅推出 V1 和 N2平台,加速基础设施转型
  6. 全国程序员工资最新统计来了,平均 14,542 元!
  7. 编程语言性能实测,Go 比 Python 更胜一筹?
  8. 小米回应“米家”商标争议;人人 App 回归社交市场;TiDB 2.1.19 发布| 极客头条...
  9. 保温杯都这么给力了,你的 Bug 就不能少点?
  10. @程序员,沟通这项核心技能你掌握了多少?