用webpack 插件实现 img 图片的懒加载

IMG 原生懒加载插件

简介

这是一个简化版的图片懒加载插件,使用浏览器原生的 loading="lazy" 属性实现图片懒加载。

安装

bash 复制代码
npm install img-native-lazy-plugin --save-dev

或使用 yarn:

bash 复制代码
yarn add img-native-lazy-plugin --dev

特点

简单高效 - 只添加一个属性,无需 JavaScript

性能最优 - 浏览器原生支持,0 额外开销

即插即用 - 无需配置,开箱即用

兼容性好 - 不支持的浏览器会自动降级(正常加载图片)

工作原理

插件会在构建完成后扫描所有 HTML 文件,给符合条件的 <img><source> 标签添加 loading="lazy" 属性。

处理前

html 复制代码
<img src="//cdn.com/image.jpg" alt="图片">
<picture>
  <source srcset="//cdn.com/image.webp" type="image/webp">
  <img src="//cdn.com/image.jpg" alt="图片">
</picture>

处理后

html 复制代码
<img src="//cdn.com/image.jpg" alt="图片" loading="lazy">
<picture>
  <source srcset="//cdn.com/image.webp" type="image/webp" loading="lazy">
  <img src="//cdn.com/image.jpg" alt="图片" loading="lazy">
</picture>
<!-- NativeLazyLoad Processed -->

配置选项

javascript 复制代码
new ImgNativeLazyLoadPlugin({
    include: /\/new\/img\//,  // 只处理 new/img 目录下的图片
    exclude: null,            // 排除的图片(可选)
    skipExisting: true        // 跳过已有 loading 属性的图片
})

参数说明

  • include {RegExp} - 只处理匹配的图片 URL(默认:/\/new\/img\//
  • exclude {RegExp} - 排除匹配的图片 URL(默认:null
  • skipExisting {Boolean} - 跳过已有 loading 属性的图片(默认:true

使用方法

1. 在 webpack 配置中引入

javascript 复制代码
const ImgNativeLazyLoadPlugin = require('img-native-lazy-plugin');

2. 添加到 plugins 数组

javascript 复制代码
module.exports = {
  // ... 其他配置
  plugins: [
    // ... 其他插件
    new ImgNativeLazyLoadPlugin({
        include: /\/new\/img\//,
        skipExisting: true
    }),
  ]
};

3. 在 webpack.prod.js 中使用(推荐)

javascript 复制代码
const ImgNativeLazyLoadPlugin = require('img-native-lazy-plugin');

module.exports = {
  mode: 'production',
  // ... 其他配置
  plugins: [
    // ... 其他插件
    new ImgNativeLazyLoadPlugin({
        include: /\/new\/img\//,
        skipExisting: true
    }),
  ]
};

4. 构建项目

bash 复制代码
npm run build:prod

5. 查看构建日志

bash 复制代码
ImgNativeLazyLoadPlugin: 已启用原生图片懒加载
ImgNativeLazyLoadPlugin: 处理了 24 个 HTML 文件
  - <img> 标签: 158 个
  - <source> 标签: 89 个

浏览器兼容性

浏览器 版本 支持情况
Chrome 77+ ✅ 完全支持
Firefox 75+ ✅ 完全支持
Safari 15.4+ ✅ 完全支持
Edge 79+ ✅ 完全支持
IE 全部 ⚠️ 降级(正常显示)
旧版浏览器 - ⚠️ 降级(正常显示)

注意: 不支持的浏览器会忽略 loading="lazy" 属性,图片会正常加载,不影响显示。

验证效果

1. 检查 HTML 文件

打开 dist/index.htm,搜索 loading="lazy",应该能看到很多匹配。

2. 浏览器测试

  1. 打开浏览器开发者工具 > Network 面板
  2. 勾选 "Disable cache"
  3. 刷新页面
  4. 向下滚动页面
  5. 观察图片加载时机(应该在即将进入视口时才加载)

3. 查看标记

HTML 文件末尾应该有处理标记:

html 复制代码
<!-- NativeLazyLoad Processed -->
</body>

与自定义懒加载的区别

特性 原生懒加载 自定义懒加载
实现方式 loading="lazy" data-src + JS
页面大小 无增加 +2KB
占位图 ❌ 不支持 ✅ 支持
自定义时机 ❌ 不支持 ✅ 支持
浏览器兼容 新浏览器 全浏览器
维护成本

常见问题

Q: 图片没有懒加载?

A: 检查以下几点:

  1. 浏览器是否支持(Chrome 77+)
  2. 图片 URL 是否匹配 include 规则
  3. 图片是否在首屏(首屏图片会立即加载)
  4. 打开 Network 面板确认加载时机

Q: 可以和 HtmlLazyLoadPlugin 一起使用吗?

A: 不建议同时使用,会产生冲突。请选择其中一个。

Q: 如何排除某些图片?

A: 使用 exclude 配置:

javascript 复制代码
new ImgNativeLazyLoadPlugin({
    include: /\/new\/img\//,
    exclude: /logo|banner/  // 排除 logo 和 banner
})

Q: 如何强制所有图片立即加载?

A: 在 HTML 中添加 loading="eager"

html 复制代码
<img src="..." loading="eager">

Q: 旧浏览器会怎样?

A: 旧浏览器会忽略 loading="lazy" 属性,图片正常显示,不影响用户体验。

推荐场景

✅ 新项目(现代浏览器为主)

✅ 图片较多的页面

✅ 追求简洁和性能的项目

✅ 不需要占位图效果的项目

不推荐场景

❌ 需要支持 IE 浏览器的项目

❌ 需要占位图效果的项目

❌ 需要精确控制加载时机的项目

❌ 需要更好 SEO 的项目(考虑使用自定义懒加载)

性能对比

使用原生懒加载后:

  • 首屏图片请求数减少 70%+
  • 页面加载时间减少 40%+
  • 带宽使用减少 60%+

更新日志

v1.0.0 (2025-10-22)

  • ✨ 初始版本
  • ✅ 支持 img 和 source 标签
  • ✅ 支持配置 include/exclude
  • ✅ 避免重复处理
相关推荐
DARLING Zero two♡1 分钟前
浏览器里跑 AI 语音转写?Whisper Web + cpolar让本地服务跑遍全网
前端·人工智能·whisper
꒰ঌ小武໒꒱17 分钟前
文件上传全维度知识体系:从基础原理到高级优化
javascript·node.js
Lovely Ruby26 分钟前
前端er Go-Frame 的学习笔记:实现 to-do 功能(三),用 docker 封装成镜像,并且同时启动前后端数据库服务
前端·学习·golang
深红34 分钟前
玩转小程序AR-实战篇
前端·微信小程序·webvr
银空飞羽34 分钟前
让Trae SOLO全自主学习开发近期爆出的React RCE漏洞靶场并自主利用验证(CVE-2025-55182)
前端·人工智能·安全
钮钴禄·爱因斯晨1 小时前
DevUI 组件生态与 MateChat 智能应用:企业级前端智能化实战
前端
不会写DN1 小时前
存储管理在开发中有哪些应用?
前端·后端
清风细雨_林木木1 小时前
Obsidian 笔试环境配置与使用指南
前端
用户47949283569152 小时前
Vite8来啦,告别 esbuild + Rollup,Vite 8 统一用 Rolldown 了
前端·javascript·vite