使用Wget创建静态Web应用

上周我们介绍了Wallflower,这是一个用于从Perl Web应用生成静态网站的出色实用程序。本周我们将介绍另一种方法,它使用Wget。这种方法的一个优点是它可以在任何动态Web应用上使用,而不仅仅是Perl应用。

需求

您需要安装Wget - 如果您使用Linux,它应该已经安装。OSX用户可以使用Homebrew进行安装,并且有一个Windows 版本可用。为了跟随此示例,您还需要安装Dancer2,您可以通过cpan获得。

$ cpan Dancer2

创建应用

我们将使用Dancer2创建一个基本的应用框架

$ dancer2 -a MyApp
+ MyApp
+ MyApp/config.yml
+ MyApp/MANIFEST.SKIP
+ MyApp/Makefile.PL
+ MyApp/views
+ MyApp/views/index.tt
+ MyApp/views/layouts
+ MyApp/views/layouts/main.tt
+ MyApp/t
+ MyApp/t/002_index_route.t
+ MyApp/t/001_base.t
+ MyApp/bin
+ MyApp/bin/app.pl
+ MyApp/lib
+ MyApp/lib/MyApp.pm
+ MyApp/environments
+ MyApp/environments/production.yml
+ MyApp/environments/development.yml
+ MyApp/public
+ MyApp/public/500.html
+ MyApp/public/404.html
+ MyApp/public/favicon.ico
+ MyApp/public/dispatch.cgi
+ MyApp/public/dispatch.fcgi
+ MyApp/public/css
+ MyApp/public/css/error.css
+ MyApp/public/css/style.css
+ MyApp/public/javascripts
+ MyApp/public/javascripts/jquery.js
+ MyApp/public/images
+ MyApp/public/images/perldancer.jpg
+ MyApp/public/images/perldancer-bg.jpg

启动应用

$ ./MyApp/bin/app.pl
>> Dancer2 v0.143000 server 435 listening on http://0.0.0.0:3000

创建静态网站

我们将以递归模式将Wget指向该网站,以便它提取所需的全部文件(默认深度为5)。

$ wget -r 0:3000 -d 0:3000 --page-requisites

在这里,我们传递给Wget以下选项

  • “-r 0:3000”,递归地跟踪0:3000的链接
  • “-d 0:3000”,仅保存本地域的静态文件
  • “–page-requisites”,即使超出深度限制,也要提取页面所需的全部文件

默认情况下,Wget将创建一个以域名命名的目录(“0:3000”),并将所有静态文件放置在那里。到此为止,我们已经生成了静态网站的所有文件。

Wget与Wallflower比较

既然两个应用都可以生成静态网站,哪一个更好呢?如果您正在处理非Perl网站,那么显然Wget是最佳选择。在速度方面,如果您将命令与xargs结合,并并行请求url,Wget会更快。

$ cat urls.txt | xargs -P16 wget -i

要利用并行GET请求的优势,您需要将应用托管在Web服务器上。

Wallflower有一个很好的选项(“-F”),可以下载URL列表,这在整个网站不能通过从根应用页面跟踪链接下载时很有用。App::Wallflower是Wallflower的源库,可以通过Perl代码扩展,因此您可以进一步定制过程以满足您的需求。这可以用于诸如生成sitemap.xml之类的后处理操作或高级设置,如混合应用,其中网站公开页面是静态的,但安全部分仍然是动态的。使用Wallflower,所有这些都可以用Perl编写脚本,而使用Wget,您需要结合shell脚本和Perl,这不太方便。

正如上周文章中所建议的,请确保在模板代码中使用绝对URL,以避免静态文件的部署问题。

感谢

感谢Steve Schnepp提供此提示。感谢Philippe Bruhat创建Wallflower并提供额外的技术指导。

*更正:根据模块作者的澄清,更新了Wallflower和Wget的技术比较。2014-08-02*


本文最初发表在PerlTricks.com上。

标签

David Farrell

David是一位专业程序员,他经常推文并在博客上关于代码和编程艺术进行撰写。

查看他们的文章

反馈

这篇文章有什么问题吗?请在GitHub上打开一个issue或pull request来帮助我们。