1.7 为什么选择Hugo? #
Hugo是最古老的静态站点生成器之一,并且随着时间的流逝,其受欢迎程度不断提高。 它的创建者Steve Francia在CMS和技术写作需求方面拥有丰富的经验。 他的背景包括构建一个供美国职业足球大联盟和Priceline使用的闭源CMS(Supersite)。 他对Magento和WordPress有着丰富的经验,并曾在Drupal的董事会任职。 他领导了MongoDB和Docker的技术写作部门。 他利用了所有这些经验,利用了每个系统的优势,并将其引入到Hugo的设计中。 WordPress之类的工具主要为非技术受众构建,Rails或Express.js较为偏向技术人员,提供了生成通用软件的功能但需要持续维护,Hugo处于两者与之间的最佳位置。 使用Hugo,你可以获得定制主题的灵活性,比大多数其它选项维护更少,并具有出色的性能。 Hugo适用于那些不介意进入代码的用户,而同时需要在项目之外人生的用户。
你并不孤单
Hugo在业界非常受欢迎。 像Bootstrap(https://getbootstrap.com)、Let’s Encrypt(https://letsencrypt.org),Smashing杂志(http://www.smashingMagazine.com)、Netlify(https://www.netlify.com/) 和 1Password Support(https://support.1password.com/)等网站大规模使用Hugo。 因为Hugo的性能和易用性,Smashing杂志将其网站从WordPress迁移到了Hugo。
1.7.1 Hugo运行很快 #
Hugo是最快且功能丰富的静态网站构建器。 虽然我们在开始一个项目时可能不会意识到这一点,但这在我们的日常使用中是极其重要的。 等待编译或刷新是开发人员感到沮丧的重要原因,如果该项目仅是一种爱好,则可能意味着项目的死亡。 当技术修改迫使我们对我们的网站模板进行重大更改时,性能变得更加关键。 例如,移动设备的出现给许多WordPress主题带来了死亡,在这些主题中,更新每个方面都非常痛苦,以至于开发人员放弃了。 此外,一个基于Hugo的网站即使拥有十年的内容,也会继续提供令人尊敬的开发业绩。 与任何较慢的框架相比,基于Hugo的网站的改版或重写更容易,更有趣。
Hugo和Go语言
人们担心的一个问题是,采用Hugo意味着学习Go语言。 虽然对于用脚本语言编写的其它静态站点生成器确实需要这样,但对于基于GO的应用程序则不是这样。 没有必要学习Go或了解它是如何与Hugo取得成功的。 就像人们不需要学习C++就能使用Windows或Photoshop一样,Hugo也不需要任何Go编程知识。 这本书没有一行Go代码。 Go编程语言内置了对并发性的支持。 在Go中编写并行执行的代码比在用于构建网站生成器的许多其它编程语言中更容易。 Hugo在不增加复杂性的情况下,从Go的速度中受益匪浅。
Hugo的用户使用Go模板语言,尽管名称如此,但它与Go本身是不同的语言。 它允许我们编写任何我们想要的东西,包括模块和函数,而无需处理多线程代码的大量复杂性。 如果你不打算编写自定义主题或ShortCode,你甚至可能不需要Go模板语言。 你可以用标记语言编写内容,然后从货架上选择一个主题来构建你的网站。
大多数其它基于Jamstack的网站构建器都具有单线程,顺序流的源语言。 这种方法允许他们拥有插件,但却付出性能上巨大的开销。 Hugo提供的最重要特性在于,无需在构建性能和开发人员体验方面与缓慢的框架妥协。
Go是较新的语言之一(2009年公开发布),但它已经打入了主流开发。 就采用而言,这是前十名的语言。 包括Docker和Kubernetes在内的重大项目都是用Go编写的。 此外,大多数云都是用Go编写的,包括AWS、Azure和谷歌云平台 (GCP)。 包括谷歌、美国运通和Dropbox在内的大企业广泛使用。
方便的是,Hugo的创造者史蒂夫·弗朗西亚 (Steve Francia) 也是谷歌Go编程语言的产品和战略负责人。 因此,Hugo是一个Go团队非常了解的项目。 它影响编程语言本身,并可以采用其最佳功能。
1.7.2 Hugo是稳定的 #
Hugo的核心功能已经支持了很长时间,并且不太可能打破。 任何新的添加都可以确保这些功能不受干扰,并继续按原样工作。 在Hugo的早期,随着团队专注于正确构建架构,开发进展缓慢。 这种开发路径得到了回报。 Hugo的特性是灵活且可扩展,而且大多数版本都不会破坏已用它建立的数千个网站。
Hugo开发团队相信Hugo在保持向后兼容性的同时会不断进化。 Hugo试图在各个版本之间向后兼容,并在需要更改某些内容时指导我们进行升级。 如果你选择了一个旧的主题,并获得了最新版本的Hugo,你可能会收到一些警告,但大多数应该会继续正常工作。
1.7.3 Hugo是为性能而建的 #
Hugo社区有一种倾向,即在他们所做的每一件事中都寻求性能提升。 在社区论坛上,有很多关于改进网站性能的简单步骤的建议。 如果你从互联网上找到一个与Hugo一起做某事的任意脚本,很可能它的作者已经对其进行了性能优化。
Hugo的核心性能也影响其输出。 性能原语可用于其它用途。 开发人员可以从Hugo用于优化工作流的方法中学习。
1.7.4 Hugo是自成一体的 #
重插件的系统似乎提供了很大的灵活性和功能,可惜这些优点只到维护工作开始。 即使在框架被积极维护的同时放弃了一个插件,你的站点也可能会进入糟糕的状态! 插件被放弃一直是像Rails这样的框架的一个经典问题,每个主要版本都成为迁移所有插件的巨大痛苦。 我们可以在Backbone和Angular等生态系统中看到同样的情况,那里有许多陈旧的插件。 即使是极受欢迎并积极维护的Jekyll,也有相当大的插件腐烂问题。
自成一体使Hugo得以绕过困扰其它项目的问题。 核心团队具有标准化的最佳开发路径来执行本地可用的任务。 Hugo团队对Hugo进行了优化,而不需要较低级别的API兼容性。 他们持续为标准化工作流编写复杂的多线程逻辑,以抵消用户可能在其它地方要花费的额外几毫秒。 与插件作者相比,Hugo的用户得到的支持要多得多,而且他们也不那么害怕放弃他们的核心工作流程。
自成一体并不意味着Hugo不可扩展。 Go模板语言很强大,用户可以将代码片段作为模块共享,这些模块可以重复使用,并且可以使用该语言执行复杂的逻辑。
1.7.5 Hugo是一个单一的文件 #
Hugo将其所有核心依赖项和资源打包到一个可执行文件中。 单个文件使下载Hugo,将其传输到另一台机器并进行备份变得非常简单。 在系统中,由于安全方面的考虑,每个文件都需要进行大量的检查,因此,没有其它依赖项的单个二进制文件就会大放异彩。 开发人员可以将Hugo二进制文件与他们的源代码合并,以便在受限的环境中使用它。 由于只有一个文件负责所有事情,因此没有要更新的依赖项,也没有要管理的构建系统。 带有自定义api的完整web堆栈可以使用少量依赖关系来构建。 这种自由与基于JavaScript的静态站点构建器形成鲜明对比,后者有数百个依赖项,每个依赖项都可能需要安全团队进行审查才能在企业环境中使用。
1.7.6 Hugo只有极低的维护量 #
由于较少的移动部件 (插件和操作系统的依赖关系),微小的安装占用空间,没有数据库,没有复杂的托管步骤,与其它web开发方法相比,Hugo的维护焦虑会少很多。 每个依赖项都需要维护。 只需Hugo和托管提供商,你就可以获得一个维护成本较低的引人注目的网站。 虽然Hugo的更新已经破坏了向后兼容性(出于有效的性能、可扩展性和可维护性的原因),但你可以在有空时自由地进行更新,并且你不必修复神秘的插件。 对于web开发世界中的大多数其它生态系统,就不会这么轻松了。
1.7.7 Hugo可以将你从内容分析重担中拯救出来 #
Hugo自成一体,拥有许多快速启动和运行的技术。 虽然强大的模板系统允许你推出一个自定义的解决方案的问题,Hugo团队已经解决了最常见的解决方案。 Hugo有通用的分页实现,将内容分类为无限类型的类别,并获得菜单等核心网站元素。 Hugo的启动和运行很容易,因为有一种有据可查且广泛的开发路径可以解决大多数可用的问题。
1.7.8 Hugo很强大 #
尽管有些封闭,Hugo还是多才多艺的。 Hugo扩展的Go模板语言功能强大且灵活。 这种能力为开发人员提供了与Hugo一起编写适当程序的能力。 Hugo提供的标准库非常庞大,而且还在不断增长。 它从一开始就具有出色的性能。 即使你写了糟糕的代码,内置函数的核心性能也确保了网站编译相对良好的性能。 通过在网站生成期间访问API,Hugo提供了大量的能力,而不会损失生成输出的性能。 你可以使用Hugo在网站的任何地方编写函数,包括在开发内容时 (以自定义Shortcode嵌入到标记中),以进行一些特殊处理。 你可以将其封装到某个内容中,以便在特定页面上作为一次性代码片段重复使用或保留。
Hugo有很多Web开发原语。 尽管如此,不使用它们似乎并不像是在对抗框架。 如果你不想使用Hugo提供的特性,而使用模板语言构建自己的特性,那么使用Hugo的其余部分的体验不会降低。 Hugo为与API和JavaScript的交互提供了良好的支持,这些API和JavaScript可以在需要的地方提供可扩展性和动态性。
1.7.9 Hugo是可扩展的 #
Hugo已经考虑迎合具有多语言内容的网站,拥有数千个页面和数百万每月活跃用户。 Hugo在处理互联网上一些规模最大、使用量最大的网站方面有着良好的记录。 已经有足够的原语和功能来将基于Hugo的网站从单个开发人员扩展到一整个团队。 Hugo支持多种输入和输出格式。 它具有多种功能,可以使团队的非技术成员实现日常工作的自动化。
1.7.10 Hugo是一个社区项目 #
志愿者社区会坚持认为Hugo在该项目中不需要商业利益。 这种自愿性质使项目的方向符合社区的最大利益。 Hugo不会在公司的心血来潮中转移,被收购或关闭。
图1.5 DevOps和Jamstack:Web开发人员Alex与担任系统/IT管理员的Bob交谈。 Bob说服管理层将基于云的解决方案与现有技术一起使用,并将调查内容放到Jamstack中。