配置详解:从默认定义到自定义输出格式)
Hugo 媒体类型media types配置详解从默认定义到自定义输出格式【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址: https://gitcode.com/gh_mirrors/hu/hugoHugo 中的媒体类型Media Type即 MIME 类型是站点输出体系的基石它决定了内容与资源文件如何被识别、模板如何命名以及输出格式output formats如何生成最终文件。本文以 Hugo 官方配置文档为主体结合 media/mediaType.go、media/builtin.go 等源码完整讲解媒体类型的默认配置、delimiter与suffixes参数、如何修改与新建媒体类型以及如何用无后缀媒体类型生成_redirects、_headers这类特殊文件。读完本文你将能独立完成媒体类型的增删改查并正确配合输出格式使用。什么是媒体类型媒体类型Media Type又称 MIME 类型或内容类型Content Type是标识文件格式的顶级类型/子类型两段式标识符。在 Hugo 中媒体类型还会携带一个可选的后缀suffix例如application/rssxml中顶级类型为application子类型为rssxml是 MIME 后缀。从源码看media/mediaType.go 中的Type结构体正是这一概念的实现其核心字段包括Type完整的 MIME 字符串如application/rssxmlMainType顶级类型名如applicationSubType子类型名如rssDelimiter文件名与后缀之间的分隔符默认为.SuffixesCSV以逗号拼接的后缀列表如jpg,jpeg仅在内部使用。FromString负责把text/html或text/htmlhtml这类字符串解析为Typemedia/mediaType.go而FromContent则先借助http.DetectContentType探测内容再结合扩展名提示反查媒体类型media/mediaType.go用于资源内容类型的判定。配置好的媒体类型在 Hugo 中承担多重职责包括内容文件的识别例如text/markdown的后缀md、mdown、markdown会被视为内容文件以及输出格式output formats的定义。可以说媒体类型是输出格式的地基。默认媒体类型配置一览Hugo 内置了一套完整的默认媒体类型。官方文档中的表格即由默认配置生成其完整定义位于 media/builtin.go 的defaultMediaTypesConfig映射中。下表列出全部默认媒体类型及其关联后缀媒体类型后缀suffixestext/calendaricstext/csscsstext/x-scssscsstext/x-sasssasstext/csvcsvtext/htmlhtml、htmtext/javascriptjs、jsm、mjstext/typescripttstext/tsxtsxtext/jsxjsxtext/x-gotmplgotmplapplication/jsonjsonapplication/manifestjsonwebmanifestapplication/rssxmlxml、rssapplication/xmlxmlimage/svgxmlsvgtext/plaintxtapplication/tomltomlapplication/yamlyaml、ymlapplication/source-mapmapimage/pngpngimage/jpegjpg、jpeg、jpe、jif、jfifimage/gifgifimage/tifftif、tiffimage/bmpbmpimage/webpwebpimage/avifavifimage/heifheifimage/heicheicfont/ttfttffont/otfotffont/woffwofffont/woff2woff2application/pdfpdftext/markdownmd、mdown、markdowntext/asciidocadoc、asciidoc、adtext/pandocpandoc、pdctext/rstrsttext/orgorgvideo/x-msvideoavivideo/mpegmpg、mpegvideo/mp4mp4video/oggogvvideo/webmwebmvideo/3gpp3gpp、3gpapplication/wasmwasmapplication/octet-stream无[!NOTE]第一个后缀是主后缀primary suffix。命名模板文件时必须使用主后缀。例如为 RSS feed 创建模板时应使用xml后缀因为application/rssxml的第一个后缀是xml而不是rss。默认配置对应的 hugo.toml 写法上述表格对应的默认配置等价于在hugo.toml或hugo.yaml、hugo.json中写入如下mediaTypes配置块application/octet-stream无后缀可省略[mediaTypes] [mediaTypes.text/calendar] suffixes [ics] [mediaTypes.text/css] suffixes [css] [mediaTypes.text/x-scss] suffixes [scss] [mediaTypes.text/x-sass] suffixes [sass] [mediaTypes.text/csv] suffixes [csv] [mediaTypes.text/html] suffixes [html,htm] [mediaTypes.text/javascript] suffixes [js,jsm,mjs] [mediaTypes.text/typescript] suffixes [ts] [mediaTypes.text/tsx] suffixes [tsx] [mediaTypes.text/jsx] suffixes [jsx] [mediaTypes.text/x-gotmpl] suffixes [gotmpl] [mediaTypes.application/json] suffixes [json] [mediaTypes.application/manifestjson] suffixes [webmanifest] [mediaTypes.application/rssxml] suffixes [xml,rss] [mediaTypes.application/xml] suffixes [xml] [mediaTypes.image/svgxml] suffixes [svg] [mediaTypes.text/plain] suffixes [txt] [mediaTypes.application/toml] suffixes [toml] [mediaTypes.application/yaml] suffixes [yaml,yml] [mediaTypes.application/source-map] suffixes [map]配置参数delimiter 与 suffixes在hugo.toml的mediaTypes配置块中每个媒体类型支持两个参数delimiter: string文件名与后缀之间的分隔符它与后缀共同构成文件扩展名。默认值为.。例如后缀为xml、分隔符为.时扩展名为.xml。suffixes: []string与该媒体类型关联的后缀列表其中第一个后缀是主后缀。对应到源码MediaTypeConfig结构体正是Suffixes与Delimiter两个字段media/config.go。在解析阶段media/config.go 的DecodeTypes会执行几项关键处理将用户配置与defaultMediaTypesConfig合并MergeShallow因此你只需覆盖想改的部分其余保持默认通过FromString解析顶级类型/子类型并把suffixes统一转为小写后以逗号拼接存入SuffixesCSV若设置了后缀但未指定delimiter自动补上默认分隔符.。在 media/mediaType.go 的init()中第一个后缀会被提取为FirstSuffix含不带分隔符的Suffix与带分隔符的FullSuffix。输出格式生成文件名时正是依赖这一信息——BaseFilename()返回BaseName FirstSuffix.FullSuffix例如index.xmloutput/outputFormat.go。修改默认媒体类型你可以修改任意默认媒体类型。例如将text/html的主后缀从html切换为htm[mediaTypes.text/html] suffixes [htm,html]注意suffixes的顺序决定了主后缀因此这里把htm放在最前面。[!WARNING]修改默认媒体类型后必须显式重新定义所有使用该媒体类型的输出格式。例如要让上述改动作用于html输出格式需要重新定义它[outputFormats.html] mediaType text/html这是因为输出格式在解码时会通过mediaTypes.GetByType(...)按媒体类型字符串精确查找若找不到对应媒体类型会直接报错见 output/config.go 中的解码钩子。重新声明输出格式可确保它引用到你修改后的媒体类型定义。关于输出格式的完整配置方式可参考 输出格式配置文档。创建新的媒体类型你可以按需创建全新的媒体类型。例如为 Atom feed 创建媒体类型[mediaTypes.application/atomxml] suffixes [atom]这里的application/atomxml沿用了 MIME 类型的后缀语法FromString会把之后的部分解析为 MIME 后缀media/mediaType.go与内置的application/rssxml、application/manifestjson属于同一类写法。创建后即可在输出格式中以mediatype application/atomxml引用它。无后缀的媒体类型生成 Netlify 特殊文件某些场景下你需要创建没有后缀、也没有分隔符的媒体类型。典型例子是 Netlify它识别名为_redirects和_headers的配置文件这些文件名没有扩展名但 Hugo 可以通过自定义输出格式来生成它们。首先注册一个无后缀、无分隔符的自定义媒体类型[mediaTypes.text/netlify] delimiter 注意这里不能设置suffixes留空即可delimiter设为空字符串。随后定义对应的输出格式[outputFormats.redir] baseName _redirects isPlainText true mediatype text/netlify [outputFormats.headers] baseName _headers isPlainText true mediatype text/netlify notAlternative true这段配置的要点baseName输出文件的基名这里直接指定为_redirects与_headersisPlainText使用text/template而非html/template解析模板mediatype引用前面注册的text/netlifynotAlternativeheaders不参与替代格式alternative列表。由于该媒体类型没有后缀和分隔符BaseFilename()计算出的扩展名为空baseName 最终生成的文件恰好就是_redirects、_headers这样的无扩展名文件——这正是媒体类型 输出格式协作的精妙之处。配置加载顺序与合并规则从源码看媒体类型在配置管线中的位置十分明确config/allconfig/alldecoders.go 依次解码contentTypes→mediaTypes→outputFormats其中mediaTypes的解码结果是outputFormats解码的输入。也就是说先合并默认与用户自定义的媒体类型再基于最终的媒体类型集合解析输出格式包括校验mediatype是否存在内容文件识别如text/markdown同样建立在媒体类型之上。因此调整媒体类型会影响内容识别、资源分类、模板命名与输出文件命名等多个环节。建议在修改默认媒体类型时同步检查所有引用它的输出格式定义避免出现改了后缀但输出格式仍按旧扩展名生成文件的不一致情况。小结媒体类型是 Hugo 输出体系的核心配置项每个媒体类型由顶级类型/子类型构成可选 MIME 后缀语法并绑定一个或多个文件后缀suffixes中的第一个后缀是主后缀决定模板文件命名delimiter默认是.与后缀共同构成扩展名修改默认媒体类型时必须同步重新定义引用它的输出格式通过delimiter 且不设后缀可以创建无扩展名的媒体类型用于生成_redirects、_headers等特殊文件。进一步探索可阅读 media/builtin.go内置类型与默认配置、media/config.go配置解码与合并逻辑以及 output/outputFormat.go输出格式与文件命名实现。【免费下载链接】hugoThe world’s fastest framework for building websites.项目地址: https://gitcode.com/gh_mirrors/hu/hugo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考