webpack 自定义loader

news2025/2/28 19:48:06

文章目录

    • 项目目录
    • 搭建项目
    • my-raw-loader
      • 参数
      • schema-utils
    • tpl-loader

项目目录

让我们实现一些简易的loader,从大量的简易loader的实现过程中学习编写如何 webpack loader

├── loaders                     # loader目录
├── src                         # 业务代码
│   │── index.html
│   └── index.js										
├── .gitignore
├── package.json
├── package-lock.json
└── webpack.config.js			# webpack 配置文件

搭建项目

mkdir loaders
cd loaders
npm init -y
npm i -D webpack webpack-cli html-webpack-plugin webpack-dev-server loader-utils

webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require('path');

module.exports = {
  mode: 'development',
  plugins: [
    new HtmlWebpackPlugin({
      title: '自定义 webpack loader',
      template: './src/index.html',
    }),
  ],
};

src/index.html

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>

</body>
</html>

src/index.js

import text from './happy-new-year.txt';

const textDom = document.createElement('p');
textDom.style.cssText = 'width: 200px;height: 200px;background-color: pink;';
textDom.innerText = text;
document.body.appendChild(textDom);

my-raw-loader

src/happy-new-year.txt

🎉🎉🎆🎆🧨🧨
新年快乐!大吉大利!
🎉🎉🎆🎆🧨🧨

执行 npx webpack-dev-server,会发现编译报错了

在这里插入图片描述

那么下面我们就实现 my-raw-loader 来抛砖引玉!


webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin');
const path = require('path');

module.exports = {
  mode: 'development',
  module: {
    rules: [
      {
        test: /.txt$/,
        use: [
          {
            loader: path.resolve(__dirname, 'loaders/my-raw-loader'),
            options: {
              esModule: true,
            },
          },
        ],
      },
    ],
  },
  plugins: [
    new HtmlWebpackPlugin({
      title: '自定义 webpack loader',
      template: './src/index.html',
    }),
  ],
};

loaders/my-raw-loader.js

function myRawLoader(source) {
  console.log('source', source);
}

module.exports = myRawLoader;

执行 npx webpack-dev-server 可以看到打印结果,这个参数是一个字符串

在这里插入图片描述


参数

修改 loaders/my-raw-loader.js

function myRawLoader(source) {
  // 提取给定的 loader 选项,
  // 从 webpack 5 开始,this.getOptions 可以获取到 loader 上下文对象。它用来替代来自 loader-utils 中的 getOptions 方法。
  const { esModule } = this.getOptions();
  console.log('esModule:', esModule);

  // 这里一定要返回字符串或者 buffer
  if (!esModule) {
    return `module.exports = ${JSON.stringify(source)}`;
  }
  return `export default ${JSON.stringify(source)}`;
}

module.exports = myRawLoader;

执行 npx webpack-dev-server可以看到通过 this.getOptions() 获取到了当前 loader 的配置,并且编译未报错,访问 http://localhost:8080/ 页面得偿所愿!成功读取并渲染了原始文本内容。

在这里插入图片描述

在这里插入图片描述


schema-utils

schema-utils 由webpack 官方提供, 它配合 loader-utils,用于保证 loader 选项,进行与 JSON Schema 结构一致的校验

const { validate } = require('schema-utils');
const schema = {
  type: 'object',
  properties: {
    esModule: {
      type: 'boolean',
    }
  },
  "additionalProperties": false // 是否允许不存在的选项传入
};

function myRawLoader(source) {
  const options = this.getOptions();
  validate(schema, options, {
    name: 'my-raw-loader',
    baseDataPath: 'options',
  });

  // 提取给定的 loader 选项,
  // 从 webpack 5 开始,this.getOptions 可以获取到 loader 上下文对象。它用来替代来自 loader-utils 中的 getOptions 方法。
  console.log('esModule:', options.esModule);

  // 这里一定要返回字符串或者 buffer
  if (!options.esModule) {
    return `module.exports = ${JSON.stringify(source)}`;
  }
  return `export default ${JSON.stringify(source)}`;
}

module.exports = myRawLoader;

如果传入未定义的选项,则会发生编译报错

{
  test: /.txt$/,
  use: [
    {
      loader: path.resolve(__dirname, 'loaders/my-raw-loader'),
      options: {
        esModule2: true,
      },
    },
  ],
},

在这里插入图片描述


tpl-loader

待续,马上…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/557045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库sql语句-----游标和存储过程

关键词&#xff1a; create procedure xxx&#xff08;&#xff09;as.......go 查询&#xff1a; exec ... 从例子中感悟一下&#xff1a; create table cartoon( linenum int, name varchar(50) not null, line varchar(100) not null )insert into cartoon values(1,灰太…

基于SpringBoot+Vue+MybatisPlus的智慧校园系统

智慧校园系统 1. 项目简介2. 项目模块3. 技术栈4. 软件环境4.1 安装数据库4.2 安装数据库客户端Navicat工具4.4 安装IDEA4.4 安装Maven 5. 系统页面5.1 首页登录页5.2 系统功能模块5.3 Swagger2接口文档查阅5.4 运行截图 6. 源代码下载 1. 项目简介 智慧校园管理系统是一个基于…

从零开始Vue3+Element Plus后台管理系统(十三)——富文本编辑器、Markdown编辑器、代码编辑器

早就想着要放几个编辑器的Demo到项目中&#xff0c;这也是项目开始就立下的flag。 今天专门挑选了几款主流编辑器&#xff0c;包括绕不开的富文本编辑器&#xff0c;码农最爱的markdown编辑器&#xff0c;还有用途相对少的代码编辑器。 时间有限的情况下&#xff0c;仅引入4个…

去哪儿酒店数据下载

字段内容包含&#xff1a; id int(11) NOT NULL AUTO_INCREMENT, hotelid varchar(50) DEFAULT NULL, url varchar(200) DEFAULT NULL, hotelname2 varchar(100) DEFAULT NULL, name varchar(100) DEFAULT NULL, province varchar(50) DEFAULT NULL, d…

zabbix安装完成后,无法找到zabbix/bin目录

问题 zabbix安装完成后&#xff0c;无法找到zabbix/bin目录 详细问题 笔者安装zabbix后&#xff0c;自定义item key进行测试。需在zabbix-server 端 切换目录&#xff1a; cd /usr/local/zabbix/bin 执行查询命令&#xff1a; ./zabbix_get -s 192.168.174.132 -p 10050 -k …

Bat批处理中的 FINDSTR用法

linux中的grep等同于win中的findstr命令。可以在txt文本中截取到有特定关键字的行&#xff0c;并显示出来。 grep也可以通过关键字&#xff0c;在一个文件夹下查找多个有这些关键字的文件&#xff0c;并生成结果。 一、findstr命令介绍 findstr是Windows系统自带的命令,简单来说…

chatgpt赋能Python-python_end的用法

简介 Python是一种广泛使用的编程语言&#xff0c;被广泛应用于数据科学&#xff0c;机器学习&#xff0c;网络编程&#xff0c;Web开发等领域。Python内置了许多有用的操作符和关键字&#xff0c;其中包括end。end是Python中一个非常有用的操作符&#xff0c;它可以在将多个输…

C001--Visual C++ 6.0集成开发环境的下载与安装并运行简单的C语言程序

visual c的下载安装过程不复杂&#xff0c;只需要运行setup.exe程序&#xff0c;然后按照安装程序的提示信息进行操作&#xff0c;也可以指定系统文件存放的路径。 目录 一&#xff0c;下载安装集成开发环境 1&#xff0c;流程 2&#xff0c;熟悉visual c工作界面 二&am…

Element-UI介绍:主题定制、自定义组件和插件扩展

部分数据来源&#xff1a;ChatGPT 什么是Element-UI Element-UI是一款简单好用的前端UI库&#xff0c;基于Vue.js开发。它提供了常用的组件和样式&#xff0c;可以帮助我们快速地构建美观、实用的交互界面。 在使用Element-UI开发项目过程中&#xff0c;我们有时遇到了一些特…

chatgpt赋能Python-python_dim

Python dim&#xff1a;将维度降至极致 在机器学习和数据分析领域&#xff0c;我们经常需要处理高维数据。然而&#xff0c;高维数据不仅处理起来麻烦&#xff0c;而且往往也不利于数据分析和模型训练。因此&#xff0c;数据科学家和工程师需要一个有效的方法来降低数据维度。…

【数据结构与算法】- 期末考试

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

python笔记 第一章

学习用到的资源链接&#xff1a;https://pan.baidu.com/s/1Ftptx_9iH9xFYj3NbugMrg?pwd1234 提取码&#xff1a;1234 文章目录 1.1 简介Python版本 1.2 解释器下载Python解释器安装Python解释器验证是否安装 扩展 1.3 PyCharm安装PyCharm基本使用新建项目设置只看项目文件运行…

【深度学习】- 作业6: 图像自然语言描述生成

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

2023 华为 Datacom-HCIE 题库 04--含解析

单选题 1.[试题编号&#xff1a;189921] &#xff08;单选题&#xff09;防火墙双机热备场景下&#xff0c;当VGMP工作在负载分担模式时&#xff0c;为了避免在来回路径不一致的场景下回程流量因没有匹配到会话表项而丢弃的现象&#xff0c;防火墙需要启开一下那些功能&#x…

【vim】从入门到放弃(“四种”模式、常用命令、正则表达式、文件属性、插件安装)

文章目录 一、vim简介二、vim操作2.1 三种模式及其切换2.2 常用命令2.21 命令模式下常用命令2.22 底行模式下常用命令 三、vim进阶3.1 进阶操作3.11 可视化模式3.12 正则表达式3.13 结合其他文本处理命令3.14 修改文件属性&#xff08;编码、格式、权限&#xff09; 3.2 进阶配…

cpu压力测试、平均负载、切换上下文(linux)

和windows下有很多图形化测试工具不同&#xff0c;linux下的压力测试通常需要命令行 一、平均负载 1.查看命令 uptime会给出类似如下的信息 2.说明 三个数值代表1分钟&#xff0c;5分钟&#xff0c;15分钟的平均进程数。 换成更容易理解但不准确的说法就是几个核满载 比如…

目前前端流行的框架总结

框架 前端框架 前端框架一般指用于简化网页设计的框架&#xff0c;使用广泛的前端开发套件&#xff0c;比如&#xff0c;jquery&#xff0c;extjs&#xff0c;bootstrap等等&#xff0c;这些框架封装了一些功能&#xff0c;比如html文档操作&#xff0c;漂亮的各种控件&#x…

取余,取模

目录 一&#xff1a;取整方式 1&#xff1a;向0取整 --- trunc取整函数 2.向-∞取整 --- floor&#xff08;地板&#xff09;函数 3.向∞取整 --- ceil函数 4.四舍五入取整 --- round 函数 5.四种取整方式的对比 二&#xff1a;取模 1.引入 2.取模与取余等价&#xff1f; 一&a…

JavaScript实现通过表格方式显示三角形的代码

以下为实现通过表格方式显示三角形的程序代码和运行截图 目录 前言 一、通过表格方式显示三角形 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.本博文代码可以根据题目要…

5.python列表

文章目录 一、什么是列表二、列表的表示方法三 、列表元素的索引四、访问列表元素五、修改列表元素直接赋值 六、添加列表元素6.1 方法append()6.2 方法insert() 七、删除列表元素7.1 语句del7.2方法pop()7.3方法remove() 八、组织列表8.1倒着打印列表8.2确定列表长度8.3 列表排…