Hugo 的资源管道是一个强大的系统,用于处理和转换资源,如图像、CSS、JavaScript 和其他资产。本页描述了资源如何通过 Hugo 的转换管道进行流动,包括资源获取、处理、缓存和发布。
有关特定图像处理功能的更多信息,请参阅图像处理。
资源管道使站点开发者能够:
来源:resources/transform.go resources/resource.go resources/resource_cache.go
Hugo 的资源系统建立在一组接口和实现之上,这些接口和实现代表了不同类型的资源。
在内部,Hugo 使用几个结构体来实现这些接口:
genericResource:基础资源实现,处理大多数常见的资源操作。imageResource:扩展了通用资源,增加了特定于图像的功能。resourceAdapter:包装资源以处理转换链。来源:resources/resource/resourcetypes.go resources/resource.go resources/image.go
资源可以通过三种主要方式获取:
页面资源是页面包的一部分文件。它们可以通过页面上的 .Resources 变量访问。
全局资源是存储在 assets/ 目录中的文件。它们可以使用 resources.Get 函数访问。
远程资源是从外部 URL 获取的。它们可以使用 resources.GetRemote 函数访问。
还可以使用 resources.FromString 函数从字符串创建资源。
来源:resources/resource_factories/create/create.go tpl/resources/resources.go
转换管道是资源处理系统的核心。它允许对资源应用一系列转换。
管道中的每个转换都会收到一个上下文对象(ResourceTransformationCtx),其中包含:
Hugo 提供了许多内置转换:
Resize:将图像调整到指定尺寸。Crop:将图像裁剪到指定尺寸。Fill:缩放并裁剪图像以填充指定尺寸。Fit:缩放图像以适应指定尺寸。Filter:对图像应用滤镜。Process:通用图像处理(组合以上操作)。Minify:压缩 CSS、JS、HTML、XML、JSON 或 SVG 内容。Fingerprint:向文件名添加内容哈希。PostProcess:在构建后处理资源。ExecuteAsTemplate:将内容作为 Go 模板处理。Concat:将多个资源连接成一个。Copy:创建一个资源副本,并指定新的目标路径。此链:
来源:resources/transform.go hugolib/resource_chain_test.go resources/image.go
Hugo 采用复杂的缓存系统来避免重新处理未更改的资源。这对于计算量大的操作(如图像处理)尤其重要。
内存缓存会在构建期间将资源及其转换后的版本存储在内存中。它被组织成不同类型资源的“分区”:
/res1:通用资源。/res2:基于文件的资源。/resr:远程资源。/ress:资源集合。/restransform:转换后的资源。/imgs:图像资源。文件缓存将转换后的资源持久化到磁盘,以跨构建使用。这对于以下情况尤其重要:
Hugo 将这些缓存的资源存储在 .hugo_build.lock 目录中。
Hugo 使用基于内容的哈希来生成转换资源的缓存键。
这确保了只有在资源内容或转换参数发生变化时才会重新处理资源。
来源:resources/resource_cache.go resources/image_cache.go
当资源的 Permalink 或 RelPermalink 方法被调用,或者 Publish 方法被显式调用时,资源会被发布到公共目录。
默认情况下,Hugo 使用惰性发布,这意味着资源仅在需要时才发布。这种情况发生于:
Permalink 或 RelPermalink。Publish 方法。某些资源会立即发布,无论其永久链接是否被访问。这包括:
当资源被发布时:
Hugo 确保每个资源只发布一次,即使其永久链接被多次访问。
来源:resources/resource.go397-537
资源管道与其他 Hugo 系统集成:
资源管道可以通过 Hugo 的模块系统进行扩展,允许:
这是一个高级主题,需要 Go 编程知识,超出了本页的范围。