使用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上。
标签
反馈
这篇文章有什么问题吗?请在GitHub上打开一个issue或pull request来帮助我们。