详解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帮助之CSS尺寸(五)outerHeight、outerWidth
Nov 14 Javascript
JQuery中对服务器控件 DropdownList, RadioButtonList, CheckboxList的操作总结
Jun 28 Javascript
js调用webservice中的方法实现思路及代码
Feb 25 Javascript
javascript轻量级模板引擎juicer使用指南
Jun 22 Javascript
javascript中返回顶部按钮的实现
May 05 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
May 25 Javascript
Mvc提交表单的四种方法全程详解
Aug 10 Javascript
JS无缝滚动效果实现方法分析
Dec 21 Javascript
Angular.js中上传指令ng-upload的基本使用教程
Jul 30 Javascript
webpack 单独打包指定JS文件的方法
Feb 22 Javascript
JavaScript分步实现一个出生日期的正则表达式
Mar 22 Javascript
Vue-cli3生成的Vue项目加载Mxgraph方法示例
May 31 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
linux中cd命令使用详解
2015/01/08 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
PHP实现生成唯一会员卡号
2015/08/24 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
Js实现动态添加删除Table行示例
2014/04/14 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
Javascript中innerHTML用法实例分析
2015/01/12 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
layui框架与SSM前后台交互的方法
2019/09/12 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
python中关于日期时间处理的问答集锦
2013/03/08 Python
python中global与nonlocal比较
2014/11/21 Python
python实现的简单FTP上传下载文件实例
2015/06/30 Python
python日志记录模块实例及改进
2017/02/12 Python
Python scikit-learn 做线性回归的示例代码
2017/11/01 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
python和js交互调用的方法
2020/06/23 Python
Araks官网:纽约内衣品牌
2020/10/15 全球购物
资料员的岗位职责
2013/11/20 职场文书
超市开业庆典策划方案
2014/05/14 职场文书
捐资助学感谢信
2015/01/21 职场文书
医学生自荐信范文
2015/03/05 职场文书
Django migrate报错的解决方案
2021/05/20 Python
Vue深入理解插槽slot的使用
2022/08/05 Vue.js