asset module type 替代 loader 处理图片字体等文件资源
前面文章中 体验了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: false、type: "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 处理图片字体等文件资源的更多相关文章
- Windows系统字体与文件对照表
源:Windows系统字体与文件对照表 宋体 (TrueType) = SIMSUN.TTF 黑体 (TrueType) = simhei.ttf 楷体_GB2312 (TrueType) = sim ...
- 利用 Symbol Type Viewer 工具实现将 pdb 文件 转换为 c\c++ 头文件
利用 Symbol Type Viewer 工具实现将 pdb 文件 转换为 c\c++ 头文件 一.得到符号 二.将符号转换为 .h 文件 三.得到 c\c++ 头文件,之后编程时直接导入这个文件即 ...
- js 获取input type="file" 选择的文件大小、文件名称、上次修改时间、类型等信息
文件名的传递 ---全路径获取 $('#file').change(function(){ $('#em').text($('#file').val()); }); 文件名的传递 ---只获取文件名 ...
- node 报错:Uncaught Error: Cannot find module "!!../../../node_modules/extract-webpack-plugin/loader.js
问题出在缺少less和less-loader 因为以上模块使用了less解析. 解决方法在dependencies添加 "less": "^2.7.1", & ...
- webpack学习笔记一:安装webpack、webpack-dev-server、内存加载js和html文件、loader处理非js文件
一 .webpack学习环境准备: 1:window系统 2:安装node.js 官方网址 下载好后下一步下一步安装即可 安装步骤略过....... 3:nrm的安装 打开cmd命令控制台 输入:n ...
- 11 loader - 配置处理scss文件的loader
1.装包 cnpm i sass-loader -D peerDependencies WARNING sass-loader@* requires a peer of node-sass@^4.0. ...
- 10 loader - 配置处理less文件的loader
第一步:装包 cnpm i less-loader -D 安装完提示警告 peerDependencies WARNING less-loader@* requires a peer of less@ ...
- SQL LOADER 的用法 TXT文件导入非常之快
前提,需要本地安装ORACLE 客户端 控制文件 cms.ctl load dataCHARACTERSET UTF8infile 'oracle.txt'APPEND INTO TABLE JR f ...
- WPF使用第三方的字体(TTF文件)
一.准备好你要使用的字体文件,以TTF结尾的文件,然后复制到项目中,并设置Build Action(生成操作)为Resource(资源): 二.在App.xaml中或者你需要的地方添加资源的定义: & ...
- DotNetNuke-DNN Module模块引用自定义CSS或者JS文件
当新增一个module时,有时会引用自定义的或者第三方CSS.JS文件. 1.添加自定义的CSS时,可以直接在module的根目录下添加module.css,然后框架会自动加载此CSS: 2.这个比较 ...
随机推荐
- #Powerbi 利用EOMONTH,计算月度时间进度
在POWERBI中计算本月的时间进度 许多小伙伴在做看板时,往往会遇到需要时间进度的计算,来配合业绩达成的进度,进行比较分析.那么如何在BI做通过公式进行这个数据的求值呢? 首先,我们需要测算两个值, ...
- var,let,const的区别
JS中变量的定义方式有四种 不写var,let,const--直接定义变量 a = 10; 使用var关键字定义 var a = 10; 使用let关键字定义 let a = 10; 使用const关 ...
- 一天吃透SpringCloud面试八股文
1.什么是Spring Cloud ? Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成.Spring cloud Tas ...
- Django4全栈进阶之路14 项目实战(用户管理):base.html基础模板设计
在 Django 中,我们可以使用模板继承来避免代码的重复.模板继承是指我们可以在一个模板中定义一些公共的 HTML 代码,然后在其他模板中继承这个基础模板,并根据需要添加或覆盖一些内容. 通常情况下 ...
- django4 前后端分离和不分离的优缺点
Django4可以采用前后端分离或者不分离两种方式来开发Web应用,它们各有优缺点. 前后端分离的优点: 前后端职责分离:前端负责视图展示.用户交互,后端负责数据处理.逻辑处理,分工明确,开发效率高. ...
- 【GiraKoo】安装Visual Assist失败,提示“此扩展已经安装到所有适用的产品”
[问题解决]安装Visual Assist失败,提示"此扩展已经安装到所有适用的产品" 在安装Visual Assist插件时,提示错误. 点击下一步之后,进入插件安装界面.插件安 ...
- python -- pandas常见的一些行、列操作方法(感兴趣的,可以跟着一起练练手)
这篇文章分享一下pandas常见的一些行.列操作方法,比较基础,感兴趣的童鞋可以看看. 首先,我们用 "random.seed(int i)" 生成一组测试数据. 对于random ...
- 基于.NetCore+React单点登录系统
对于有多个应用系统的企业来说,每一个应用系统都有自己的用户体系,这就造成用户在切换不同应用系统时,就要多次输入账号密码,导致体验非常不好,也造成使用上非常不便. 针对这个问题,我们就可以采用单点登录的 ...
- ShowMeBug 持续升级,提供高信效度支撑的技术招聘方案
去年年底,全新升级版的 ShowMeBug --一款支持实战编程的技术能力评估平台,首次揭开了它神秘的面纱. 而近日,ShowMeBug 再次迎来一系列产品更新,它将以全新的面貌,提供高信效度支撑的技 ...
- 前端vue uni-app列表组件 list组件,简单好用
快速实现uni-app列表组件 list组件,简单好用; 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12675 效果图如下: ...