loader 在 webpack 编译中起到非常重要的作用,用于对模块的源代码进行转换,比如 css-loader 将 css 代码处理成字符串,style-loader 创建 style 标签将 css 代码添加到 html 页面中。

自定义 loader

新建 node 项目,在 src 文件夹下的 index.js 中简单编写一些代码

const user = {
  name: 'alice',
  age: 20,
};

创建 loaders 文件夹,在文件夹下增加用于处理 loader 的 js 文件,通过 module.exports 函数可以拿到需处理的文件内容,并将处理好的结果返回

module.exports = function (content) {
  console.log('ice-loader>>', content);
  return content + '"@author icecream"';
};

在配置文件 webpack.config.js 中引入自定义的 loader 。定义 loader 方式有两种

  • 通过相对路径引入(这里使用的方式)
  • 通过 resolveLoader 属性配置,默认会去 node_modules 中查询依赖
// 其他配置省略
module: {
    rules: [
      {
        test: /\.js/i,
        use: ['./loaders/ice-loader'],
      },
    ],
  },

通过 webpack 编译文件,在控制台上输出了获取到的文件内容,编译后文件就是通过自定义 loader 返回的内容。

同步异步 loader

通过 loader 处理的数据需要返回 javscript 字符串,有两种方式

  • return 语句返回内容
  • this.callback 函数返回内容

当遇到异步返回的情况时,直接使用以上两种方式是会报错的

需要通过 this.async 函数将处理过程变成异步,this.callback 第一个参数接收 error,如果没有错误则传递 null,其他参数与loader中 module.exports 获取的参数相同

babel-loader

babel-loader 处理 js 代码借助的是 babel 这个工具,我们也可以简易实现一个,取名为ice-babel-loader,使用 babel 的时候需要通过 plugin 或者 presets 定义处理规则

{
  test: /\.js/i,
  use: [
    {
      loader: './loaders/ice-babel-loader',
      options: {
        presets: ['@babel/preset-env'],
      },
    },
  ],
},

babel 工具核心库是 @babel/core,定义处理规则要用到预设 @babel/preset-env,依次安装

const babel = require('@babel/core');

module.exports = function (content) {

  const options = this.getOptions(); // 获取loader中定义的options
  const callback = this.async();   babel.transform(content, options, (err, result) => {
    if (err) callback(error);
    callback(null, result.code);
  });
};

这样我们定义的 ice-babel-loader 就将 es6 的语法转成了 es5

md-loader

Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的 XHTML(或者HTML)文档。

那 md 文件是否可以通过 loader 转换成 html 文档呢?答案是肯定的,已经有一些好用的库给我们提供了这个功能。

marked 用于处理 markdown 格式的文件,highlight.js 用于给 markdown 文件中的代码设置样式

const { marked } = require('marked');
const hljs = require('highlight.js'); module.exports = function (content) {
// 给markdown中的代码增加class属性
  marked.setOptions({
    highlight: function (code, lang) {
      return hljs.highlight(lang, code).value;
    },
  });
  const htmlContent = marked(content);
  return htmlContent;
};

此时通过 md-loader 返回的是普通字符串,不能被 javascript 代码所识别,还需要通过 html-loader 处理。

{
test: /\.md/i,
use: ['html-loader', './loaders/md-loader'],
},

通过 loader 处理后的 md 文件导出的是 javascript 字符串,所以可以直接添加到 body 中查看效果,另外代码的样式显示需要引入 highlight.js 中的 css 文件

// index.js
import code from './doc.md';
import 'highlight.js/styles/default.css';
document.body.innerHTML = code;

这样 markdown 文件就可以在项目中被解析到 html 页面中了

总结

  • 自定义 loader 通过 module.exports 获取获取资源内容,经过一系列处理并返回处理后的结果。
  • 自己编写的 loader 在本地可以直建立文件夹处理资源,开发完成后发布到 npm 仓库可以直接通过下载包的方式引用 loader。

以上就是关于 自定义loader 的介绍, 更多有关 webpack 的内容可以参考我其它的博文,持续更新中~

一起来自定义loader吧的更多相关文章

  1. ASP.NET WebApi通过自定义ControllerSelector来自定义Controller的选择

    在web api中,我们可以通过给Cotroller类添加RoutePrefixAttribute来定义url与Controller之间的映射,但是有时候有一些特殊情况下,我们需要做一些特殊处理来将某 ...

  2. 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 Kubernetes Java客户端 对于Kubernetes集群的操作,官方提供了命令行工具kubectl,这也是我 ...

  3. 使用 antd 的 form 组件来自定义提交的数据格式

    最近使用antd UI 的表单提交数据,数据里面有的是数组,有的是对象.提交的时候还要去校验参数,让人非常头疼.在我仔细看完文档之后,发现 antd 的 form 组件做的非常不错,这些需求通通不是问 ...

  4. 通过jquery来实现文本框和下拉框动态添加效果,能根据自己的需求来自定义最多允许添加数量,实用的jquery动态添加文本框特效

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 通过web.config来自定义output caching缓存

    我们服务器有开启缓存功能, 缓存功能可以减少您访问网站时候网站在服务器里面的编译时间, 大大加快您网站的访问速度, 如果您需要对您网站进行频繁更新的话, 您可以考虑暂时将缓存时间减少,或者暂时关闭缓存 ...

  6. sql结合通配符来自定义转义字符

    1.使用   ESCAPE   关键字,定义转义符.在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符.例如,要搜索在任意位置包含字符串   5%   的字符串,请使用:      WHER ...

  7. [How to]如何通过xib来自定义UIViewController

    代码:https://github.com/xufeng79x/CreateControllerByXib 1.简介 UIViewController实例可以通过代码.storyborad或者xib方 ...

  8. 《TomCat与Java Web开发技术详解》(第二版) 第三章节的学习总结--利用Context元素来自定义web应用的存储位置

    在学习完第三章后(第三章提供的web应用是helloaapp,我将其放到了tomcat/webapps中),对Context元素的作用理解不深:但是当进入第四章后,发现第四章提供的源码包中也有一个叫h ...

  9. 纯CSS3来自定义单选框radio与复选框checkbox

    单选框(radio)自定义样式 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...

  10. Media Session API 为当前正在播放的视频,音频,提供元数据来自定义媒体通知

    google 文档 https://developers.google.cn/web/updates/2017/02/media-session <html lang="zh-cmn- ...

随机推荐

  1. (数据科学学习手札152)geopandas 0.13版本更新内容一览

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,昨天晚上geopandas正式 ...

  2. boot-admin开源项目中有关后端参数校验的最佳实践

    我们在项目开发中,经常会对一些参数进行校验,比如非空校验.长度校验,以及定制的业务校验规则等,如果使用if/else语句来对请求的每一个参数一一校验,就会出现大量与业务逻辑无关的代码,繁重不堪且繁琐的 ...

  3. Xposed框架关于无法在模拟器中下载和激活的问题

    开头 最近xposed不知道出了什么问题,导致安装的时候一直在失败,所以记录下网上参考到的并用于实践中 安装软件 1.模拟器 逍遥游模拟器 安卓7.1 版本.下载地址为: https://www.52 ...

  4. pycharm-professional-2023 下载安装

    PyCharm Professional 是一款针对 Python 编程的集成开发环境 (IDE),由 JetBrains 公司开发和维护.它是 PyCharm 社区版的升级版,提供了更多的功能和工具 ...

  5. Python潮流周刊#4:Python 2023 语言峰会

    你好,我是猫哥.这里记录每周值得分享的 Python 及通用技术内容,本期是特别加更版,聚焦于 Python 官方 2023 年语言峰会的系列博客. 博客原文:https://pythoncat.to ...

  6. 【python基础】复杂数据类型-列表类型(数值列表)

    1.数值列表 列表非常适合用于存储数字集合,而python提供了很多工具,可帮助我们高速地处理数字列表. 1.1 range函数 python的range函数能够轻松的生成连续一系列数字. 其语法格式 ...

  7. 无限分解流----Fork/Join框架

    Fork译为拆分,Join译为合并Fork/Join框架的思路是把一个非常巨大的任务,拆分成若然的小任务,再由小任务继续拆解.直至达到一个相对合理的任务粒度.然后执行获得结果,然后将这些小任务的结果汇 ...

  8. 【HMS Core】华为帐号服务,获取Access Token报错{sub_error:20152,error_description:invalid code,error:1101}

    ​ [问题描述] 华为账号服务,接口获取Access Token报错:{sub_error:20152,error_description:invalid code,error:1101} [问题分析 ...

  9. 【HMS Core】Health Kit注册订阅后,每种设备都会通过相同的回调地址上传数据?

    ​[问题描述1] 注册订阅后,每种设备都会通过相同的回调地址上传数据? [解决方案] 一般和设备关系不大.订阅回调地址只有一个,当用户完成订阅,且用户数据在云端发生变化时,我们会向您提供的订阅地址发送 ...

  10. 现代C++学习指南-具体类

    类作为C++中重要的概念之一,有着众多的特性,也是最迷人的部分! 类是一个加工厂,开发者使用C++提供的各种材料组装这个工厂,使得它可以生产出符合自己要求的数据,通过对工厂的改造,可以精细控制对象从出 ...