当前位置: 首页 > news >正文

静态网站生成器将会成为下一个大热门

Matt Biilmann是现代静态网站托管服务Netlify的联合创始人兼CTO,在开发工具构建、内容管理系统和Web基础架构方面有10多年的经验。他从开源目录StaticGen及GitHub上发现,静态网站生成器发展迅速。像Nest和MailChimp这样专注于设计的公司现在就使用静态网站生成器构建他们的主要站点。Vox Media基于Middleman构建了一个完整的发布系统。Carrot使用自己的开源生成器Roots为一些世界上最知名的品牌创建网站。近日,Matt撰文分析了这一现象背后的原因,并预言静态网站生成器将成为下一个大热门。

\\

像Dreamweaver和FrontPage这样的桌面应用程序,通过WYSIWYG编辑器为构建以内容为驱动的网站提供了解决方案。网页被分成了导航栏、标题栏、页脚栏等可重用的部分。在某种程度上,这就是最早的静态网站生成器。但随着发展,这样的工具逐渐无法满足现代网站构建中设计与内容相分离的要求。于是,LAMP技术栈及诸如WordPress、Drupal和Joomla这样的CMS成为主流,Web进入2.0时代。用户不再只是跟随超链接浏览内容,而是可以订购产品、参与社区及创建内容。

\\

但是,动态网站容易遭受蠕虫攻击。据保守估计,超过70%的WordPress部署容易因为已知漏洞遭受攻击(超过23%的Web网站以WordPress为基础构建)。而几个月前,1200万个Drupal站点需要紧急打补丁。此外,即使是最为优化的动态网站,其性能也无法同静态网站相比。并且,对于动态网站而言,缓存失效非常难以恢复,尤其是需要充分利用CDN的分布式缓存。WordPress网站并不保证同一个URL不会返回不同的HTML。跟踪页面缓存是否失效非常复杂。在这一点上,静态网站完全不同。它们遵循一个非常简单的缓存约定:在URL所对应的文件没有更新的情况下,任何URL都会返回相同的HTML。

\\

近年来,作为传统动态网站基础架构的替代方案,现代静态网站生成器日渐盛行。许多导致静态网站失败的限制已不复存在。现在,每周都会有新的静态网站生成器发布。通常,它们都有如下特点:

\\
  • 模板:允许将网站分解成布局组件和包含组件,以便消除重复,这是静态网站生成器的基本要素之一。 \\
  • 支持Markdown:Markdown的兴起是静态网站生成器流行的根本原因之一。所有主要的静态生成器都支持Markdown,也有一些支持reStruturedText或其它标记格式。但通常,它们都允许内容开发人员以结构化的格式编写纯文本文档,保证了内容与设计的分离。 \\
  • 元数据:在文档顶部,通常采用YAML格式,如下所示: \\

    标题:文档标题

    \\

    分类:类A 类B

    \\

    ---

    \\

    # 具体内容

    \\

    文档正文

    \\

    这使得使用元数据为单个文档作注解非常简单。

    \ \\
  • 资源管道:现在的前端开发几乎总是用到多种构建工具和编译器。大多数现代静态网站生成器都包含了一个资源管道,用于处理资源编译、转译、压缩和打包。 \

另外,静态网站生成器通常会提供一个命令行UI,用于构建网站或运行本地服务器。例如,Jekyll就提供了jekyll build命令。

\\

Matt认为,静态网站生成器技术现在之所以崛起,主要是因为如下几个原因:

\\

但是,在成为主流之前,静态网站生成器还有一些工作要做。例如,初次选择一个静态网站生成器并开始一个项目非常困难,因为这涉及许多复杂的细节,而且这些工具及其文档都还有很大的改进空间。另外,静态网站生成器距离成熟的主流市场还很远,无法提供同传统动态网站平台一样的服务,最为明显的就是内容编辑。对前端开发人员而言,在文本编译器中直接使用Markdown进行编辑并发送到GitHub是个理想的工作流程,但对非技术出身的终端用户而言,这种方式并不友好。这是内容编辑同静态网站生成之间存在的一个巨大鸿沟。该问题不解决,静态网站生成就不会成为主流。

\\

所幸,目前已经有一些“非CMS”方案。例如,The Verge就一直使用Google Sheets作为Middleman的内容层;StaticGen将Gist和GitHub API当作数据库用;Carrot使用Contentful作为一个静态CMS。Matt还提到了其它一些内容编辑解决方案,如Prose.io、Netlify的开源CMS,感兴趣的读者可以进一步研究。

\\

感谢郭蕾对本文的审校。

\

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入InfoQ读者交流群06e1fec4a87eca3142d54d09844c629f.png)。

相关文章:

  • 二维数组举例
  • 7月上旬全球域名新增13.5万个 环比减少近29%
  • sftp详细参数说明
  • Shane版详细设计书 文档模板
  • 简比:三大电商巨头的平台、支付、物流
  • VC++ 如何让ScrollView视图显示滚动条
  • android自定义View的用法
  • Unsupported major.minor version 51.0(jdk版本错误)
  • 最近读cocoaui源代码有感
  • 【原创】MySQL 5.5 新增SIGNAL异常处理
  • 在VMware Update Manager(VUM)里添加HP的补丁源
  • 命令和工具的宿主控件ToolBarControl控件
  • android ViewStub使用
  • [CareerCup] 14.5 Object Reflection 对象反射
  • Windows Phone 应用发布技巧汇总
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • js如何打印object对象
  • PAT A1050
  • Python 基础起步 (十) 什么叫函数?
  • spring-boot List转Page
  • SQLServer插入数据
  • 测试如何在敏捷团队中工作?
  • 缓存与缓冲
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 算法系列——算法入门之递归分而治之思想的实现
  • 听说你叫Java(二)–Servlet请求
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 小程序01:wepy框架整合iview webapp UI
  • 协程
  • 我们雇佣了一只大猴子...
  • !!Dom4j 学习笔记
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (¥1011)-(一千零一拾一元整)输出
  • (Oracle)SQL优化技巧(一):分页查询
  • (八)Flask之app.route装饰器函数的参数
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)为C# Windows服务添加安装程序
  • (转载)OpenStack Hacker养成指南
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • ::before和::after 常见的用法
  • @31省区市高考时间表来了,祝考试成功
  • @JSONField或@JsonProperty注解使用