正值前端组件化开发时代,那么必然离不开目前最火的构建工具——webpack(grunt,gulp等暂且不谈)。说到这里,刚好有几个问题:

上面这几个问题,就引出了我们的主角——【loader】。

loaderwebpack 的一块很重要的组成部分。我们都知道 webpack 是用于资源打包的,里面的所有资源都是“模块”,内部实现了对模块资源进行加载的机制。但是 Webpack 本身只能处理 js 模块,如果要处理其他类型的文件,就需要使用 loader 进行转换。 Loader 可以理解为是模块和资源的转换器,它本身是一个函数,接收文件源码作为参数,返回转换的结果,例如可以使用 loader 加载器可以快速编译预处理器 (less,sass,coffeeScript) Loader 可以在 require() 引用模块的时候添加,也可以在 webpack 全局配置中进行绑定,还可以通过命令行的方式使用。(本篇中的参数配置及使用方式均基于 webpack4.0 版本)

一、loader的特点

1、loader 的执行顺序和代码书写的顺序是相反的,即:从下至上,从右至左。

2、第一个执行的 loader 会接收源文件做为参数,下一次执行的 loader 会接收前一个 loader 执行的返回值做为参数

3、需要严格遵循“单一职责”原则,即每个 loader 只负责自己需要负责的事情

二、loader API

methods 含义
this.request 被解析出来的 request 字符串。例子:"/abc/loader1.js?xyz!/abc/node_modules/loader2/index.js!/abc/resource.js?rrr"
this.loaders 所有 loader 组成的数组。它在 pitch 阶段的时候是可以写入的。
this.loaderIndex 当前 loader 在 loader 数组中的索引。
this.async 告诉 loader-runner 这个 loader 将会异步地回调
this.callback 一个可以同步或者异步调用的可以返回多个结果的函数
this.data 在 pitch 阶段和正常阶段之间共享的 data 对象。
this.cacheable 设置是否可缓存标志的函数
this.resource request 中的资源部分,包括 query 参数
this.resourcePath 资源文件的路径。
this.resourceQuery 资源的 query 参数
this.target 编译的目标。从配置选项中传递过来的。
this.webpack 如果是由 webpack 编译的,这个布尔值会被设置为真
this.sourceMap 应该生成一个 source map。因为生成 source map 可能会非常耗时,你应该确认 source map 确实有必要请求。
this.emitWarning 发出一个警告。
this.emitError 发出一个错误。
this.loadModule 解析给定的 request 到一个模块,应用所有配置的 loader ,并且在回调函数中传入生成的 source 、sourceMap 和 模块实例(通常是 NormalModule 的一个实例)。如果你需要获取其他模块的源代码来生成结果的话,你可以使用这个函数。
this.resolve 像 require 表达式一样解析一个 request 。
this.emitFile 产生一个文件。这是 webpack 特有的。
this.fs 用于访问 compilation 的 inputFileSystem 属性。
this.value 向下一个 loader 传值。如果你知道了作为模块执行后的结果,请在这里赋值(以单元素数组的形式)。
this.inputValue 从上一个 loader 那里传递过来的值。如果你会以模块的方式处理输入参数,建议预先读入这个变量(为了性能因素)。
更多详细API,以及各API的用法示例,可以访问官网查看。地址:https://www.webpackjs.com/api/loaders

三、写loader之前的需求整理

现在有这样一个需求,使用 hxkj-loader 加载并处理名称为 *.hxkj.vip 的文件,将里面的哈希空间全部替换为 www.hxkj.vip。需要实现的转换如下:

转换前的内容:

<div>
<h1>欢迎访问哈希空间</h1>
<p>哎哟,终于等到你。这里就是让人流连忘返的哈希空间呀!</p>
</div>

转换后的内容:

<div>
<h1>欢迎访问www.hxkj.vip</h1>
<p>哎哟,终于等到你。这里就是让人流连忘返的www.hxkj.vip呀!</p>
</div>

四、编写loader

在与 webpack.config.js 同级目录下新建 hxkj-loader.js,文件的内容如下:

module.exports = function(source){
var content="";
content = source.replace("/哈希空间/g","www.hxkj.vip");
return content;
}

接下来,需要在 webpack.config.js 文件中增加以下的配置:

const path = require("path"); // 引入 node 的 path 模块
...
module:{
rules:[{
test: /\.hxkj\.vip$/, // 正则匹配以 hxkj.vip 结尾的文件
use:[{
loader:path.resolve(__dirname, "hxkj-loader") // 使用 path 模块找到 hxkj-loader 的路径
}]
}]
}
好,到此,一个简易版的 loader 就已经写完了。目前 loader 是直接写在本地的,可以考虑将自己写好的 loader 发布到 npm,这样就更加完善了。

At last,看完之后有什么不懂的,可以留言反馈。

转载请注明出处:https://www.jianshu.com/p/51b793f6fa0e

作者:TSY

个人空间:https://hxkj.vip

webpack loader实现的更多相关文章

  1. 怎样写一个webpack loader

    div{display:table-cell;vertical-align:middle}#crayon-theme-info .content *{float:left}#crayon-theme- ...

  2. 如何开发webpack loader

    关于webpack 作为近段时间风头正盛的打包工具,webpack基本占领了前端圈.相信你都不好意思说不知道webpack. 有兴趣的同学可以参考下我很早之前的webpack简介 . 确实webpac ...

  3. 手把手教你撸一个 Webpack Loader

    文:小 boy(沪江网校Web前端工程师) 本文原创,转载请注明作者及出处 经常逛 webpack 官网的同学应该会很眼熟上面的图.正如它宣传的一样,webpack 能把左侧各种类型的文件(webpa ...

  4. 案例实战之如何写一个webpack loader

    通过以下几个实例掌握webpack loader的写法 1.写一个多语言替换的loader 在index.js在页面上插入了一个{{title}}文本,我们需要在打包的时候将其替换成对应的多语言 fu ...

  5. 发布一个npm包(webpack loader)

    发布一个npm包,webpack loader: reverse-color-loader,实现颜色反转. 初始化项目 mkdir reverse-color-loader cd ./reverse- ...

  6. webpack loader & pulgin

    webpack loader & plugin https://webpack.js.org/concepts/loaders/ https://webpack.js.org/concepts ...

  7. webpack loader加载器

    配置loader,通过加载器处理文件,例如css sass less等,告诉webpack每一种文件都需要使用什么来加载器来处理. 1.node.js安装好之后也会自动默认安装好npm,所以cmd c ...

  8. [webpack]——loader配置

    前言 当我们需要配置 loader 时,都是在 module.rules 中添加新的配置项,在该字段中,每一项被视为一条匹配使用 loader 的规则. 看一下基础实例: module.exports ...

  9. 使用webpack loader加载器

    了解webpack请移步webpack初识! 什么是loader loaders 用于转换应用程序的资源文件,他们是运行在nodejs下的函数 使用参数来获取一个资源的来源并且返回一个新的来源(资源的 ...

  10. webpack loader 生成虚拟文件的方案

    此文已由作者张磊授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 使用 webpack 的时候,难免需要写一些 loader,接着就会遇到一个很纠结的问题.该 loade ...

随机推荐

  1. codeforces 456 D. A Lot of Games(字典数+博弈+思维+树形dp)

    题目链接:http://codeforces.com/contest/456/problem/D 题意:给n个字符串.进行k次游戏.每局开始,字符串为空串,然后两人轮流在末尾追加字符,保证新的字符串为 ...

  2. 树莓派4B安装64位Linux(不用显示器键盘鼠标)

    入手了树莓派4B,我对它的定位是作为一个Docker实验环境,平时用到的镜像多为Java服务端常用的技术.以及自己作的Java应用镜像,因此宿主机需要64位操作系统,而树莓派官方操作系统只有32位的, ...

  3. WebStorm调节控制台字体

    File --> Settings --> Editor --> Colors & Fonts --> Console Font

  4. adb 端口冲突

    第一种方法:可以设置另一个端口 第二种方法: http://blog.csdn.net/hwl1314/article/details/52538023 Android studio 5037端口被占 ...

  5. 洛谷 P1980【计数问题】 题解(1)

    鉴于数据最高只有七位数,通过判断数位,逐位判断即可完成本题. (运行很快,打得手疼) //Stand up for the faith!#include<bits/stdc++.h> us ...

  6. UI自动化测试养成记

    <selenium自动化测试实战>PDF文档下载:https://pan.baidu.com/s/16dt8qPi-C4BOgKe6snAA0A 这几个月我都干了些什么? 当我打算写一本& ...

  7. 019 模块2-time库的使用

    目录 一.概述 二.time库基本介绍 2.1 time库概述 三.时间获取 四.时间格式化 4.1 格式化控制符 4.2 时间格式化-代码 五.程序计时应用 5.1 程序计时 六.单元小结 参考:h ...

  8. 内存泄露检测工具Valgrind

    内存泄露简介 什么是内存泄漏 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因,程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. 内存泄 ...

  9. 去掉Myeclipse对JS等文件的验证

    在用Myeclipse导入新工程或在写代码时,最郁闷的就是它对js,jsp,html的验证太严格了,有时会呈现一个红叉或者一个黄色的感慨号,一运行就报Cannot return from outsid ...

  10. zookeeper与kafka集群部署实现

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作.最终, ...