定义样板化的配置
简化在前端javascript项目中指定响应式图像url的过程。
响应式图像是任何现代,快速网站的关键要素。 用于创建响应图像的工具和服务比比皆是-npm脚本,webpack和babel插件,grunt和gulp任务,尤其是Cloudinary,Imgix和Kraken等平台(仅举几例)。 同样,有许多工具和教程可用于优化图像,生成低分辨率的嵌入式占位符等。
当然,如果没有它自己对图像管理的特殊关注,每个名副其实的CMS或静态网站生成工具也不会完整。 在众多(通常称为)解决方案中,我不断发现自己遇到了一个看似琐碎但最终重要的问题…… 指定了整个网站中使用的所有响应式图像所需的所有图像变体 。
例如, TheGuardian.com上的标准文章图片。 这被渲染为使用11种不同图像变体的<picture>元素。 并使用另外七个作为文章缩略图。 NYTimes.com在其商品图片中使用了一个响应<img>元素,在srcand srcset属性中具有四个变体。
尽管排名最高的是Vox.com 。 其首页上的特色文章图片使用<picture>元素,共有33种不同的图片变体。 文章页面上显示的同一图像使用了另外17种不同的变体(再次是<picture>元素)。 对于不同大小的缩略图,还有更多变体,那就是同一图像的50多个不同版本!
快速指定所有这些导数成为一项挑战,而不是说a **中的正确痛苦。 无论您使用的是哪种环境,无论是使用模板环境(例如Twig或Nunjucks)还是更传统的服务器渲染,还是使用React或Vue等现代javascript框架,问题仍然存在,并且本质上是相同的:
如何以简洁,可重复且理想情况下可重用的方式指定响应式网站所需的大量图像变体?
因此,响应式配置生成器(RCB)是我在这种情况下的经验和沮丧的结果。 我希望至少是答案的开始。
是给谁用的?
RCB被设计为实用程序库,供使用JavaScript渲染的前端开发人员使用。 因此它几乎可以在任何环境下工作-Nunjucks,把手,Angular,Vue,React等。
就个人而言,我已将其应用于使用Nunjucks进行服务器端渲染的项目,以及用于基于Next.js和Gatsby的基于React的项目。
在Gatsby案例中,React Configuration Builder帮助将通过GraphQL从无头CMS提取的数据与Cloudinary上托管的图像进行组合,以使用React进行渲染。
它是如何工作的?
顾名思义,RCB是配置构建器。 用最简单的术语来说,它需要一个规范和一些图像数据,并将两者结合起来以构建一个配置对象,几乎任何模板或组件环境都可以使用它。
对于具有React意识的阅读器,可以将生成的配置对象直接作为props
传递给组件。
这是一个简单的例子:
![](https://i-blog.csdnimg.cn/blog_migrate/3fc798d10ce0ae50d0c34c1eeb66050f.png)
这里发生了什么?
在这个非常简单的示例中,我们使用模板字符串导入并初始化TokenBuilder
实例。 然后设置一个spec对象和一些图像数据,并将它们传递给构建器进行处理。
然后,构建器执行两项关键任务:
- 它扩展了 spec对象的简写格式; 和,
- 它将spec对象解析为最终的url字符串或一组url /描述符对。
在上面的示例中, srcset
字段使用spec对象的简写形式-使用数组指定所需的宽度。 因此,在扩展阶段,构建器将其转换为三个单独的宽度/高度规范。
最后,构建器解析扩展的规范,将其与提供的图像数据和先前配置的模板字符串组合在一起,以生成所需的三个url /描述符对。
整个结果将作为一个普通的旧javascript对象(所有已解析的url为字符串值)返回,可以使用您喜欢的任何模板或视图呈现方式发出。
就其本身而言,这看起来可能并不多。 将这种方法应用于更复杂的结构时,将带来真正的好处-IMO。
以这个沙箱为例。 (继续,我将等待!)
在这里,我们使用内置的CloudinaryBuilder
来处理更复杂的spec对象,以获取完整的<picture>元素。
请注意,RCB将通过它无法识别的任何规范值。 因此,任何媒体,尺寸,高度或标题属性都可以包含在规范中。
spec对象还可以包括顶级选项对象。此处指定的任何键/值对都将与各个规范合并。
这仅有助于减少样板数据和冗余数据,即保持规格干燥。 图像对象的功能也类似于选项对象。 在解析最终输出之前,此处提供的所有键/值对也将与各个规范合并。
最后,值得注意的是,RCB将处理(即扩展和解析)其标识为规范的任何属性值。 规范密钥是src
, srcset
, data-srcset
, placeholder
, lqip
还是其他都lqip
。 如果构建者识别出该规范,它将对其进行处理。 以这种方式,RCB规范对象可用于生成几乎任何图像类型的配置(或道具),包括大多数延迟加载技术。
动机
响应式配置生成器背后的主要动机是提供一种简洁,可组合和可重用的方法来生成响应式图像。 毕竟,RCB使用并产生普通的旧javascript对象,因此可以轻松地将其合并到几乎任何javascript环境,管道或框架中。
但是,更重要的是RCB促进了体系结构上的分离。
特定元素( 图片或图像 )所需的尺寸和变体的实际规范正确地是前端问题。 规范应与负责渲染图像标记的视图层或模板位于同一位置。
任何图像的来源,无论是本地文件系统还是外部图像服务,都是特定于环境的,并且通常会因站点而异,并且在本地开发,暂存和生产中会有所不同。 因此,域,主机名,端口,API密钥和密钥等应在外部进行配置(根据环境变量)。 当然,因为我们都遵循12要素原则,对吗?
最后,要渲染的特定图像是内容管理或数据层的关注点。 该层应该很大程度上不考虑所使用的特定图像服务以及表示方面的问题。 当然也有例外,但是在大多数情况下,内容层中应仅保留少量图像数据。
足以唯一地标识图像,请提供任何其他元数据,例如替代文本,标题,标题和版权信息。 在某些情况下,包括一些其他渲染提示(例如焦点)可能是适当的,以帮助自动裁剪。
在极端情况下,可能需要包括非常明确的渲染数据-作物大小,缩放比例和边界框坐标。 例如,高度艺术指导的英雄形象。 这仍然与响应式配置构建器的设计和意图完全一致。
到目前为止,在使用RCB时,我发现它有助于保持上述关注点的分离。 此外,它还有助于防止出现很多我经常遇到的问题-领域知识会不断深入,深入到组件层次结构中,污染组件,并使重用和维护几乎变得不可能。
灵感
使用Craft CMS作为我选择的网站(无论大小)的平台,我都赞赏并有赖于三个出色的第三方插件。 ImageOptimize和Imager都简化了图像变体的创建。 重要的是,从配置对象创建它们。
但最重要的是,Marion Newlevant出色的Picture插件捕捉了响应图像规范格式的本质。 Marion的插件使我以前摸索过的方法变得更加具体,并为后来的响应式配置构建器奠定了基础。
结论
如果您要构建使用响应式图像(尤其是<picture>元素)的网站,则建议您尝试一下响应式配置生成器。 至少,它应该有助于简化所有这些srcset分辨率的指定。 它甚至可以帮助简化组件组成树,从而更清晰地分离图像处理代码。
下一步
在以后的文章中,我将详细介绍不同的规范格式以及相关的扩展器功能。 以及演示如何使用RCB实施自定义生成器。
参考资料
翻译自: https://hackernoon.com/simplifying-responsive-images-with-responsive-configuration-builder-yp1qs3531
定义样板化的配置