为什么我要构建自己的Shitty静态站点生成器

2020-11-30 08:42:14

在互联网上,可以免费下载高质量的静态站点生成器(SSG)。雨果(Hugo),杰基尔(Jekyll)以及其他数百人现成的。他们工作。您可以使用它们建立各种站点。我知道,因为我用了其中一些。直到最近,雨果还是该网站背后的推动力。尽管如此,当我前一段时间尝试添加新的部分时,我对此感到非常沮丧,并决定构建自己的生成器。事实证明,这是一种非常愉快的体验,而不仅仅是因为我喜欢编程。

在进行此工作时,我发现了一些促使我从事此项目的更深层次的动机。从表面上看,这样做似乎很奇怪,因为它要花很多时间,而且似乎没有什么好处。我没有创建任何新功能或引人注目的功能。如果您单击该站点并认为:嘿,但是我完全可以使用做到这一点,那么您可能是对的。但这不是重点。自己动手做具有某些优点,我怀疑这些优点困扰着SSG和编程的主题。我的推测是,对于不喜欢编程的人,甚至对于根本不喜欢计算机的人,探索这个方向也可能很有趣。

那么,为什么要从众多其他项目中选择这个项目,以至于听起来都很有趣?很容易总结,但是如果没有上下文,这听起来可能有点抽象。进行所有这些工作的真正原因是,我认为个人站点应该是个人站点,并且要使其成为个人站点,应该仅以个人的直觉为指导,而不是以可用工具的心理模型及其对您的思想的限制为指导。

这听起来似乎很模糊,也许有些牵强。毕竟,只要您可以写出您想写的单词,画出想画的线,您的创造力就不会受到限制,对吗?也许你是。为了使这一点更明确,让我对自己的情况做一点扩展。我将专注于Hugo,因为这是我最了解的SSG。但是其他发电机也适用相同的原理。我相信,其他所有工具也是如此。

如前所述,可用的静态站点生成器的列表是无止境的。但是,无论如何,他们似乎都将Markdown当作标记语言来撰写您的帖子。Markdown非常易于学习,这可能是它如此受欢迎的原因。不幸的是,对于这种用例来说,它是一种非常糟糕的标记语言,因为它是非常不完整的。这不是一种语言。最好将Markdown视为一堆捷径,以简化编写一些常见HTML标记的过程。开箱即用时,您只能使用它对文档主体进行标记。标题,段落,列表等。但仅此而已。在与网站打交道时,HTML标签的快捷方式可能很有用,但我们需要更多。例如,还需要元数据,例如标签,发布日期等。您确实希望最新的帖子位于新闻源的顶部,对吗?然后,我们必须找到一种方法来指示发布文章的时间。

在雨果(Hugo)中,这是用前事的笨拙概念解决的。在每个Markdown文件的顶部,需要添加不是Markdown而是另一种格式的文本块。您可以选择YAML,TOML或JSON。在该块中,您可以指定我提到的内容。发布日期,作者,类别等。这些都非常灵活,您甚至可以定义自己的元数据。因此,您绝对可以从中获得一个美观的网站。

但是不利的是,您撰写的任何博客或文章现在都与用于发布它的系统绑定在一起。 Frontmatter不是Markdown的一部分。它是雨果的一部分。因此其他Markdown工具将无法提取该信息。只有雨果可以。因此,如果您像我一样喜欢写各种各样的东西,而又想让自己的一些作品最终出现在您的网站上,而另一些则不想出现在您的网站上,那么即使只是在完成写作之后,才可能做出一个决定,那么您刚刚创建了一个问题。因为现在您必须进行两堆写作。一堆用于将要在您的网站上发布的文本,另一堆用于要导出到例如PDF的文本。但是,等等,也许您还希望汇编您的故事集并将其编入电子书。也许您真的为一​​件作品感到骄傲,并且想同时发布所有三种方式。那时存储您的工作变得有些奇怪,也非常不切实际。每次要导出时都要更改文档格式吗?您要制作多份副本吗?如果以后发现拼写错误怎么办?这一切很快就变得一团糟。

理想情况下,我希望有一个文件夹来存储我的所有作品。我想以我认为最适合内容的方式组织该文件夹。然后,我想将站点生成器指向该文件夹,它应该自己找出其余的文件夹。什么需要在我的网站上发布?它应该在哪里结束?元数据应该是弄清楚它所需要的全部。我希望我将来使用或将来可能使用的所有其他发布者,生成器,索引器等都一样。然后,唯一的解决方案是将文本存储为开放的,与工具无关的文档格式,该格式可以包含所有相关信息。最好也是纯文本格式。因为我喜欢Markdown的那部分。使用简单的文本编辑器,Git版本控制,是的,给我。

输入Asciidoc。 Markdown如此结构完整,您可以在其中写下整本书。然而,它具有添加标记的相同简单方法,并且看起来非常相似。稍后,我将撰写另一篇文章,介绍如何使用Asciidoc的子集制作发电机。我想在此说明的一点是,在我看来,不希望被迫以不合逻辑的方式重组和复制我的文件这一简单合理的要求已经排除了90%的可用工具。相反,仅采用这些现有工具中的一种,您突然就对创意作品的思考方式变得有些局限。

想一想。当您开始做任何事情的那一刻,在您脑海中的想法只不过是对图像或感觉的不确定的瞥见而已。在您必须全神贯注的那一刻,不要让转瞬即逝的仍然无语的印象溜走。眨眼一次太多,它们会迷失,漂浮。在那一刻,您会被一个问题困扰:“一旦完成,它将在哪里结束?是我的日记本还是一本书?”那完全是倒退。那不是关于您工作的第一个问题,而是最后一个问题。不是每个人都一样,但是对我来说,这个前期问题是有限的。思想还不够成熟,无法归类,无论如何都被迫实现,因此您可以将它们放在正确的位置。然后他们溜走了。

到目前为止,有些人可能正在思考:是的,这很好,但是某些生成器(例如Hugo)可以将Asciidoc用作输入,并且可以设置替代内容路径。您当然可以在这里解决问题,并按照自己的方式配置事情吗?

好吧,是的,从表面上看,有可能使某些事情变得圆满。但这并不能很好地结束。沿着这条路线,您将陷入无休止的寻找选项和选项选项的循环中,最后,您将很乐意将所有内容显示在屏幕上。

让我们开始简单。一些产生者说他们支持Asciidoc,但是他们并不是天真的。至少我见过的。也就是说,您必须安装另一软件才能获得该功能。在这种情况下,Asciidoctor。 (并且Asciidocter依次需要Ruby,但我认为它到此为止。)然后必须将这两个部分配置为可一起使用,并且必须在要使用的Overy设备上完成。这就是开发人员所说的依赖关系,应尽可能避免使用它们,因为它们要求您进行工作,只是要保持现状。在撰写本文时,您可以在Hugo文档中阅读有关如何配置Asciidoc的内容:

“ AsciiDoc在2020年1月实施EOL,不再受支持。在Asciidoctor下,AsciiDoc的开发仍在继续。当然,格式仍然是AsciiDoc。请继续执行Asciidoctor。”

因此,这就是说,Hugo背后的人们看到他们所依赖的某个软件AsciiDoc将会过时,因此他们切换到了另一个外部软件Asciidoctor,以防止事情中断。明智的举动。但是对于您(用户)来说,事情已经坏了,因为现在您已经删除了第一个软件,安装了第二个软件,然后再次配置它们以使其协同工作。同样,必须在所有设备上完成此操作。您可以在选项之间进行选择,但这些选项不稳定,需要用户自己进行操作。有时,选项本身具有某些依赖性,从而重复了该问题。度过一个下午不是一个有趣的方式。

众所周知,雨果(Hugo)的模板语言很难。这是因为Hugo内置于Go中,并利用了Go标准库的模板功能。该功能快速而优雅,但是非常适合程序员。我事先知道这一点,但是由于我是Go开发人员,所以我认为这将是一个优点,而不是缺点。我整天都在做Go的事情。它已经支付了我现在正在写的笔记本电脑和我坐在的椅子上的费用。这肯定很容易吗?

没那么多。事实证明,编写Hugo模板是一种令人沮丧的体验。这是无穷无尽的猜测变量,类型并试图通过链接函数将它们组合成有用的东西的游戏。有文档,列出了每个变量和函数,但缺少一个关键的东西:全局。

模板操作由两部分组成:数据以及如何处理数据。例如,假设我们要呈现标题。在模板中,我们指示标题具有特定的颜色,大小和字体。对于每个页面,我们都有一个新的标题,即数据,但是我们以相同的方式渲染它们,就像我们指定的那样。那是模板的工作。告诉我们如何渲染数据。

但是,页面不仅包含标题,还包含更多数据。实际上,在雨果,您可以访问所有内容。一切都是满足的。包括所有元数据,以及至关重要的是,它们如何在构成站点的抽象的,想象中的大结构中相互关联。该心理图片未在文档中显示。更糟糕的是,这是站点的一般性心理印象。由于Hugo是通用的SSG,因此您必须选择构建任何类型的网站。在将其转换为实际站点之前,请计算放松的水平:概括(一幅),抽象(两幅),心理(三幅)图画。

当然,使用模板已经施加了一些抽象。它们可能非常有帮助,我最终也使用了一些。但有时,最好让所有相关方(即您和您的工具)仅对某些内容进行硬编码。

模板问题和外部依赖性这两个问题有一些共同之处。要解决这些问题,您的思维必须切换到分析模式。有一个带有按钮的黑匣子。如果弄清楚了它是如何工作的,则可以按正确的顺序按下按钮,并使其执行您想要的操作。如果包装箱中包含很多复杂的齿轮和杠杆,这可能是一个很难解决的难题,您需要花费更多的精力。您将开始问自己以下问题:包装盒的制造商在设计包装盒时想到了什么?它到底是为什么设计的?它解决了什么问题,对他们来说似乎合乎逻辑?他们可能会满足他们看到的最常见的需求。

如果您想解决这个难题,则必须暂时搁置自己对问题的看法,然后采用它们。您必须走出自己的思维而进入他们的思维。

一方面,如果成功了,那么您已经掌握了它,然后又想回到自己的原始框架。了解如何连接两者。但是,这往往不是很难的,甚至是不可能的。通过以自己的方式做事,您已经覆盖了原来的观点。至少部分。这并不总是一件坏事,但重要的是要意识到它会发生。可能您不想要那样。将此与从头开始进行比较。没有解决其他人问题的方法,只有您自己的解决方案。这意味着要自己创建解决方案,这很困难。但是您至少可以确定它适合您的问题。

那么,即使他们和任何母亲对制作软件都没有兴趣,每个人和他们的母亲都应该从头开始编写一切吗?那将是不切实际的。可能对他们的动力不利。更不用说对很多人来说,编程就像是一个神奇的黑匣子,里面有按钮和复杂的机械,因此适得其反。不过,我认为可以从中得出一些一般性的教训。

所有软件工具都在灵活性和易用性之间进行了某种折衷。有些折衷方案要比其他折衷方案更好,但总会有折衷方案。使用最简单的工具是只有一个按钮的工具。推动它,您将获得完整的结果。但是,为了做到这一点,该工具或实际上是该工具的创建者必须为您做出各种决定,无论大小。如果您希望对结果进行更多控制,那是可能的,但是根据定义,这意味着您必须提供更多的输入。需要按下更多的按钮,更多的拨盘进行调整。您拥有的控制级别将与您必须提供的输入级别相匹配。如果您将其扩展到足够远的地方,请添加所有可以想象的控件,最终您将获得我们称为编程语言的非常复杂且精致的工具。在编程语言中,最终结果的每个小细节都由您决定。但是,另一方面,它需要大量的投入和精力才能使某些事情动起来。

网站生成器可以在这种规模的任何地方。有人可能会争辩说,像Facebook和Twitter这样的服务是这一领域的最终“仅需按一下按钮”的版本。多亏了他们,任何人都可以发布,而无需花费时间和精力。输入您的文字,按一下按钮,每个人都可以看到。设计,结构,通知读者,它真是神奇。

但是请记住,如果您不做决定,那么其他人会为您做。将所有这些困难的问题外包可能是一种好感觉。也许您认为情况会变得更好,因为您认为其他人对必要的机制了解更多。他们可能会做。但是,另一方面,另一个人不知道您的内心深处。

如果Twitter是您将要使用的唯一发布平台,那么您无需尝试就可以自然地开始编写280个字符或更少的文本。这就是大多数人的工作方式。但是也许这种局限性经常使您恼火,以至于您开始寻找解决之道。您在线搜索,发现诸如Threadreader之类的应用程序,该应用程序使用户可以将多个tweet串入一个文档,就好像它们是单个文本一样。这是解决您遇到的问题的一种方法,但是如果您仔细阅读您的新文章,您会发现它们并不“正确”。 280个字符的限制仍然存在,但是它是隐藏的。一条推文变成一个段落,因此您绑定的段落非常短,因此文本的内容仍然非常..断断续续。即使您的文字现在可以更长了,您仍然无法按照自己的方式书写。更不用说笨拙的过程以正确的顺序组成多个推文了。

在这种情况下,创建一个Wordpress博客会更好。在工具规模上迈出了一步,还有更多工作要做,但是现在您可以完全按照自己的方式编写。无需编程。如果您想拥有更多控制权,则必须提供更多输入。但是,使用一个带有两个按钮的工具与使用两个带有一个按钮的工具之间的主要区别。

因此,我的建议是尽可能多地了解所使用工具的限制和隐藏模型。也许没有必要成为一名程序员。但是请想象一下,你是一个。让您介意徘徊,看看会发生什么。你会建造什么?如何运作?而且,如果您想到了什么,请按照自己喜欢的方式在秤上进行尽可能多的操作,并查看是否可以使它正常工作。相信我,它将感到自由。

在标题中,我提到我的生成器是“很烂”的。它没有很多功能。它充满了无法处理的错误和极端情况。但这并不重要。它适用于我的问题。如果我不喜欢某些东西,可以修复它。如果虫子不打扰我,我会顺其自然。像所有创造性的作品一样,重要的是要开始并取得成功。您以后可以随时对其进行改进。

几周后,我将把源在线。不是让人们盲目模仿和奔跑(为什么?),而是给仍然在栅栏上的人们一些启发。向他们展示烂不见得不难,只要它是正确的烂蛋就可以足够好。你这混蛋