webpack loader实现
正值前端组件化开发时代,那么必然离不开目前最火的构建工具——webpack(grunt,gulp等暂且不谈)。说到这里,刚好有几个问题:
- 为什么运行打包命令之后,
.vue文件可以转成.js文件 - 为什么运行打包命令之后,
.less文件可以转成.css文件 - 为什么运行打包命令之后,
ES6+语法可以转成ES5语法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mr86zPPH-1570953160209)(https://img.shields.io/npm/v/vue-hash-calendar.svg)]
上面这几个问题,就引出了我们的主角——【loader】。
loader是webpack的一块很重要的组成部分。我们都知道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实现的更多相关文章
- 怎样写一个webpack loader
div{display:table-cell;vertical-align:middle}#crayon-theme-info .content *{float:left}#crayon-theme- ...
- 如何开发webpack loader
关于webpack 作为近段时间风头正盛的打包工具,webpack基本占领了前端圈.相信你都不好意思说不知道webpack. 有兴趣的同学可以参考下我很早之前的webpack简介 . 确实webpac ...
- 手把手教你撸一个 Webpack Loader
文:小 boy(沪江网校Web前端工程师) 本文原创,转载请注明作者及出处 经常逛 webpack 官网的同学应该会很眼熟上面的图.正如它宣传的一样,webpack 能把左侧各种类型的文件(webpa ...
- 案例实战之如何写一个webpack loader
通过以下几个实例掌握webpack loader的写法 1.写一个多语言替换的loader 在index.js在页面上插入了一个{{title}}文本,我们需要在打包的时候将其替换成对应的多语言 fu ...
- 发布一个npm包(webpack loader)
发布一个npm包,webpack loader: reverse-color-loader,实现颜色反转. 初始化项目 mkdir reverse-color-loader cd ./reverse- ...
- webpack loader & pulgin
webpack loader & plugin https://webpack.js.org/concepts/loaders/ https://webpack.js.org/concepts ...
- webpack loader加载器
配置loader,通过加载器处理文件,例如css sass less等,告诉webpack每一种文件都需要使用什么来加载器来处理. 1.node.js安装好之后也会自动默认安装好npm,所以cmd c ...
- [webpack]——loader配置
前言 当我们需要配置 loader 时,都是在 module.rules 中添加新的配置项,在该字段中,每一项被视为一条匹配使用 loader 的规则. 看一下基础实例: module.exports ...
- 使用webpack loader加载器
了解webpack请移步webpack初识! 什么是loader loaders 用于转换应用程序的资源文件,他们是运行在nodejs下的函数 使用参数来获取一个资源的来源并且返回一个新的来源(资源的 ...
- webpack loader 生成虚拟文件的方案
此文已由作者张磊授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 使用 webpack 的时候,难免需要写一些 loader,接着就会遇到一个很纠结的问题.该 loade ...
随机推荐
- unicode编码原理及问题
历史在1963年,计算机的使用尚不广泛,那时使用的是7-bit的ASCII码,范围为0-127作为字符的编码,只支持少部分的字符,但是随着计算机的普及,不同的国家地区开始自己制造自己的编码规范,这导致 ...
- 【Offer】[38] 【字符串的排列】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个字符串,打印出该字符串中字符的所有排列.例如,输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc.acb. ...
- 【LeetCode】5# 最长回文子串
题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意 ...
- velocity中文乱码
当使用velocity出现中文乱码. 首先:我们设置 eclipse的编码方式 : 右键工程师属性->properties->查看编码格式是否伟URF-8 然后:spring-xml文件中 ...
- Linux 中 /proc/meminfo 的含义
做嵌入式开发对内存泄露很敏感,而对泄露的位置更加关注.本文记录一下从网上搜集的/proc/meminfo各参数的含义.还不完整,待补完. 本文地址:https://segmentfault.com/a ...
- springboot打包jar包后运行
我们知道,spring boot内嵌tomcat,打包成jar包以后,直接就可以运行. 我们也可以使用启动项里面的mian入口来运行程序. 运行jar包时,我们一般是java -jar xxx.jar ...
- Spring Boot 自定义 Banner 教程
我们在启动 SpringBoot 时,控制台会打印 SpringBoot Logo 以及版本信息.有的时候我们需要自己弄个有个性的文本图片.Spring Boot 为我们提供了自定义接口. . ___ ...
- Python中使用高德API实现经纬度转地名
场景 高德API提供给开发者们一些常用功能的接口,其中有一种叫地理/逆地理编码能实现 地名查询经纬度和经纬度查地名. 实现 高德API平台: https://lbs.amap.com/ 注册并登陆 找 ...
- struts2表单提单细节处理
1. 上传文件 大部分项目避免不了要上传文件. struts2提供了封闭的上传文件的入口, 网络上也存在大量的插件用于网页表单中上传文件. 由于自己习惯用SSH框架, 所以介绍一下struts2中文件 ...
- IO流——File类(文件流类)
java语言的输入输出操作是借助于输入输出包java.io来实现的,按传输方向分为输入流与输出流,从外设传递到应用程序的流为输入流,将数据从应用程序输入到外设的流为输出流. File类的构造方法: 1 ...