前面文章中 体验了webpack的打包解析css资源 ,接下来看看项目中常用到的图片、字体、文件该怎么处理吧~

项目路径如下,在上一篇 解析css资源 项目基础上增加了一些文件

demo
├─ src
│ ├─ css
│ │ ├─ index.css
│ │ └─ file.css (+)
│ ├─ img
│ │ ├─ portrait.png (+)
│ │ └─ sky.jpg (+)
│ ├─ js
│ │ ├─ component.js
│ │ └─ createElement.js (+)
│ └─ index.js
├─ index.html
├─ package.json
└─ webpack.config.js

在 createElement.js 分别创建一个 div 元素设置背景图片、img 选择引入图片链接。

// createElement.js
const imageEl = new Image();
const portrait = require("../img/portrait.png");
imageEl.src = portrait;
document.body.appendChild(imageEl); const divEl = document.createElement("div");
divEl.style.width = "200px";
divEl.style.height = "200px";
divEl.className = "div-el";
document.body.appendChild(divEl); // file.css
.div-el {
  background: url("../img/sky.jpg") top center/100% no-repeat;
  display: inline-block;
} // index.css
@import './file.css';

no loaders

直接通过 npm run build 是无法通过编译的,会提示没有合适的 loader 处理图片资源

file-loader

file-loader 就是一个可以用来处理图片字体等文件资源的 loader,它的处理方式是将资源复制到打包后的文件夹,并重命名。

通过 npm i file-loader -D 安装依赖,在 webpack.config.js 中配置

因为 file-loader 在webpack5 环境下已经弃用,要想正确处理图片,需要配置两个属性。

  • esModule: false (启用 CommonJS 模块语法)
  • type: "javascript/auto" (停止当前 asset 模块的处理,并再次启动处理时,防止导致 asset 重复)
module.exports = {
// 其它配置省略
  module: {
    rules: [
      {
        test: /\.(jpe?g|png|gif|svg)$/i,
        use: [
          {
            loader: "file-loader",
            options: {
              // 定义复制后的文件名,取原文件名+哈希值6位+原文件后缀
              name: "img/[name]_[hash:6].[ext]",
              esModule: false,
            },
          },
        ],
        type: "javascript/auto",
      },
    ],
  },
};

复制后的资源在 dist/img 文件夹下

在 html 页面引入打包后的 js 文件,通过 live server 可以看到图片显示在页面上

url-loader

url-loader 是另一个可以处理图片字体等文件资源的 loader,它与 file-loader 有些不同

  • file-loader 会复制所有的资源
  • url-loader 只会复制占用空间较大的资源,当资源较小时,会对它进行 base64 编码

通过 npm i url-loader -D 安装依赖,在 webpack.config.js 中配置

url-loader 和 file-loader 一样,在webpack5环境下已经弃用,也需要配置 esModule: falsetype: "javascript/auto" 属性

module.exports = {
// 其它配置省略
  module: {
    rules: [
      {
        test: /\.(jpe?g|png|gif|svg)$/i,
        use: [
          {
            loader: "url-loader",
            options: {
              name: "[name]_[hash:6].[ext]",
// 自定义转成 base64 资源大小,超过 limit 将直接复制资源
              limit: 100 * 1024,
              esModule: false,
            },
          },
        ],
        type: "javascript/auto",
      },
    ],
  },
};

sky.jpg 大小为576kb,portrait.png 为33.2kb,所以 portrait.png 是以 base64 编码的形式展现,sky.jpg 被复制到了打包后的文件夹 img 中

asset module type

在webpack5环境下弃用的 url-loader、file-loader,使用 asset module type 来替代,无需安装依赖,直接在 webpack.config.js 中配置

asset module type 有以下几种类型来对应 url-loader、file-loader

  • asset/resource 实现同 file-loader,复制资源
  • asset/inline 实现同 url-loader,自定义复制资源还是处理成 base64编码
  • asset 实现同url-loader,根据文件大小自动处理

asset module type 的配置会稍微简单一些

module.exports = {
// 其它配置省略
  module: {
    rules: [
      {
        test: /\.(jpe?g|png|gif|svg)$/i,
        type: "asset",
// 对复制后的资源重命名
        generator: {
          filename: "img/assetmodule.[name][ext]",
        },
      },
    ],
  },
};

type为asset 时,大小为576kb的 sky.jpg 和 33.2kb 的 portrait.png 都被直接复制了

字体资源

以上方式也都可以处理字体资源,从 iconfont 上选取图标保存到自己项目并下载到本地

将iconfont.css及ttf、woff文件放到src目录下新增font文件夹中,在 createElement.js 中创建标签、index.css 中引入 iconfont 样式资源

// createElement.js
const addIcon = document.createElement("i");
addIcon.className = "iconfont icon-add";
document.body.appendChild(addIcon); const deleteIcon = document.createElement("i");
deleteIcon.className = "iconfont";
deleteIcon.innerHTML = "";
document.body.appendChild(deleteIcon); // index.css
@import '../font/iconfont.css'

使用 asset module type 来对字体资源进行配置

module.exports = {
  // 其它配置省略
  module: {
    rules: [
      {
        test: /\.(ttf|woff2?)$/i,
        type: "asset/resource",
        generator: {
          filename: "font/[name]_[hash:6][ext]",
        },
      },
    ],
  },
};

两个小图标就能在页面上展示了

音视频等其它资源也都可以使用 file-loader、url-loader、asset module type 处理,亲测有效~

以上就是处理图片字体等文件资源的方式,更多有关webpack的内容可以参考我其它的博文,持续更新中~

asset module type 替代 loader 处理图片字体等文件资源的更多相关文章

  1. Windows系统字体与文件对照表

    源:Windows系统字体与文件对照表 宋体 (TrueType) = SIMSUN.TTF 黑体 (TrueType) = simhei.ttf 楷体_GB2312 (TrueType) = sim ...

  2. 利用 Symbol Type Viewer 工具实现将 pdb 文件 转换为 c\c++ 头文件

    利用 Symbol Type Viewer 工具实现将 pdb 文件 转换为 c\c++ 头文件 一.得到符号 二.将符号转换为 .h 文件 三.得到 c\c++ 头文件,之后编程时直接导入这个文件即 ...

  3. js 获取input type="file" 选择的文件大小、文件名称、上次修改时间、类型等信息

    文件名的传递 ---全路径获取 $('#file').change(function(){ $('#em').text($('#file').val()); }); 文件名的传递 ---只获取文件名 ...

  4. node 报错:Uncaught Error: Cannot find module "!!../../../node_modules/extract-webpack-plugin/loader.js

    问题出在缺少less和less-loader  因为以上模块使用了less解析. 解决方法在dependencies添加 "less": "^2.7.1", & ...

  5. webpack学习笔记一:安装webpack、webpack-dev-server、内存加载js和html文件、loader处理非js文件

    一 .webpack学习环境准备: 1:window系统 2:安装node.js  官方网址 下载好后下一步下一步安装即可 安装步骤略过....... 3:nrm的安装 打开cmd命令控制台 输入:n ...

  6. 11 loader - 配置处理scss文件的loader

    1.装包 cnpm i sass-loader -D peerDependencies WARNING sass-loader@* requires a peer of node-sass@^4.0. ...

  7. 10 loader - 配置处理less文件的loader

    第一步:装包 cnpm i less-loader -D 安装完提示警告 peerDependencies WARNING less-loader@* requires a peer of less@ ...

  8. SQL LOADER 的用法 TXT文件导入非常之快

    前提,需要本地安装ORACLE 客户端 控制文件 cms.ctl load dataCHARACTERSET UTF8infile 'oracle.txt'APPEND INTO TABLE JR f ...

  9. WPF使用第三方的字体(TTF文件)

    一.准备好你要使用的字体文件,以TTF结尾的文件,然后复制到项目中,并设置Build Action(生成操作)为Resource(资源): 二.在App.xaml中或者你需要的地方添加资源的定义: & ...

  10. DotNetNuke-DNN Module模块引用自定义CSS或者JS文件

    当新增一个module时,有时会引用自定义的或者第三方CSS.JS文件. 1.添加自定义的CSS时,可以直接在module的根目录下添加module.css,然后框架会自动加载此CSS: 2.这个比较 ...

随机推荐

  1. ai问答:使用 Vue3 组合式API 和 TS 封装 echarts 折线图

    使用这个组件时,只需要传入合适的chartData数组,就可以渲染一个折线图,并且响应数据变化. <template> <div ref="chart" styl ...

  2. C# 实现窗体启动时隐藏

    在某些时候需要实现一个界面的后台程序,程序自动运行,但起初不显示窗体,在满足触发条件时显示,此时需要在运行程序时先自动隐藏窗体. 修改窗体对应的Program.cs: using System; us ...

  3. 自动化运维工具-Ansible PlayBook

    自动化运维工具-Ansible PlayBook PlayBook基本概念 PlayBook的组成 PlayBook即"剧本","兵书"之意,PlayBook是 ...

  4. 2022-07-28:以下go语言代码输出什么?A:AA;B:AB;C:BA;D:BB。 package main import ( “fmt“ ) func main() { f

    2022-07-28:以下go语言代码输出什么?A:AA:B:AB:C:BA:D:BB. package main import ( "fmt" ) func main() { f ...

  5. 2022-01-20: 矩形区域不超过 K 的最大数值和。 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。 题目数据保证总会存在一

    2022-01-20: 矩形区域不超过 K 的最大数值和. 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和. 题目数据保证总会存在一 ...

  6. 2021-06-20:已知一个消息流会不断地吐出整数 1~N,但不一定按照顺序依次吐出。如果上次打印的序号为i, 那么当i+1出现时,请打印 i+1 及其之后接收过的并且连续的所有数,直到1~N全部接

    2021-06-20:已知一个消息流会不断地吐出整数 1~N,但不一定按照顺序依次吐出.如果上次打印的序号为i, 那么当i+1出现时,请打印 i+1 及其之后接收过的并且连续的所有数,直到1~N全部接 ...

  7. tkinter的Entry设置为不可编辑状态

    前 首先我们知道,tkinter中有许许多多的控件,其中使用频繁的控件之一就是Entry(输入框),那么怎么设置它为不可编辑状态呢? state选项 一般我们在写Entry的时候只传入了一个maste ...

  8. docker +node 部署vue项目的心路历程

    最近自己做了个小项目,试着使用docker来进行发布,而其中用到了node做跨越代理,就是为了解决这个问题至少多花费了我一天时间,不说了直接进入主题吧 step 1 部署环境 1 安装 centos ...

  9. 聊聊分布式解决方案Saga模式

    Saga模式 Saga模式使用一系列本地事务来提供事务管理,而一个本地事务对应一个Saga参与者,在Saga流程里面每一个本地事务只操作本地数据库,然后通过消息或事件来触发下一个本地事务,如果其中一个 ...

  10. Unity框架与.NET, Mono框架的关系

    什么是C# C#是一种面向对象的编程语言. 什么是.NET .NET是一个开发框架,它遵循并采用CIL(Common Intermediate Language)和CLR(Common Languag ...