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. 浏览器测试
- 打开浏览器开发者工具 > Network 面板
- 勾选 "Disable cache"
- 刷新页面
- 向下滚动页面
- 观察图片加载时机(应该在即将进入视口时才加载)
3. 查看标记
HTML 文件末尾应该有处理标记:
html
<!-- NativeLazyLoad Processed -->
</body>
与自定义懒加载的区别
| 特性 | 原生懒加载 | 自定义懒加载 |
|---|---|---|
| 实现方式 | loading="lazy" | data-src + JS |
| 页面大小 | 无增加 | +2KB |
| 占位图 | ❌ 不支持 | ✅ 支持 |
| 自定义时机 | ❌ 不支持 | ✅ 支持 |
| 浏览器兼容 | 新浏览器 | 全浏览器 |
| 维护成本 | 低 | 中 |
常见问题
Q: 图片没有懒加载?
A: 检查以下几点:
- 浏览器是否支持(Chrome 77+)
- 图片 URL 是否匹配 include 规则
- 图片是否在首屏(首屏图片会立即加载)
- 打开 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
- ✅ 避免重复处理