用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
  • ✅ 避免重复处理
相关推荐
打小就很皮...4 小时前
Steps + Input.TextArea + InfiniteScroll 联调优化
前端·react.js
皓月Code4 小时前
第四章、路由配置
前端·javascript·react.js·1024程序员节
Mr.Jessy5 小时前
JavaScript学习第六天:函数
开发语言·前端·javascript·学习·html·1024程序员节
code_YuJun5 小时前
管理系统——应用初始化 Loading 动画
前端
oak隔壁找我5 小时前
JavaScript 模块化演进历程:问题与解决方案。
前端·javascript·架构
Elieal6 小时前
AJAX 知识
前端·ajax·okhttp
sulikey6 小时前
Qt 入门简洁笔记:从框架概念到开发环境搭建
开发语言·前端·c++·qt·前端框架·visual studio·qt框架
烛阴7 小时前
循环背后的魔法:Lua 迭代器深度解析
前端·lua
元拓数智7 小时前
现代前端状态管理深度剖析:从单一数据源到分布式状态
前端·1024程序员节