详解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脚本
Dec 12 Javascript
javascript 常用代码技巧大收集
Feb 25 Javascript
js分解url参数(面向对象-极简主义法应用)
Aug 09 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
Jun 29 Javascript
JavaScript原生对象之String对象的属性和方法详解
Mar 13 Javascript
JQuery中DOM加载与事件执行实例分析
Jun 13 Javascript
jQuery中队列queue()函数的实例教程
May 03 Javascript
web前端开发upload上传头像js示例代码
Oct 22 Javascript
JavaScript中重名的函数与对象示例详析
Sep 28 Javascript
浅谈node模块与npm包管理工具
Jan 03 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
Jun 19 Javascript
JavaScript JSON数据处理全集(小结)
Aug 15 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实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
PHP数组函数知识汇总
2016/05/12 PHP
Js组件的一些写法
2010/09/10 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
使用Plupload实现直接上传附件至七牛云存储
2014/12/26 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
用原生js做单页应用
2017/01/17 Javascript
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
vue.js的computed,filter,get,set的用法及区别详解
2018/03/08 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
2019/04/08 Javascript
详解微信UnionID作用
2019/05/15 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
2020/10/28 Javascript
python中对list去重的多种方法
2014/09/18 Python
跟老齐学Python之print详解
2014/09/28 Python
python实现基本进制转换的方法
2015/07/11 Python
一篇文章弄懂Python中所有数组数据类型
2019/06/23 Python
新手如何发布Python项目开源包过程详解
2019/07/11 Python
Django 简单实现分页与搜索功能的示例代码
2019/11/07 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
PyTorch在Windows环境搭建的方法步骤
2020/05/12 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
美国电视购物HSN官网:HSN
2016/09/07 全球购物
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
EJB与JAVA BEAN的区别
2016/08/29 面试题
环境工程大学生个人的自我评价
2013/10/08 职场文书
县级文明单位申报材料
2014/05/23 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
小学运动会通讯稿
2015/07/18 职场文书
校长新学期寄语2016
2015/12/04 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
2019年“我为祖国点赞”演讲稿(3篇)
2019/09/26 职场文书
SQL Server中交叉联接的用法详解
2021/04/22 SQL Server
JS异步堆栈追踪之为什么await胜过Promise
2021/04/28 Javascript