webpack5新特性Asset Modules资源模块详解

目录
  • 正文
  • 图片打包(asset/resource)
  • publicPath
  • asset/inline 模块
  • asset 模块
  • asset/source 模块

正文

webpack 可以将很多类型的文件写入最后打包的js文件,写入的方法有两种,一个是 Asset Modules 另一个是 Loaders

这一篇我们就来讨论 Asset ModulesAsset Modules(资源模块)是webpack5的新特性,它允许使用资源文件(字体,图标等)而无需配置额外 loader, webpack低版本的处理方式以及详情参考官方文档

资源模块类型(asset module type),通过添加 4 种新的模块类型, 下面引入官文的一部分来直接介绍。

  • asset/resource 发送一个单独的文件并导出 URL。之前通过使用 file-loader 实现。
  • asset/inline 导出一个资源的 data URI。之前通过使用 url-loader 实现。
  • asset/source 导出资源的源代码。之前通过使用 raw-loader 实现。
  • asset 在导出一个 data URI 和发送一个单独的文件之间自动选择。之前通过使用 url-loader,并且配置资源体积限制实现。

图片打包(asset/resource)

将一张图片(jpg/png/jpeg)放在工程文件夹里, 然后写一个加载图片的函数,生产一个图片元素,设置其src等属性,再挂载到body上。文件目录如下

src/
    addImg.js
    cat.jpeg
    index.js

addImg.js 的内容如下

import CatImg from './cat.jpeg';
function addImg () {
    const img = document.createElement('img');
    img.alt = 'Cat';
    img.width = 300;
    img.src = CatImg;
    const body = document.querySelector('body');
    body.appendChild(img);
}
export default addImg;

这里import 一个jpeg后缀的文件,webpack是不知道该如何处理的,我们需要通过wepack.config.js配置

module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, './dist')
    },
    mode: 'none',
    module: {
        rules: [
            {
                test: /\.(png|jpg|jpeg)/,
                type: 'asset/resource'
            }
        ]
    }
}

npm run build之后在浏览器打开html文件,会发现图片已经在页面上渲染了,再观察打包之后的dist文件夹,图片数据也在其中,这就是以assert/resource方式打包的结果,简单讲图片打包进入了dist文件夹, 这和后边的asset/inline(后面会介绍)的方式有直接区别。

publicPath

刚才打包的结果,如果打开浏览器控制台,可以看见img元素的src地址指向了一个本地的绝对路径

这个路径是如何指定的呢?是通过output属性下的publicPath, 其默认值是 "auto", 可以试一下配置了是通过output属性下的publicPath: "auto"和刚才的打包结果是一样的,那么如果想使用相对路径,在本例中用html文件的相对路径去指定图片的src publicPath: 'dist/',打包后同样可以成功渲染图片,但是观察其img的src的指向已经发生了变化,使用的相对路径。

比如实际项目,静态资源会打包到cdn服务器上,那么可以配置 publicPath 为一个具体的cdn地址,如 http://somecdn.com/someasset/, 那么其静态资源路径前缀就会是这个地址。

asset/inline 模块

接着上面的部分,inline主要区别的于 resource是打包的结果,inline会将文件直接以base64的方式写入最后产出的bundle.js 一般情况下,对于一些svg文件使用inline的方式打包是比较合理的,当然对于较大的图片也不是不行,只不过最后bundle.js的体积会变大,这在生产环境不是很理想。

改写对于图片类数据打包的方式为 type: 'asset/inline' 可以从控制台看出打出的包体积变大了,且打开bundle.js看的话会看见base64的部分

那么结论就是这两种打包方式各有利弊,inline虽然把数据写入到js文件中,但也减少了一次网络请求。还是要根据实际的生产需求来决策,理论上一些小的svg要写到bundle中,而大图是分包部署在cdn服务上比较合理。

asset 模块

上面的两种设定都指定了一种绝对的方法,那么有没有更灵活的方式呢?就是asset类型的处理方式。将图片文件处理的方式改为 type: 'asset', 这会根据资源的大小来决定是以inline的方式还是以recource的方式进行打包,其默认值阀值是8kb, 如果文件大小小于8kb,那么文件将以inline的方式进行打包,反之则相当于recource的方式。当然我也可以改写阈值:

module: {
        rules: [
            {
                test: /\.(png|jpg|jpeg)/,
                type: 'asset',
                parser: {
                    dataUrlCondition: {
                        maxSize: 3 * 1024 // 3kb
                    }
                }
            }
        ]
    }

asset/source 模块

source类型一般处理一些文本数据,可以将内容处理成JSstring数据,比如处理txt文件, webpack配置如下

catAlt.txt 文件只有一段字符串

文件引入并以字符串形式调用

可以执行打包看最后的结果,txt里的内容以字符串的形式插入到了img.alt属性上

以上就是webpack5新特性Asset Modules资源模块详解的详细内容,更多关于webpack5特性Asset Modules的资料请关注我们其它相关文章!

(0)

相关推荐

  • vue+webpack 更换主题N种方案优劣分析

    需求:由于业务需要,我们需要做多套皮肤 调研了下当前行业的实现方案,五花八门良莠不齐,在此总结下各种方案有优劣及复杂度,供大家快速定位到符合自己业务的方案,以vue 单页应用为业务场景 方式一:class切换方式 实现: 在每个需要更换的页面定义多个class,根据运行时标识动态的切换class名称实现加载不同的样式,这种方式较为简单 优点: 不需要修改构建工具相关 业务开发过程可以实现,没有限制 支持动态切换 缺点: 逻辑分散耦合在各个页面,一旦需要修改,涉及修改的页面较多 代码需要预先内置,

  • js 交互在Flutter 中使用 webview_flutter

    目录 正文 环境准备 最简示例 WebView 的小大 网页自己报告高度 无法修改页面 在网页中调用 Flutter 页面 拦截 url js 调用 JavaScriptChannel 定义的方法 总结 正文 已经有很多关于 Flutter WebView 的文章了,为什么还要写一篇.两个原因: Flutter WebView 是 Flutter 开发的必备技能 现有的文章都是关于老版本的,新版本 4.x 有了重要变化,基于 3.x 的代码很多要重写. WebView 的文章分两篇 在 Flut

  • electron 中 webview的使用示例解析

    目录 正文 获取webview的dom webview 页面 webview页面的代码 新建public/preload.js文件 监听页面对否显示 禁止打开新窗口 刷新页面 上一页 下一页 正文 webview 想必都有所了解,比如:微信小程序嵌套H5 那么我们在electron中怎么使用webview呢? 我们先跟着官方文档展示一下,看是否能有效果: 若要在应用程序中嵌入网页, 请将 webview 标签添加到应用程序的被嵌入页面中 (这是将显示外来内容的应用程序页). 在最简单的例子中,

  • 详解web如何改变主题配色方法示例

    目录 正文 一.通过在根元素定义选择器来改变主题 定义class 定义dateset 自定义标签属性 二.通过prefers-color-scheme来改变主题 三.通过颜色反转来改变主题 总结 正文 自从苹果系统支持了暗色主题之后,越来越多的网站开始支持暗色模式,来改善用户夜晚使用网站的舒适度,那么一般都是如何处理的呢. 在开始一个项目时,我们通常会将用到的主题色,和一些全局配置,通过css变量定义在根元素,注意,变量必须以"--"开头 :root { --color-primary

  • WebAssembly增强前端应用技巧详解

    目录 准备 开始 创建项目 打包 wasm 前端调用 使用 console.log 总结 准备 此篇文章我们主要使用 Rust 来编写我们的 WebAssembly 工具库然后在 React 应用进行使用.所以需要准备好下列的环境 Rust 开发环境(rustup.rustc.cargo 这些) 前端开发环境(node.npm 这些) wasm-pack (cargo install wasm-pack) 开始 开始前我们先要准备一个前端应用,这里我们使用 create-react-app 来创

  • 2023年了该了解下WebComponent使用教程

    目录 正文 三项主要技术 1.Custom elements (自定义元素) 生命周期函数 2.HTML templates(HTML 模板) 3.Shadow DOM(影子 DOM) 动态创建 webComponent 组件例子 正文 WebComponent 是官方定义的自定义组件实现方式,它可以让开发者不依赖任何第三方框架(如Vue,React)来实现自定义页面组件:达到组件复用效果 一个简单例子,让页面显示 hello world: <body> <!-- 使用组件的方式 --&

  • webpack5新特性Asset Modules资源模块详解

    目录 正文 图片打包(asset/resource) publicPath asset/inline 模块 asset 模块 asset/source 模块 正文 webpack 可以将很多类型的文件写入最后打包的js文件,写入的方法有两种,一个是 Asset Modules 另一个是 Loaders 这一篇我们就来讨论 Asset Modules.Asset Modules(资源模块)是webpack5的新特性,它允许使用资源文件(字体,图标等)而无需配置额外 loader, webpack低

  • iOS12新特性之推送通知详解

    序言 众所周知,iOS中消息推送扮演了不可或缺的位置.不管是本地通知还是远程通知无时不刻的在影响着我们的用户体验,以致于在iOS10的时候苹果对推送大规模重构,独立了已 UserNotifications 和 UserNotificationsUI 两个单独的framework,可见重要性一斑.针对于WWDC18苹果又给我们带来了什么惊喜呢? 新特性 Grouped notifications 推送分组 Notification content extensions 推送内容扩展中的可交互和动态

  • C# 9 新特性之增强的foreach详解

    Intro 在 C# 9 中增强了 foreach 的使用,使得一切对象都有 foreach 的可能 我们来看一段代码,这里我们试图遍历一个 int 类型的值 思考一下,我们可以怎么做使得上面的代码编译通过呢? 迭代器模式 迭代器模式,提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示. 迭代器模式是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部的数据. foreach 其实是一个迭代器模式的语法糖

  • MySQL8新特性之全局参数持久化详解

    目录 前言 全局参数持久化 写在最后 总结 参考文档: 前言 自从 2018 年发布第一版 MySQL 8.0.11 正式版至今,MySQL 版本已经更新迭代到 8.0.26,相对于稳定的 5.7 版本来说,8.0 在性能上的提升是毋庸置疑的! 随着越来越多的企业开始使用 MySQL 8.0 版本,对于 DBA 来说是一个挑战,也是一个机遇!

  • JavascriptES6新特性之map和reduce详解

    目录 说明 1.map() 代码示例: 2.reduce() 代码示例: 综合案例 总结 说明 ES6中,数组新增了map和reduce方法. 1.map() map() :接收一个函数,将原数组中的所有元素用这个函数处理后放入新数组返回. 代码示例: 有一个字符串数组,我们希望转为int数组 let arr = ['1', '20', '-5', '3']; console.log(arr) //传统写法 let newArr = arr.map(function(s) { return pa

  • Java8新特性之精简的JRE详解_动力节点Java学院整理

    Oracle公司如期发布了Java 8正式版!没有让广大javaer失望.对于一个人来说,18岁是人生的转折点,从稚嫩走向成熟,法律意味着你是完全民事行为能力人,不再收益于未成年人保护法,到今年为止,java也走过了18年,java8是一个新的里程碑,带来了前所未有的诸多特性,lambda表达式,Stream API,新的Date time api,多核并发支持,重大安全问题改进等,相信java会越来越好,丰富的类库以及庞大的开源生态环境是其他语言所不具备的,说起丰富的类库,很多同学就吐槽了,j

  • ThinkPHP3.1新特性之字段合法性检测详解

    ThinkPHP3.1版增加了表单提交的字段合法性检测,可以更好的保护数据的安全性.这一特性是3.1安全特性中的一个重要部分. 表单字段合法性检测需要使用create方法创建数据对象的时候才能生效,具体有两种方式: 一.属性定义 可以给模型配置insertFields 和 updateFields属性用于新增和编辑表单设置,使用create方法创建数据对象的时候,不在定义范围内的属性将直接丢弃,避免表单提交非法数据. insertFields 和 updateFields属性的设置采用字符串(逗

  • Redis的新特性懒惰删除Lazy Free详解

    前言 Redis4.0新增了非常实用的lazy free特性,从根本上解决Big Key(主要指定元素较多集合类型Key)删除的风险.笔者在redis运维中也遇过几次Big Key删除带来可用性和性能故障. 本文分为以下几节说明redis lazy free: lazy free的定义 我们为什么需要lazy free lazy free的使用 lazy free的监控 lazy free实现的简单分析 lazy free的定义 lazy free可译为惰性删除或延迟释放:当删除键的时候,red

  • ThinkPHP3.1新特性之内容解析输出详解

    以往版本的ThinkPHP中页面输出的过程是读取模板文件,然后进行模板解析(也支持调用第三方模板引擎解析),但是有一些情况,我们并没有定义模板文件,或者把模板文件保存在数据库里面,那么这种情况下进行页面输出的时候,我们是无法进行模板文件读取的,ThinkPHP3.1版本则针对这样的情况增加了内容解析输出的功能. 内置的模板引擎也进行了完善,如果传入的模板文件不存在的话,则会认为是传入的模板解析内容,因此,ThinkPHP3.1版的View类和Action类也做了一些相应的改进. display方

  • MySQL8新特性:降序索引详解

    前言 MySQL 8.0终于支持降序索引了.其实,从语法上,MySQL 4就支持了,但正如官方文档所言,"they are parsed but ignored",实际创建的还是升序索引. 无图无真相,同一个建表语句,看看MySQL 5.7和8.0的区别. create table slowtech.t1(c1 int,c2 int,index idx_c1_c2(c1,c2 desc)); MySQL 5.7 mysql> show create table slowtech.

随机推荐