静态网站生成

16
我需要一种简单的方法来生成静态网页,以便我可以使用Apache或Nginx进行服务。目前我正在使用SproutCore的构建工具(Abbot)生成静态页面,但是它有点麻烦,因为它是为构建SproutCore应用而设计的,而不是非SproutCore HTML页面。
以下是我的要求:
- 必须合并和压缩JavaScript - 必须合并CSS文件 - 每个图像/CSS/JavaScript资源必须具有唯一的URL,以获得更好的缓存(查询字符串不足够) - 仅在实际更改时才应更改资产URL - 支持HTML、CSS、JavaScript和图像文件的本地化 - 具有布局、部分等良好的模板引擎
以下是我找到的可能解决方案:
- 使用Ruby on Rails创建站点,然后使用wget获取所有资源,如http://usefulfor.com/ruby/2009/03/23/use-rails-to-create-a-static-site-rake-and-subversion/ - 使用Middleman:http://middlemanapp.com 对此有何想法?
经过漫长的评估过程,我决定使用Middleman。它可以胜任,并且我喜欢它的简单性以及我可以与现有的Rack组件一起使用的事实。
最好的问候,
Pekka Mattila

3
你尝试过 Jekyll 吗?- https://github.com/mojombo/jekyll - Maurício Linhares
我已经尝试过并且喜欢它,但是它稍微太简单了,不能满足我的需求。我想使用Rails 3.1的一些很棒的功能,比如本地化、资源管道(Sprockets)、Compass、HAML模板、部分等等。我的目标是(在使用CoffeeScript时)合并+压缩Javascript文件,(在使用SASS时)合并CSS文件并为它们创建唯一的URL(以便更好地缓存)。然后,我想将所有静态文件(不包括HTML文件)发送到Amazon S3。 - Pekka Mattila
看看这个帖子,提到了很多静态网站生成器:https://dev59.com/jVfUa4cB1Zd3GeqPKrzT - Michael Kohl
谢谢Michael。我认为我会坚持使用Rails 3.1 + wget或Middleman。让我们看看Thomas Reynolds的评论(请参阅下面的答案)。 - Pekka Mattila
Rails + wget是我发现的最简单的解决方案。然而,你提到的博客使用了wget命令,但没有正确获取静态页面文件结构。要使用正确文件结构的wget命令,请查看这篇博客文章 - Jason Kim
6个回答

17

我是Middleman的创建者,很乐意帮助你熟悉使用Middleman。我的主要目标是给用户提供类似Rails的功能,但着重于静态网站开发。Middleman的一些实际代码是Ab的简化版本。


大约六个月前,当我回顾了所有我能找到的 Ruby 静态网站生成器时,Middleman 显然是最好的一个。它是最强大的,但也是最简单易用的,因为它采用了良好的 Rails 约定。 - gunn
嗨,Thomas,很高兴收到你的来信。我有几个问题。1)是否可以轻松本地化您的应用程序?使用Rails的本地化字符串将很好:https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale。2)关于Rails的资产管道呢?我想定义合并哪些资产以及如何合并。所有资产在更改时必须具有不同的网址(缓存)。3)是否可以使用CDN?我希望从我的服务器上提供所有HTML文件,并从CDN中提供所有其他资源。 - Pekka Mattila
不确定我的上面的评论为什么被截断了,我在Stackoverflow上还很新。 - Thomas Reynolds
显然,你不能添加换行符 :-p 所以……在一个大块中。1)Middleman包括Ruby i18n gem和padrino-helpers库,为国际化提供了基础。然而,从单个模板生成多个页面(通常在不同的前缀文件夹中)的实际设置需要一些配置。我很乐意帮助您设置。2)我们包含与Rails 3.1完全相同版本的Sprockets,因此您可以访问组合和压缩功能。3)我们支持asset_host变量,以生成自定义前缀的资产(例如Cloudfront或s3)。 - Thomas Reynolds
自从这篇文章写出来以后,i18n支持变得更加完善了。现在有一些明确的选项和不同生成方案的良好集成。 - mm2001

1

1

我的做法如下:

  • 使用 Ruby on Rails 3 和 High Voltage Gem,它使得使用普通模板来提供静态页面变得容易。只需要在路由中添加一个简单的条目(你可以使用命名空间来创建层次结构)。

  • 使用 Apache 反向代理到独立的 Passenger(它使用 nginx),来运行 Rails 应用程序。这篇文章描述了如何进行配置。

独立的 Passenger 将读取 URL,查看是否有相应的文件,如果有 .html 后缀,则服务于该文件。如果找不到,则调用 Rails 并生成页面。本质上是页面缓存,并且可以选择发布带有或不带有 .html 的 URL。Passenger 文档中有一个关于页面缓存的部分。

至于合并和压缩 js 和 css,这里有一个很好的 stackoverflow 线程

Rails拥有出色的i18n/l10n支持。

Rails模板引擎非常好用。如果您喜欢,还可以使用HAML。

关于您的第三和第四点,我有点困惑。您想要将CSS和JS合并,但是又希望它们各自拥有自己的URL。在Rails中,“cache => true”指令对资源标签进行缓存处理,添加一个查询字符串参数,当内容发生变化时,该参数会改变,这是一种相当传统的方案。我不确定您所处的上下文环境是否无法使用此方法。我曾经使用过的任何CDN都可以很好地处理这个问题,只要Web服务器正确实现了HTTP规范。无论如何,更改URL中的实际路径或文件需要更改所有引用它的地方。也许我误解了您的意思?


谢谢您提供这个想法!我的写作可能有误导性。我想将所有的CSS文件合并成一个CSS文件,将所有的JavaScript文件合并成一个JS文件。我的想法是在HTML和CSS中使用URL来引用资源。URL方案可能类似于:http://cloudfrontXYZ.amazon.com/<unique id>/image.jpg。唯一的ID可以是例如image.jpg的SHA1值。 - Pekka Mattila
我明白你不会将CSS与JavaScript合并。那样做太傻了!我认为你可以遵循如何组合和压缩(也称为压缩)它们的线程,并让Rails在资产标记上缓存=> true,而Passenger处理重新标记资产以进行缓存破坏。也许你的要求比我理解的更具体,这就是为什么你想在URI的路径部分中使用独特的内容。如果是这样,那么一个简单的弱哈希生成器就足够了。然后我会假设你的页面模板能够查找或派生新路径并重新呈现HTML。 - pduey

1

Monkeyman 有你需要的模板引擎,我认为。把它看作是 Middleman 的小 Scala 兄弟。虽然还不如成熟或功能丰富,但我们最终会到达那里。当前版本支持 HAML、Jade、SSP 用于布局,Markdown 用于内容以及其他一些东西。


+1 Wilfred,哇,你能告诉我在这里使用MiddleMan有什么优势吗?我正在使用Scala工作,并对Scala模板引擎(Scalate、Play等)缺乏IDE支持感到沮丧。假设在你的项目中也是如此,Jade、SSP等只有纯文本没有IDE辅助,对吗?希望能够在整个过程中获得编译时类型安全性,但似乎在2012年初还不是现实... - virtualeyes
对我来说,好处在于我正在参与使用SCAML、SSP等项目。但你是正确的,IDE对于编写SCAML模板的支持不多。我使用Emacs haml-mode和IntelliJ的HAML支持。这有助于确保你的HAML正确无误,但不能解决Scala部分的问题。但一般来说,如果预编译模板或者(如Monkeyman)能够刷新并获得详细错误信息,那么这并不是最大的问题。 - Wilfred Springer
是的,缺乏IDE支持让我倾向于使用CoffeeScript&LESS生成的静态HTML模板,并且“仅”在后端使用Scala;即没有模板引擎,在Middleman,Rails或其他地方预编译静态HTML。话虽如此,我还是要看看Monkeyman,理想情况下可以为所有内容使用相同的堆栈(Scala具有SBT Coffeescript&LESS,只是该死的模板引擎IDE支持不存在,Scalate和朋友们出现多年后,arggghhh ;-)) - virtualeyes

0
您可以查看docpad。它是用coffeescript编写的,运行在Nodejs上。它是基于文档的,您可以编写一些文档和布局,然后进行编译并将它们写入out目录。通过插件,您可以使用很多语言编写文档。
它还支持多级文件编译。例如从ecomarkdown再到html
它的另一个伟大特性是可以查询在文档中生成的其他文档。例如,在首页中,您可以这样获得所有博客文章: database.findAll({url : /posts/}) 这将返回所有在其URL中有“posts”的文档。

0

你可能也应该查看mod_pagespeed。它至少会给你以下内容:

  • Javascript必须合并和压缩
  • CSS文件必须合并
  • 每个图像/CSS/Javascript资源必须具有唯一的URL以获得更好的缓存(查询字符串不足够)
  • 只有在实际更改时,资产URL才应该不同

它不会给你以下内容:

  • 通过HTML、CSS、Javascript和图像文件进行本地化支持
  • 带有布局、部分等的漂亮模板引擎。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接