详解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 remove 自定义数组删除方法
Oct 20 Javascript
判断多个input type=file是否有已经选择好文件的代码
May 23 Javascript
JavaScript之IE的fireEvent方法详细解析
Nov 20 Javascript
简单的JavaScript互斥锁分享
Feb 02 Javascript
js post提交调用方法
Feb 12 Javascript
Bootstrap导航条的使用和理解3
Dec 14 Javascript
jQuery使用EasyUi实现三级联动下拉框效果
Mar 08 Javascript
JS中的三个循环小结
Jun 20 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
Nov 03 Javascript
vue+axios 拦截器实现统一token的案例
Sep 11 Javascript
Vue使用路由钩子拦截器beforeEach和afterEach监听路由
Nov 16 Javascript
使用Ajax实现无刷新上传文件
Apr 12 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
php 三维饼图的实现代码
2008/09/28 PHP
phpMyadmin 用户权限中英对照
2010/04/02 PHP
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
基于jQuery的自动完成插件
2011/02/03 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
js中的preventDefault与stopPropagation详解
2014/01/29 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
JS 动态判断PC和手机浏览器实现代码
2016/09/21 Javascript
vue.js利用Object.defineProperty实现双向绑定
2017/03/09 Javascript
修改node.js默认的npm安装目录实例
2018/05/15 Javascript
Vue中使用vux配置代码详解
2018/09/16 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
Python爬取Coursera课程资源的详细过程
2014/11/04 Python
python计算一个序列的平均值的方法
2015/07/11 Python
通过数据库对Django进行删除字段和删除模型的操作
2015/07/21 Python
Python编程中的文件操作攻略
2015/10/16 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
Python通过matplotlib绘制动画简单实例
2017/12/13 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
python 在sql语句中使用%s,%d,%f说明
2020/06/06 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
Python面向对象多态实现原理及代码实例
2020/09/16 Python
CSS3 分类菜单效果
2019/05/27 HTML / CSS
法国家具及室内配件店:home24
2017/01/21 全球购物
气象学专业个人求职信
2014/03/15 职场文书
篮球友谊赛通讯稿
2014/10/10 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python