lazysizes include 插件实战:按条件异步加载内容、CSS 与 AMD/ES6 模块的完整指南
前端Web性能【免费下载链接】lazysizesHigh performance and SEO friendly lazy loader for images (responsive and normal), iframes and more, that detects any visibility changes triggered through user interaction, CSS or JavaScript without configuration.项目地址https://gitcode.com/gh_mirrors/la/lazysizes点击查看免费下载lazysizes include 插件plugins/include/ls.include.js是 lazySizes 生态中用于异步按需加载非关键内容HTML 片段、CSS 样式、AMD/ES6 模块的官方扩展。它借助懒加载、优先级队列与加载后预取等机制比同类方案拥有更好的扩展性与性能表现。阅读本文后你将掌握data-include属性驱动的条件化内容加载、通过 CSS 伪元素或 JS 配置条件规则、模块生命周期钩子lazytransform/lazyload/lazyunload、事件拦截与请求改造、多模块状态共享等完整实战能力。一、插件定位与典型使用场景include 插件的核心价值在于把何时加载与加载什么彻底交给声明式属性与条件规则让页面可以在不阻塞首屏的前提下按需注入内容与行为。官方文档给出的典型场景包括根据条件懒加载不同的内容、样式或 JS 模块响应式内容、响应式行为、媒体查询、DOM 元素是否存在、浏览器特性、用户偏好、元素查询等延迟渲染成本高或不可缓存的内容客户端或服务端用 JS 增强文档时渐进式地注入新内容大型项目中大体积 JS/CSS 模块的拆分或延迟加载为条件化JS 行为的初始化/加载与销毁/卸载提供干净简洁的架构DOM 行为的延迟自初始化。从源码角度看该插件通过监听核心的lazybeforeunveil事件挂载到 lazySizes 的加载流程ls.include.js只要元素带有data-include属性插件就会接管其加载动作并执行完整的候选条件匹配逻辑。插件文件同时支持 CommonJS、AMD 与全局安装三种形式且在 lazySizes 尚未加载时会等待lazyunveilread事件自动完成安装ls.include.js因此直接在页面中引入 ls.include.min.js 即可使用。二、基础用法data-include声明式加载最基本的用法是在带有lazyload类的元素上放置data-include属性值为要加载的 URLaside classrelated-articles lazyload>div classdynamic-content lazyload >style html:after { display: none; content: small; } media (min-width: 760px){ html:after { content: medium; } } media (min-width: 980px){ html:after { content: large; } } /style div classdynamic-content lazyload >script window.lazySizesConfig { include: { conditions: { small: (max-width: 480px), custom: function(element, data){ return true || false; } } } }; /script div classdynamic-content lazyload >div classdynamic-content lazyload >script document.addEventListener(lazyincluded, function(e){ // e.target has new content }); /script div classdynamic-content lazyload>div classdynamic-content lazyload>div classslider lazyload >define(function(){ // constructor var Slider function(element,options) { }; Slider.prototype { destroy: function(){} }; // lazysizes include features: // called with the DOM element (data.target) and some other useful data (data.detail) // useful to initialize with the DOM element Slider.lazyload function(data){ var Slider new Slider(data.target); // save instance for destroy / lazyunload // data.element._slider Slider; }; // in case of a conditioned include and // the need to destroy the instance (i.e.: unbind global events) Slider.lazyunload function(data){ // data.target._slider.destroy(); }; // gets invoked with the a simplified XHR object (data.detail) // and the dom element (data.target) Slider.lazytransform function(data){ // var json JSON.parse(data.detail.responseText); // data.detail.response template(json); }; return Slider; });源码中这三个钩子分别由unloadModule、transformInclude、loadModule三个内部函数按固定顺序调用先卸载旧模块lazyunload再对新模块执行lazytransform内容写入后执行lazyloadls.include.js。data对象在三个钩子之间共享因此可以在卸载与初始化之间传递状态。条件切换时的 HTML 重置resetHTML当一个候选包含新标记、而另一个候选只包含 AMD 行为时条件切换会自动重置初始内容div classlazyload>Slider.lazyunload function(data){ // data.element._slider.destroy(); data.resetHTML true; }; //or NewSlider.lazytransform function(data){ // data.element._slider.destroy(); data.resetHTML true; };当内容中不存在需要迁移到新组件的可变状态如输入框等时该选项让清理 HTML 变得极其简单。实现上resetHTML会在模块卸载后触发detail.content回填为已保存的初始内容ls.include.js。一个候选加载多个样式或模块同一候选的多个样式或多个 AMD 模块可以用|,|分隔符配置div classslider lazyload >li a hrefCategory 1 (articles: span classlazyload>const component document.querySelector(.lazy-component); // Modify the request headers when the targeted component kicks off an XHR component.addEventListener(lazyincludeload, function(event) { if (event.detail) { event.detail.xhrModifier function(request, candidate) { request.setRequestHeader(Accept, application/json); } } }); // Transform a JSON response into HTML before it is injected component.addEventListener(lazyincludeloaded, function(event) { if (event.detail.content) { var json JSON.parse(event.detail.content); var html h1 json.title /h1; html div json.body /div; event.detail.content html; } });从源码看XHR 请求固定使用GET方法并带有X-Requested-With: XMLHttpRequest头xhrModifier在request.send()之前被调用ls.include.jslazyincludeloaded的detail还额外暴露text、response、xml、isSuccess等字段便于对响应做精细化处理ls.include.js。注入判断遵循isSuccess !event.defaultPrevented content ! null content ! elem.innerHTML因此通过preventDefault取消lazyincludeloaded可阻止内容写入。八、配置项总览所有 include 配置都通过lazySizesConfig.include对象提供插件的默认值见 ls.include.jscontentElement默认html用于读取 CSScontent值以判定条件的元素选择器window.lazySizesConfig { include: { contentElement: #mediaqueries // html } };conditions默认{}用于创建新的自定义条件字符串媒体查询或函数与 第四节 中的用法一致window.lazySizesConfig { addClasses: true, // good to add loading styles include: { conditions: { small: (max-width: 480px), custom: function(elem, data){ return true || false; } } } };addClasses是 lazySizes 核心的通用选项lazyloading/lazyloaded等加载状态类默认配置见 lazysizes-core.jsinclude 特性与它及所有普通 lazySizes 选项、事件、方法协同工作。map默认{}map选项允许把data-include的值或其解析后的部分映射为另一个字符串常用于将内容与行为分离script window.lazySizesConfig { addClasses: true, // good to add loading styles include: { map: { slider: slider.html amd:path/slider (large), amdSlider: jquery|,|path/ui-slick } } }; /script div classlazyload>!-- markup has>div classdynamic-content lazyload>nav classlazyload>define(function(){ // constructor var Nav function(element,options) { }; Nav.prototype { }; Nav.lazyunload function(data){ //Reset HTML for mobileNav data.resetHTML true; //share the value of the input field with mobileNav data.shareState { searchValue: $(input.search, data.target).val(); }; }; Nav.lazyload function(data){ //check wether mobileNav has shared some data if(data.shareState){ $(input.search, data.target).val(data.shareState.searchValue || ); } }; return Nav; });requireJs与systemJs配置注意要让 AMD 模块amd:或 ES6 模块module:真正走各自的模块加载器必须提供requireJs与/或systemJs选项否则插件会退化为普通的script标签加载window.lazySizesConfig window.lazySizesConfig || {}; window.lazySizesConfig.requireJs function(modules, cb){ window.require(modules, cb); }; window.lazySizesConfig.systemJs function(module, cb){ window.System.import(module).then(cb); };十一、小结include 插件的工作流一个典型的 include 加载流程可以概括为带有data-include的.lazyload元素进入视口触发核心lazybeforeunveil事件插件解析data-include字符串为候选列表含 URL、类型、条件并按include.conditions→customMedia→ 媒体查询/伪元素 content 的顺序求值选出第一个命中候选派发可取消的lazyincludeload允许通过xhrModifier改造 GET 请求并行加载 HTMLXHR、CSSlink、AMD/ES6 模块借助内部队列控制并发优先级依次执行旧模块lazyunload可设resetHTML重置内容、新模块lazytransform可转换响应派发可取消的lazyincludeloaded可改写detail.content随后写入innerHTML派发lazyincluded通知完成并调用新模块lazyload初始化行为。这一套机制让条件化、可回收、渐进增强的内容加载成为可能。更多插件生态信息可参阅 plugins/README.md插件源码与压缩版分别位于 ls.include.js 与 ls.include.min.jslazySizes 核心的默认配置项定义在 lazysizes-core.js。赞分享前端Web性能【免费下载链接】lazysizesHigh performance and SEO friendly lazy loader for images (responsive and normal), iframes and more, that detects any visibility changes triggered through user interaction, CSS or JavaScript without configuration.项目地址https://gitcode.com/gh_mirrors/la/lazysizes点击查看免费下载相关推荐条件模块加载Conditional Module LoadingCherry Studio 按需加载大数据模块的实战指南条件模块加载Conditional Module LoadingCherry Studio 按需加载大数据模块的实战指南 本指南以 .agents/skiAI 应用大模型桌面应用本地部署RAGPolar 项目中的条件模块加载Conditional Module Loading按需加载大体积模块的 React 实战指南Polar 项目中的条件模块加载Conditional Module Loading按需加载大体积模块的 React 实战指南 导读 条件模块加载Con后端前端金融科技PostCSS代码分割按需加载CSS模块的完整实现指南PostCSS代码分割按需加载CSS模块的完整实现指南 PostCSS代码分割是现代前端开发中提升性能的关键技术通过按需加载CSS模块可以显著减少初始加载前端前端构建上一篇如何打造高效MacBook Touch Bar体验Pock界面设计与交互指南下一篇从表单验证到支付安全jQuery Validation Plugin与移动云安全集成终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →