详解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 相关文章推荐
JavaScript 放大镜 放大倍率和视窗尺寸
May 09 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
Apr 28 Javascript
js读取被点击次数的简单实例(从数据库中读取)
Mar 07 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
Dec 05 Javascript
jQuery中replaceWith()方法用法实例
Dec 25 Javascript
jQuery插件jPaginate实现无刷新分页
May 04 Javascript
JQuery的attr 与 val区别
Jun 12 Javascript
js模态对话框使用方法详解
Feb 16 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
Jul 05 Javascript
微信小程序渲染性能调优小结
Jul 30 Javascript
React-redux实现小案例(todolist)的过程
Sep 29 Javascript
微信小程序返回上一页传参并刷新过程解析
Dec 13 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
关于file_get_contents返回为空或函数不可用的解决方案
2013/06/24 PHP
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
jquery在Chrome下获取图片的长宽问题解决
2013/03/20 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
IE8中动态创建script标签onload无效的解决方法
2014/12/22 Javascript
js同源策略详解
2015/05/21 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
JS实现打字游戏
2019/12/17 Javascript
[57:55]EG vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python 生成器协程运算实例
2017/09/04 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
python3.6连接MySQL和表的创建与删除实例代码
2017/12/28 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
2018/10/26 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
2018/11/30 HTML / CSS
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
自荐信要包含哪些内容
2013/11/06 职场文书
关于毕业的中学校园广播稿
2014/01/26 职场文书
教师师德反思材料
2014/02/15 职场文书
小学优秀教师材料
2014/12/15 职场文书
意向协议书
2015/01/27 职场文书
谢师宴邀请函
2015/02/02 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书
创业计划书之农家乐
2019/10/09 职场文书
Java使用jmeter进行压力测试
2021/07/09 Java/Android
分享python函数常见关键字
2022/04/26 Python