Hugo简介
1. 简介
Hugo是一个用Go语言编写的静态网站生成器,针对速度进行了优化,并以灵活性为设计目标。凭借其先进的模板系统和快速的资源管道,Hugo可以在几秒钟内渲染出一个完整的网站,通常用时更短。
由于其灵活的框架、多语言支持和强大的分类系统,Hugo 被广泛用于创建:
- 企业、政府、非营利组织、教育、新闻、活动和项目网站
- 文档网站
- 图像作品集
- 商业、专业和个人博客
- 简历和履历
在开发过程中使用Hugo的嵌入式Web服务器可以立即看到内容、结构、行为和呈现方面的变化。然后将站点部署到你的主机上,或者将更改推送到你的Git提供商以进行自动构建和部署。并且借助Hugo modules功能,您可以通过公共或私人Git存储库与其他项目共享内容、资源、数据、翻译、主题、模板和配置。
2. 特点
Hugo丰富而强大的功能集提供了框架和工具,可用于在几秒钟内(通常更短时间)构建出一个完整的静态网站。
2.1. 框架
多平台:在 Linux、macOS、Windows 及更多系统上安装 Hugo 的单个可执行文件。多语言:针对每种语言和地区对项目进行本地化,包括翻译、图像、日期、货币、数字、百分比和排序顺序。输出格式:将你的网站的每个页面渲染为一种或多种输出格式,并可以按页面类型、部分和路径进行精细控制。虽然 HTML 是默认输出格式,但你可以添加 JSON、RSS、CSV 等更多格式。例如,创建一个 REST API 以访问内容。模板:使用变量、函数和方法创建模板,将你的内容、资源和数据转换为已发布的页面。虽然 HTML 模板是最常见的,但你可以为任何输出格式创建模板。主题:通过使用 Hugo 社区贡献的数百个主题之一,减少开发时间和成本。主题适用于企业网站、文档项目、图像作品集、登陆页面、个人和专业博客、简历、履历等。模块:通过创建或导入原型、资源、内容、数据、模板、翻译表、静态文件或配置设置的打包组合来减少开发时间和成本。模块可以作为新站点的基础,也可以用于扩充现有站点。隐私:配置你的站点以帮助遵守地区隐私法规。安全:安全模型基于这样一个前提:模板和配置的作者是受信任的,但内容作者则不受信任。这个模型能够生成防止代码注入的安全 HTML 输出。其他保护措施包括防止“调用外部程序”、限制对特定环境变量的访问、防止连接到任意远程数据源等等。
2.2. 内容创作
内容格式:使用 Markdown、HTML、AsciiDoc、Emacs Org Mode、Pandoc 或 reStructuredText 创建你的内容。Markdown 是默认的内容格式,符合 CommonMark 和 GitHub Flavored Markdown 规范。Markdown 属性:对 Markdown 图像以及块级元素(包括块引用、围栏代码块、标题、水平线、列表、段落和表格)应用诸如class和id之类的 HTML 属性。Markdown 扩展:利用内嵌的 Markdown 扩展创建表格、定义列表、脚注、任务列表、插入文本、标记文本、下标、上标等等。Markdown 渲染钩子:当渲染块引用、标题、图像、链接和表格时,可以覆盖Markdown 到 HTML 的转换。例如,将每个独立图像渲染为 HTML 的figure元素。图标:使用围栏代码块和 Markdown 渲染钩子在你的内容中包含图表。数学:在 Markdown 中使用 LaTeX 标记包含数学方程和表达式。语法高亮:使用 Hugo 的内嵌的语法高亮工具对代码示例进行语法高亮显示,在 Markdown 中,对于用围栏代码块默认启用此功能。语法高亮工具支持数百种代码语言和数十种样式。短代码:使用 Hugo 的内嵌的短代码,或者创建自己的短代码,以插入复杂的内容。例如,使用短代码插入audio和video元素、从本地或远程数据源呈现表格、插入其他页面的片段等等。
2.3. 内容管理
内容适配器:创建内容适配器,在构建网站时动态添加内容。例如,使用内容适配器从远程数据源(如JSON、TOML、YAML或XML)创建页面。分类法:对内容进行分类,以建立页面之间简单或复杂的逻辑关系。例如,创建一个作者分类法,并为每个页面分配一个或多个作者。除其他用途外,分类系统提供一个反向加权索引,以按相关性顺序渲染相关页面列表。数据:使用本地或远程数据源(包括CSV、JSON、TOML、YAML和XML)扩充你的内容。例如,创建一个短代码,从远程CSV文件渲染HTML表格。菜单:通过Hugo的菜单系统快速访问内容,该系统可以自动、全局或逐页进行配置。菜单系统是Hugo多语言架构的关键组件。URL管理:通过全局配置或逐页配置,从任何路径提供任何页面。
2.4. 资源管道
图像处理:进行转换、调整大小、裁剪、旋转、调整颜色、应用滤镜、叠加文本和图像以及提取EXIF数据等操作。JavaScript打包:将TypeScript和JSX转译为JavaScript,进行打包、摇树优化、压缩、创建源映射并执行SRI哈希。Sass处理:将Sass转译为CSS,进行打包、摇树优化、压缩、创建源映射、执行SRI哈希,并与PostCSS集成。Tailwind CSS处理:将Tailwind CSS实用类编译为标准CSS,进行打包、摇树优化、优化、压缩、执行SRI哈希,并与PostCSS集成。
2.5. 性能
缓存:通过将部分模板渲染一次并缓存结果(全局或在给定上下文中),减少构建时间和成本。例如,缓存资产管道的结果,以防止在每个渲染页面上重新处理。分段:通过将网站划分为多个段来减少构建时间和成本。例如,每小时渲染主页和“新闻部分”,每周渲染整个网站一次。压缩:压缩HTML、CSS和JavaScript,以减小文件大小、降低带宽消耗并缩短加载时间。
3. 安全
3.1. 运行时安全
Hugo生成静态网站,这意味着最终输出直接在浏览器中运行,并与任何集成的API进行交互。然而,在开发和网站构建过程中,hugo可执行文件本身就是运行时环境。
确保运行时的安全是一项复杂的任务。Hugo通过强大的沙盒方法和具有默认保护措施的严格安全策略来解决这个问题。其关键特性包括:
虚拟文件系统:Hugo采用虚拟文件系统,限制文件访问。只有主项目可以访问项目根目录之外的文件或目录,外部组件无法访问。只读访问:用户定义的组件对文件系统具有只读访问权限,防止意外修改。受控的外部二进制文件:虽然Hugo利用外部二进制文件来实现诸如Asciidoctor支持等功能,但这些二进制文件是严格预定义的,带有特定的标志,并且默认是禁用的。安全策略详细说明了这些限制。禁止任意命令:为降低风险,Hugo有意避免实现允许用户执行任意操作系统命令的通用功能。
这种沙盒机制和严格默认设置的组合有效地减少了Hugo构建过程中潜在的安全漏洞。
3.2. 依赖项安全
Hugo使用Go Modules来管理其依赖项,并编译为静态二进制文件。Go Modules会创建一个go.sum文件,这是一个关键的安全特性。该文件就像一个数据库,存储所有依赖项(包括间接依赖项,即传递依赖项)的预期加密校验和。
扩展了Go Modules功能的Hugo Modules也会生成一个go.sum文件。为确保依赖项的完整性,请将这个go.sum文件提交到版本控制系统中。如果Hugo在构建过程中检测到校验和不匹配,构建将会失败,这表明可能有人试图篡改项目的依赖项。
3.3. 网络应用程序安全
Hugo的安全理念基于既定的安全标准,主要与OWASP定义的威胁保持一致。对于HTML输出,Hugo在明确的信任模型下运行。这个模型假定模板和配置的作者(即开发者)是可信的。然而,提供给这些模板的数据本质上被认为是不可信的。这种区分对于理解Hugo如何处理潜在的安全风险至关重要。
为防止开发者认为安全的数据意外转义,Hugo提供了safe函数,如safeHTML。这些函数允许开发者明确将数据标记为可信,绕过默认的转义机制。这在数据由可靠来源生成或获取的场景中至关重要。不过,有一个例外情况:启用内联短代码。通过激活此功能,你隐含地信任短代码中的逻辑以及内容文件中包含的数据。
务必记住,Hugo是一个静态网站生成器。这种架构选择通过消除与动态用户输入相关的复杂性和漏洞,显著减少了攻击面。与动态网站不同,Hugo生成静态HTML文件,将实时攻击的风险降至最低。在内容方面,Hugo的默认Markdown渲染器配置为清理潜在不安全的内容。这种默认行为确保删除或转义潜在的恶意代码或脚本。不过,如果你对内容来源的安全性有足够的信心,可以重新配置此设置。
本质上,Hugo通过在开发者和数据之间建立明确的信任边界来优先确保安全输出。默认情况下,它会谨慎行事,清理潜在不安全的内容并转义数据。开发者可以通过safe函数和配置选项灵活调整这些默认设置,但必须在清楚了解安全影响的情况下进行。Hugo的静态网站生成模型通过最小化动态漏洞,进一步强化了其安全态势。
4. 许可证
Hugo依据Apache 2.0许可证发布。
4.1. 使用、复制和分发的条款与条件
4.1.1. 定义
- “许可证”指本文件第1至9节所定义的使用、复制和分发的条款与条件。
- “许可方”指版权所有者或经版权所有者授权授予本许可证的实体。
- “法律实体”指活动实体与控制该实体、受该实体控制或与该实体共同受控制的所有其他实体的联合体。就本定义而言,“控制”指:(i) 无论通过合同还是其他方式,直接或间接导致该实体的方向或管理的权力;(ii) 拥有该实体百分之五十(50%)或以上的已发行股份;(iii) 该实体的受益所有权。
- “您”(或“您的”)指行使本许可证授予权限的个人或法律实体。
- “源代码形式”指进行修改的首选形式,包括但不限于软件源代码、文档源和配置文件。
- “目标代码形式”指由源代码形式通过机械转换或翻译产生的任何形式,包括但不限于编译后的目标代码、生成的文档以及转换为其他媒体类型的内容。
- “作品”指根据本许可证提供的著作作品,无论是源代码形式还是目标代码形式,通过包含在作品中或附在作品上的版权声明来标识(附录中提供了一个示例)。
- “衍生作品”指任何基于(或源自)“作品”的作品,无论是源代码形式还是目标代码形式,其编辑修订、注释、阐述或其他修改作为一个整体代表了原创的著作作品。就本许可证而言,衍生作品不包括与“作品”及其衍生作品保持分离,或仅与“作品”及其衍生作品的接口链接(或按名称绑定)的作品。
- “贡献”指任何著作作品,包括“作品”的原始版本以及对该“作品”或其衍生作品的任何修改或添加,由版权所有者或经版权所有者授权代表其提交的个人或法律实体有意提交给许可方以纳入“作品”。就本定义而言,“提交”指发送给许可方或其代表的任何形式的电子、口头或书面通信,包括但不限于在许可方或代表许可方管理的电子邮件列表、源代码控制系统和问题跟踪系统上的通信,目的是讨论和改进“作品”,但不包括版权所有者以书面形式明显标记或以其他方式指定为“非贡献”的通信。
- “贡献者”指许可方以及许可方已收到其贡献并随后将该贡献纳入“作品”的任何个人或法律实体。
4.1.2. 版权许可授予
在遵守本许可证条款与条件的前提下,每位贡献者特此授予您一项永久的、全球范围内的、非排他性的、免费的、免版税的、不可撤销的版权许可,允许您复制、创作衍生作品、公开展示、公开表演、再许可和分发“作品”以及此类衍生作品,无论是源代码形式还是目标代码形式。
4.1.3. 专利许可授予
在遵守本许可证条款与条件的前提下,每位贡献者特此授予您一项永久的、全球范围内的、非排他性的、免费的、免版税的、不可撤销的(本节另有规定的除外)专利许可,允许您制造、委托制造、使用、要约销售、销售、进口以及以其他方式转让“作品”,该许可仅适用于该贡献者可许可的专利权利要求,这些权利要求仅因他们的贡献或其贡献与提交贡献的“作品”相结合而必然受到侵犯。如果您对任何实体提起专利诉讼(包括诉讼中的交叉索赔或反诉),指控“作品”或纳入“作品”的贡献构成直接或间接专利侵权,则自提起该诉讼之日起,本许可证授予您的与该“作品”相关的任何专利许可将终止。
4.1.4. 再分发
您可以在任何媒介中复制和分发“作品”或其衍生作品的副本,无论是否进行修改,也无论采用源代码形式还是目标代码形式,但您必须满足以下条件:
- (a) 您必须向“作品”或其衍生作品的任何其他接收者提供本许可证的副本;
- (b) 您必须使任何修改后的文件带有显著通知,说明您更改了这些文件;
- (c) 在您分发的任何衍生作品的源代码形式中,您必须保留“作品”源代码形式中的所有版权、专利、商标和归属声明,但与衍生作品任何部分无关的声明除外;
- (d) 如果“作品”在分发时包含一个“NOTICE”文本文件,那么您分发的任何衍生作品必须在以下至少一个位置包含该NOTICE文件中所含归属声明的可读副本,但与衍生作品任何部分无关的声明除外:作为衍生作品一部分分发的NOTICE文本文件内;如果随衍生作品提供了源代码形式或文档,则在其中;或者,如果衍生作品生成了显示内容,在第三方声明通常出现的位置。NOTICE文件的内容仅用于提供信息,不修改本许可证。您可以在分发的衍生作品中添加您自己的归属声明,与“作品”的NOTICE文本并列或作为其附录,前提是此类额外的归属声明不能被解释为对本许可证的修改。 您可以在您的修改中添加自己的版权声明,并可以为您的修改或整个衍生作品的使用、复制或分发提供额外或不同的许可条款和条件,前提是您对“作品”的使用、复制和分发在其他方面符合本许可证规定的条件。
4.1.5. 贡献提交
除非您另有明确声明,您有意提交给许可方以纳入“作品”的任何贡献应受本许可证条款与条件的约束,不存在任何额外条款或条件。尽管有上述规定,此处的任何内容均不应取代或修改您可能与许可方就此类贡献签订的任何单独许可协议的条款。
4.1.6. 商标
本许可证不授予使用许可方的商号、商标、服务标记或产品名称的权限,除非在描述“作品”的来源和复制NOTICE文件内容时为合理和惯常使用所必需。
4.1.7. 免责声明
除非适用法律要求或书面同意,许可方按“原样”提供“作品”(每位贡献者按“原样”提供其贡献),不附带任何形式的保证或条件,无论是明示的还是暗示的,包括但不限于所有权保证、不侵权保证、适销性保证或特定用途适用性保证。您独自负责确定使用或再分发“作品”的适当性,并承担因行使本许可证授予的权限而产生的任何风险。
4.1.8. 责任限制
在任何情况下,无论基于何种法律理论,无论是侵权(包括疏忽)、合同还是其他情况,除非适用法律要求(如故意和重大过失行为)或书面同意,任何贡献者均不对您承担损害赔偿责任,包括因本许可证或因使用或无法使用“作品”而产生的任何直接、间接、特殊、偶然或后果性损害(包括但不限于商誉损失、工作停顿、计算机故障或故障,或任何及所有其他商业损害或损失),即使该贡献者已被告知可能发生此类损害。
4.1.9. 接受保证或额外责任
在再分发“作品”或其衍生作品时,您可以选择提供并收取费用,以接受与本许可证一致的支持、保证、赔偿或其他责任义务和/或权利。然而,在承担此类义务时,您只能代表您自己并独自承担责任,不能代表任何其他贡献者,并且只有在您同意赔偿、辩护并使每位贡献者免受因您接受任何此类保证或额外责任而产生的任何责任或针对该贡献者提出的任何索赔的情况下才可进行。