本文档描述了 Hugo 的资源管理系统,该系统处理图像、CSS、JavaScript 和其他文件等各种类型的资源。资源管理系统提供了统一的接口来加载、转换和发布这些资源。
该系统支持以下关键功能:
有关特定图像处理功能的信息,请参阅 图像处理。
资源管理系统建立在处理不同类型资源的接口和实现的分层结构之上。
来源:resources/resource/resourcetypes.go71-156 resources/resource.go42-56 resources/image.go49-54
| 接口 | 描述 |
|---|---|
resource.Resource | 所有资源的基础接口 |
resource.ContentResource | 可以访问内容的资源 |
resource.ReadSeekCloserResource | 可以读取的资源 |
images.ImageResource | 图像资源的专用接口 |
| 实现 | 描述 |
|---|---|
resources.genericResource | 大多数资源的通用实现 |
resources.imageResource | 图像资源的实现 |
resources.resourceAdapter | 资源转换的适配器 |
tpl/resources 包提供了几种加载或创建资源的方法。
来源:resources/resource_factories/create/create.go45-121 tpl/resources/resources.go90-145 tpl/resources/resources.go234-245
| 方法 | 描述 | 示例 |
|---|---|---|
.Resources.Get | 从页面包中获取资源 | {{ $image := .Resources.Get "image.jpg" }} |
.Resources.Match | 从页面包中获取匹配的资源 | {{ $images := .Resources.Match "images/*.jpg" }} |
resources.Get | 从 assets 目录获取全局资源 | {{ $css := resources.Get "css/styles.css" }} |
resources.Match | 获取匹配的全局资源 | {{ $images := resources.Match "images/*.png" }} |
resources.GetRemote | 从远程 URL 加载资源 | {{ $image := resources.GetRemote "https://example.com/image.jpg" }} |
resources.FromString | 从字符串创建资源 | {{ $js := "var x = 1;" | resources.FromString "js/script.js" }} |
转换管道是资源管理系统的关键功能,允许对资源进行链式转换。
来源:resources/transform.go94-370 resources/transform.go634-661
转换过程通过 ResourceTransformation 接口实现。
每次转换
常见的转换包括:
| 转换 | 描述 | 示例 |
|---|---|---|
| Minify(最小化) | 减小文件大小 | `{{ $css := resources.Get "css/styles.css"` |
| Fingerprint(指纹) | 将内容哈希添加到文件名 | `{{ $js := resources.Get "js/script.js"` |
| Concat(连接) | 合并多个资源 | `{{ $js := slice $js1 $js2` |
| ExecuteAsTemplate(作为模板执行) | 作为 Go 模板处理 | `{{ $tmpl := resources.Get "tmpl.html"` |
来源:resources/transform.go94-99 tpl/resources/resources.go267-301
Hugo 使用多级缓存系统来处理资源,以提高性能,特别是对于图像处理等计算密集型操作。
来源:resources/resource_spec.go110-115 resources/image_cache.go29-125 resources/resource_cache.go31-58
内存缓存:在内存中缓存,其生命周期持续整个构建过程。
dynacache.Cache 实现。文件缓存:磁盘缓存,在不同构建之间持久存在。
filecache.Cache 实现。缓存系统确保资源仅在必要时进行转换,从而显著提高构建性能。
Hugo 提供了一个全面的图像处理系统来处理图像。这通过 images.ImageResource 接口实现。
来源:resources/image.go1-143 resources/images/image.go1-178 resources/image_cache.go1-125
| 操作 | 描述 | 示例 |
|---|---|---|
Resize(缩放) | 改变尺寸 | {{ $img := $original.Resize "300x200" }} |
Crop(裁剪) | 裁剪一部分 | {{ $img := $original.Crop "300x200 TopLeft" }} |
Fill(填充) | 缩放并裁剪以填充 | {{ $img := $original.Fill "300x200" }} |
Fit(适应) | 缩放以适应 | {{ $img := $original.Fit "300x200" }} |
过滤器 | Apply filters(应用滤镜) | {{ $img := $original.Filter (images.GaussianBlur 5) }} |
进程 | Generic processing(通用处理) | {{ $img := $original.Process "resize 300x" }} |
来源:resources/image.go207-293 resources/images/image.go176-354
可以通过在处理操作中指定目标格式,在图像之间进行转换。
支持的格式包括 JPEG、PNG、GIF、TIFF、BMP 和 WebP。
来源:resources/images/config.go47-70 resources/image.go200-232
资源在访问其永久链接时发布到输出目录。
当对资源调用 .Permalink 或 .RelPermalink 时
资源可以配置为延迟发布,即文件创建被推迟直到访问永久链接。
来源:resources/resource.go493-534 resources/transform.go397-409
资源提供各种元数据和函数来访问其属性。
| 属性 | 描述 | 示例 |
|---|---|---|
.Name | 资源名称 | {{ $resource.Name }} |
.Title | 资源标题 | {{ $resource.Title }} |
.ResourceType | 资源类型 | {{ $resource.ResourceType }} |
.MediaType | 媒体类型 | {{ $resource.MediaType }} |
.Params | 自定义参数 | {{ $resource.Params.author }} |
.Data | 关联数据 | {{ $resource.Data.Integrity }} |
.Content | 资源内容 | {{ $resource.Content }} |
.Permalink | 绝对 URL | {{ $resource.Permalink }} |
.RelPermalink | 相对 URL | {{ $resource.RelPermalink }} |
| 属性 | 描述 | 示例 |
|---|---|---|
.Width | 图像宽度 | {{ $image.Width }} |
.Height | 图像高度 | {{ $image.Height }} |
.Exif | EXIF 元数据 | {{ $image.Exif.Date }} |
.Colors | 主色调 | {{ $image.Colors }} |
来源:resources/resource/resourcetypes.go71-156 resources/image.go78-143
Hugo 提供了几种处理资源集合的方法。
| 方法 | 描述 | 示例 |
|---|---|---|
resources.Match | 获取匹配的资源 | {{ $images := resources.Match "images/*.jpg" }} |
resources.ByType | 按资源类型过滤 | {{ $images := resources.ByType "image" }} |
resources.Concat | 合并资源 | {{ $js := slice $js1 $js2 | resources.Concat "js/bundle.js" }} |
来源: tpl/resources/resources.go176-231 resources/resource_factories/create/create.go155-174
Hugo 的资源管理系统提供了一种强大而灵活的方式来处理各种类型的资产。它结合了高效的加载、强大的转换和智能的缓存,以提供高性能,同时提供广泛的功能。
理解这个系统对于开发或扩展 Hugo 的资源处理能力至关重要,特别是对于实现新的资源转换或优化现有资源。
来源: resources/resource.go1-718 resources/transform.go1-767 tpl/resources/resources.go1-331