详解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兼容标准的表格变色效果
Jun 28 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
Apr 28 Javascript
jquery定时滑出可最小化的底部提示层特效代码
Oct 02 Javascript
js+canvas绘制五角星的方法
Jan 28 Javascript
基于angularjs实现图片放大镜效果
Aug 31 Javascript
jQuery autoComplete插件两种使用方式及动态改变参数值的方法详解
Oct 24 Javascript
Javascript中return的使用与闭包详解
Jan 11 Javascript
JS中定位 position 的使用实例代码
Aug 06 Javascript
微信小程序页面滑动屏幕加载数据效果
Nov 16 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
Sep 12 Javascript
JavaScript实现简单动态表格
Dec 02 Javascript
js实现验证码干扰(静态)
Feb 22 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
php入门教程 精简版
2009/12/13 PHP
PHP微信刮刮卡 附微信接口
2016/07/22 PHP
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
突发奇想的一个jquery插件
2010/11/19 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
js 窗口抖动示例
2013/09/04 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
javascript瀑布流式图片懒加载实例解析与优化
2016/02/23 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
jQuery Easyui datagrid editor为combobox时指定数据源实例
2016/12/19 Javascript
webpack2.0搭建前端项目的教程详解
2017/04/05 Javascript
validationEngine 表单验证插件使用实例代码
2017/06/15 Javascript
webpack vue项目开发环境局域网访问方法
2018/03/20 Javascript
浅析vue中常见循环遍历指令的使用 v-for
2018/04/18 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
2018/04/18 jQuery
bootstrap table实现合并单元格效果
2018/12/24 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
微信小程序 button样式设置为图片的方法
2020/06/19 Javascript
Vue项目打包编译优化方案
2020/09/16 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
Python实现视频下载功能
2017/03/14 Python
Python 多核并行计算的示例代码
2017/11/07 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
python实现雨滴下落到地面效果
2018/06/21 Python
浅谈Django的缓存机制
2018/08/23 Python
python读取并写入mat文件的方法
2019/07/12 Python
flask框架蓝图和子域名配置详解
2020/01/25 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
《草虫的村落》教学反思
2014/02/16 职场文书
百年校庆节目主持词
2014/03/27 职场文书