详解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 相关文章推荐
网络图片延迟加载实现代码 超越jquery控件
Mar 27 Javascript
js对象之JS入门之Array对象操作小结
Jan 09 Javascript
深入解析JavaScript的闭包机制
Oct 20 Javascript
Node.js中使用socket创建私聊和公聊聊天室
Nov 19 Javascript
jQuery悬停文字提示框插件jquery.tooltipster.js用法示例【附demo源码下载】
Jul 19 Javascript
jQuery复制节点用法示例(clone方法)
Sep 08 Javascript
js实现倒计时关键代码
May 05 Javascript
使用elementUI实现将图片上传到本地的示例
Sep 04 Javascript
Vue.js 中 axios 跨域访问错误问题及解决方法
Nov 21 Javascript
vue全局使用axios的方法实例详解
Nov 22 Javascript
js中arguments对象的深入理解
May 14 Javascript
vue elementUI使用tabs与导航栏联动
Jun 21 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
用文本文件制作留言板提示(上)
2006/10/09 PHP
检查用户名是否已在mysql中存在的php写法
2014/01/20 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
利用php的ob缓存机制实现页面静态化方法
2017/07/09 PHP
JS array 数组详解
2009/03/22 Javascript
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
2015/11/30 Javascript
JS查找字符串中出现次数最多的字符
2016/09/05 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
2018/07/19 Javascript
微信小程序实现弹出层效果
2020/05/26 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
[38:40]2018DOTA2亚洲邀请赛 4.6淘汰赛 mineski vs LGD 第一场
2018/04/10 DOTA
python基础教程之udp端口扫描
2014/02/10 Python
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
Python函数式编程指南(四):生成器详解
2015/06/24 Python
Django基础之Model操作步骤(介绍)
2017/05/27 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
2020/01/23 Python
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
印度低票价航空公司:GoAir
2017/10/11 全球购物
黄金搭档广告词
2014/03/21 职场文书
学校消防安全责任书
2014/07/23 职场文书
党员群众路线个人整改措施思想汇报
2014/10/12 职场文书
武当山导游词
2015/02/03 职场文书
幼儿园开学通知
2015/04/24 职场文书
vue-cli3.0修改打包后的文件名和文件地址,打包后本地运行报错解决
2022/04/06 Vue.js