前端 ES6 环境下 require 动态引入图片以及问题

文章讨论了在ES6环境中,require和import引入图片的区别,尤其是require动态引入对打包体积的影响。动态引入图片时,使用require的变量拼接或占位符方法会导致体积增大。推荐使用import静态引入或require的占位符方式,并建议利用image-webpack-loader等工具进行图片压缩以减小体积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端 ES6 环境下 require 动态引入图片以及问题

ES6 环境中,通过 require 的方式引入图片很方便,一直以来也没有出过什么问题,后来项目中,需要动态引入图片。

require 动态引入也容易实现,百度也能搜到很多博客介绍。

偶然发现项目中 require 引入图片好像对打包体积影响挺大,js 会变大很多,经过测试,终于确定原因,这里记录一下。

本文主要包括:require 引入图片方式、打包体积对比。


import 引入与 require 引入区别

在 ES6 中,import 语句是静态执行的,意味着它们在模块内部的顶层执行,并且在模块内部创建一个局部作用域。

这意味着导入的变量只在模块内部可见,并且不会影响模块外部的变量。因此,使用 import 导入的变量是不会被提升的。

require 函数是动态执行的,这意味着它在运行时执行,并且不会在模块内部创建一个局部作用域。

因此,使用 require 导入的变量是可以被提升的。

如何理解import语句是静态执行的和require函数是动态执行的?

理解 import 语句是静态执行的和require函数是动态执行的,需要先了解这两个概念的含义。

静态执行是指在编译阶段就能够确定其执行结果的代码执行方式。

在 JavaScript 中,import 语句属于静态执行的代码,也就是说,当 JavaScript 引擎执行代码时,会在编译阶段对 import 语句进行静态分析,确定所导入的模块,并在运行时加载这些模块。

动态执行是指在运行时才能确定其执行结果的代码执行方式。

在 JavaScript 中,require 函数属于动态执行的代码,也就是说,当 JavaScript引 擎执行代码时,会在运行时动态地确定所需的模块,并加载这些模块。

因此,可以理解为:

import 语句是静态执行的,因为在编译阶段就能够确定所导入的模块,从而在运行时快速加载这些模块。
require 函数是动态执行的,因为在运行时才能够确定所需的模块,需要动态地加载这些模块。

值得注意的是,由于 import 语句是静态执行的,因此在代码中不能使用变量或表达式作为模块路径,而只能使用字符串字面量。而 require 函数则可以接受变量或表达式作为模块路径,从而动态地确定所需的模块。

详细解释见:一文了解js中导入模块import、import()和require()的区别

require 引入图片方式

1. 静态引入。

静态引入没什么可说的,根据相对位置或者绝对位置引入即可。

require('@/south/assets/image/skybox/sky1/00h+00.jpg')
require('../assets/image/skybox/sky1/00h+00.jpg')

在这里插入图片描述

在这里插入图片描述

2. 动态引入图片

动态引入基本是有两种方式,实际效果相同,但是对体积的效果相差挺大。

第一种方式,变量拼接:

const imgName = "00h+00";
require('../assets/image/skybox/sky1/' + imgName + '.jpg')

第二种方式,占位符:

const imgName = "00h+00";
require(`../assets/image/skybox/sky1/${imgName}.jpg`);

打包体积对比

引入图片体积,大概有 100K,0.1M:

在这里插入图片描述

1. 未使用 require 的体积。

在这里插入图片描述

2. 静态引入后的体积。

在这里插入图片描述

assets by status 4.64 MiB [compared for emit] 319 assets
+ 50 assets
orphan modules 13.6 MiB [orphan] 1484 modules
runtime modules 7.47 KiB 13 modules
cacheable modules 13.1 MiB
  modules by path ./node_modules/.store/ 563 KiB 25 modules
  modules by path ./src/south/ 12.5 MiB
    ./src/south/south.js + 1408 modules 12.5 MiB [built] [code generated]
    ./src/south/assets/image/cluster/mark_red.png 2.48 KiB [built] [code generated]
  data:text/plain;base64,iVBORw0KGgoAAAAN.. 1.06 KiB [built] [code generated]
  url (ignored) 15 bytes [built] [code generated]
  zlib (ignored) 15 bytes [built] [code generated]
  https (ignored) 15 bytes [built] [code generated]
  http (ignored) 15 bytes [built] [code generated]

WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
This can impact web performance.
Assets:
  staticForMap/js/south.cesium.js (4.05 MiB)
  staticForMap/sphere/Assets/approximateTerrainHeights.json (268 KiB)
  staticForMap/sphere/Assets/Textures/waterNormals.jpg (287 KiB)
  staticForMap/js/south.cesium.js.gz (1.07 MiB)

WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact w
eb performance.
Entrypoints:
  south (4.05 MiB)
      staticForMap/js/south.cesium.js


webpack 5.88.2 compiled with 2 warnings in 71740 ms

3. 使用 require 拼接变量的体积。
在这里插入图片描述
3. 使用 require 占位符的体积。
在这里插入图片描述

总结

如果项目本身体积很小,建议尽量不使用 require 方式引入图片。

使用 require 方式引入图片的话,尽量使用静态方式,必须动态引入的话,推荐使用占位符的方式引入。

在这里插入图片描述
另外,可以使用 image-webpack-loader 等工具进行压缩,体积会小很多。

在这里插入图片描述

另外,使用 webpack 配置 image-webpack-loader 压缩之后,会好很多!

IVMS-4200用户手册云盘是指将IVMS-4200软件用户手册存储在云盘上的一种方式。IVMS-4200是海康威视(Hikvision)公司开发的一款视频监控管理软件,用户手册是为了帮助用户更好地了解和使用该软件而编写的说明书。 云盘是指通过网络将数据存储在云服务器上,用户可以通过网络访问、传输和管理云盘中的数据。将IVMS-4200用户手册存储在云盘上有以下几个优点: 首先,便捷性。用户无需下载和安装软件,只需通过浏览器登录云盘账号,就可以随时随地查阅用户手册。无论在何地、何时,只要有网络连接,就能方便地获取手册内容。 其次,共享性。云盘是一个共享的平台,多个用户可以同时访问同一个云盘上的用户手册。这就方便了团队协作和知识共享,不同用户之间可以互相学习和交流使用经验。 再次,实时更新。云盘上存储的用户手册可以随时进行更新和替换。开发者可以在云盘上上传新版本的手册,用户只需刷新页面即可查看最新的内容,减少了传统的纸质手册印刷、分发和更新的时间和成本。 最后,安全性。云盘通常具有安全机制,如账号密码验证、数据加密等,确保用户手册的安全性和隐私性。即使用户的电脑或移动设备丢失或损坏,手册仍然安全保存在云盘上,用户不会丢失使用说明。 综上所述,将IVMS-4200用户手册存储在云盘上,可以提高使用者的便捷性、共享性、实时更新性和安全性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非科班Java出身GISer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值