详解webpack自定义loader初探


Posted in Javascript onAugust 29, 2018

最近负责的Weex项目涉及到一些构建上的问题,需要通过自定义webpack的loader去实现,于是学习了一下这方面的知识,写一篇文章做个总结,以免遗忘。

webpack想必前端圈的人都知道了,大多数人也都或多或少的用过。简单的说就是它能够加载资源文件,并对这些文件进行一些处理,诸如编译、压缩等,最终一起打包到指定的文件中。可以说,它作为一个打包工具,在前端工程化浪潮中,起到了中流砥柱的作用。

那webpack其中非常重要的一环就是,能够对加载的资源文件,进行一些处理。比如把less、sass文件编译成css文件,负责这个处理过程的,就是webpack的loader。

什么是loader

我们都知道webpack作为当下最火的一个前端构建工具,具有很多很实用的功能,loader就是其中之一。说的通俗一点,loader就是用于对模块的源码进行转换。对于做Android的同学,大家可以把它想象成gradle中的transform task。

loader怎么用

在平时的开发过程中,loader的使用也是非常常见的,我们可以在工程的webpack.config.js中定义:

module: {
 rules: [
  {
   test: /\.css$/,
   use: [
    'vue-style-loader',
    'css-loader'
   ],
  },   {
   test: /\.vue$/,
   loader: 'vue-loader',
   options: {
    loaders: {
    }
    // other vue-loader options go here
   }
  },
  {
   test: /\.(png|jpg|gif|svg)$/,
   loader: 'file-loader',
   options: {
    name: '[name].[ext]?[hash]'
   }
  }
 ]
}

可以看到,对于css文件,我们使用css-loader,对于vue文件,我们使用vue-loader,对于图片文件,我们使用file-loader。这些loader会将对应的文件进行转换,构建出最终的产物。

如何自定义loader

有了上面的经验,我们该如何自定义一个loader呢?其实也是非常简单的。

首先我们创建一个js文件,就取名叫test-loader吧。

var loaderUtils = require('loader-utils');

module.exports = function(source) {
  console.log("start process code...");

  var options = loaderUtils.getOptions(this) || {};
  if(options !== {}) {
    var replaceMap = options["replaceMap"];
    for(var key in replaceMap) {
      console.log(source);
      source = source.replace(key, replaceMap[key]);
      console.log(source);
    }
  }

  return source;
};

这就是全部的代码了,其实一个loader内部就是一个node模块,代码的编写就和平时写node一样就ok了。

test-loader的逻辑就是获取到设置的option,并且做一个文本的替换。

假设我们还有2个js文件,分别是test.js和index.js

test.js

const str = 'test is loaded';
module.exports = str;

index.js

const test = require('./src/test');
console.log(test);

然后我们在webpack.config.js中加入我们自己的test-loader。

{
  test: /\.js$/,
  loader: 'test-loader',
  exclude: /node_modules/,
  options: {
    replaceMap: {
      "loaded": "yeah"
    }
  }
}

其中options中,我们将“loaded”字符串替换成“yeah”。

但是我们的loader并没有上传到npm中,所以我们还需要在webpack.config.js中加入下面这段代码:

resolveLoader: {
  modules: [path.join(__dirname, './src/loaders'), 'node_modules']
}

用于加载本地loader。

这样我们最终构建出来的产物中,所有的“loaded”字符串就会被替换成“yeah”了。

小结

这篇文章非常浅显,主要就是讲了一下loader的使用方式,其实我们熟知的很多loader都是这么做的,只不过是业务逻辑上的复杂程度不同而已,大家也可以自己试试看。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS之小练习代码
Oct 12 Javascript
通过Mootools 1.2来操纵HTML DOM元素
Sep 15 Javascript
jQuery 页面 Mask实现代码
Jan 09 Javascript
js模拟点击事件实现代码
Nov 06 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
Jan 22 Javascript
父页面显示遮罩层弹出半透明状态的dialog
Mar 04 Javascript
上传图片js判断图片尺寸和格式兼容IE
Sep 01 Javascript
详解AngularJS中的表达式使用
Jun 16 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
Mar 25 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
Sep 23 Javascript
js实现导航吸顶效果
Feb 24 Javascript
详解angularjs跨页面传参遇到的一些问题
Nov 01 Javascript
在vue中使用SockJS实现webSocket通信的过程
Aug 29 #Javascript
微信小程序自定义select下拉选项框组件的实现代码
Aug 28 #Javascript
微信小程序中上传图片并进行压缩的实现代码
Aug 28 #Javascript
vee-validate vue 2.0自定义表单验证的实例
Aug 28 #Javascript
vue+element-ui动态生成多级表头的方法
Aug 28 #Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
Aug 28 #jQuery
对Vue table 动态表格td可编辑的方法详解
Aug 28 #Javascript
You might like
通达OA公共代码 php常用检测函数
2011/12/14 PHP
php中使用gd库实现远程图片下载实例
2015/05/12 PHP
PHP is_array() 检测变量是否是数组的实现方法
2016/06/13 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
php 魔术常量详解及实例代码
2016/12/04 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
使用新的消息弹出框blackbirdjs
2008/10/16 Javascript
js 弹出菜单/窗口效果
2011/10/30 Javascript
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
js中复制行和删除行的操作实例
2013/06/25 Javascript
Js中获取frames中的元素示例代码
2013/07/30 Javascript
$.get获取一个文件的内容示例代码
2013/09/11 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
JQuery中的事件及动画用法实例
2015/01/26 Javascript
jquery实现红色竖向多级向右展开的导航菜单效果
2015/08/31 Javascript
js实现表单提交后不重新刷新当前页面
2016/11/30 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
webpack写jquery插件的环境配置
2017/12/21 jQuery
axios post提交formdata的实例
2018/03/16 Javascript
详解vue项目中使用token的身份验证的简单实践
2019/03/08 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
python实现堆栈与队列的方法
2015/01/15 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
Sentry错误日志监控使用方法解析
2020/11/12 Python
巴西最大的巴士票务门户:Quero Passagem
2020/11/21 全球购物
传播学毕业生求职信
2013/10/11 职场文书
QA工程师岗位职责
2013/11/20 职场文书
街道党风廉政建设调研报告
2015/01/01 职场文书