【在主画面加入捷径】
       
【选择语系】
繁中 简中

技术杂谈:如何挑选网页框架 (web framework)?

【赞助商连结】

    有许多想做网页的程序设计者都会想问:如何挑选 web framework (网页应用框架)?这个问题其实不会有唯一的解答,因为网页的技术不断地推陈出新。如果我们把 CGI (Common Gateway Interface) 程序当成网页程序的滥觞,那么网页程序至少有 25 年的历史了;虽然这是一个老议题,但是每隔一阵子,我们又会有一些新的方法可以用来撰写网页程序,好像永远都有学不完的新技术。

    我们对 web framework 最大的误解就是「我们一定要用 web framework 才能写网页程序」。在 Rails 和 Django 出现后,我们仍然可以用 vanilla PHP (即用纯 PHP,不用任何框架) 来撰写网页;在 React 和 Vue.js 出现后,jQuery 仍然是有效的 JavaScript函数库。实际上,笔者蛮鼓励第一次写网页的程序设计者先用 PHP 或 jQuery 这类基本的工具,或者是 Sinatra 或 Flask 之类的微框架,试着写些小东西;之后再用 web framework 写程序时,比较会知道为什么在某个时候要这样写 code。

    不过,使用 web framework 仍然是有好处的。因为 framework 预先挑选一些撰写网页程序会用到的套件,并且会给予项目初始的架构,让程序设计者不用重造轮子,可以专心在撰写核心功能上。理论上,一个项目约 20% 的内容是从头撰写,而 80% 是使用已有的套件;实际上的比例会有所变化,不过,大概可以从此得知使用 framework 的好处。

    说实在的,web framework 百百种,要怎么挑选呢?以下是一些可以考虑的因素:

    • 开发时间
    • 执行效率
    • 框架提供的特性
    • 开发者过去的经验和喜好

    去除掉口水战 (flame war) 等情感因素,其实 web framework 就像是其他的 framework,就是一些预先写好的程序代码,待我们去填入所需的功能。没有那个框架是屌打全世界,也甚少框架完全无用;基本上,就是综合考虑上述因素后,选出最适合自己的 web framework。在下文中,我们会逐一讨论各项因素,让读者可以进一步思考。

    理论上,在同样的算法下,C 语言是最快的,大部分的程序也可以用 C 来撰写。但是,我们却用 C (或 C++) 发明其他更高阶但更慢的语言,只有在要写延伸套件时才回头用 C (或 C++) 写程序。对于等效的工作,使用较高阶的语言来撰写,就可以使用较短的行数来完成;理论上,同样的时间,用较高阶的语言,就可以完成更多的工作。对于 start-up (新创企业) 来说,能够在较短的时间内,推出第一个可用的产品,不论对于募资或上市,都是相当重要的;虽然 Ruby 执行速度较慢,但先前 Rails 在国外很红,基本上就是这样的思维。

    然而,在网站上线后,执行效率的好坏,就会造成成本的高低。同样的使用者数量,如果使用更有效率的语言和框架,就可以用更少的运算资源来满足。脸书为了在尽量不更动程序代码的前提下增加效率,自制 HACK/HHVM 这套新的程序语言和虚拟机器。推特将其服务由 Ruby 转为 Java,也是为了取得更佳的执行效率。开发时间和执行效率就像是翘翘板般,很难兼顾,但开发者们仍然试着找出更好的方案,于是有 Node 和 Go 等新的网页后端语言出现。

    对于 web framework 来说,其特性就是可用的功能,包括模板语言、数据库连接、权限管理、session 管理等,该框架所能提供的特性,也是相当的重要。我们要先知道该框架的特性是否能满足自己的需求,若无法满足,至少要有好的第三方方案或是自己能够处理。由于现在 web framework 的选择相当多,如果发现某个框架缺东缺西,有着重造轮子的感觉,那还不如换另一个更好的框架。对于终端使用者来说,其实无法得知网站内部使用什么 web framework 撰写,通常也不会在意;因此,不需要对 web framework 有太深的情结,选择适合项目的工具比较重要。

    如果在前述的各项条件都满足时,程序设计者还是可以选自己喜欢的工具。Rust 在各项检测 (benchmark) 中,显着地比 Go 来得快,但 Go 目前很明显比 Rust 受欢迎,不仅是 Go 在网页程序相关的函式库比较完整,Go 本身也比 Rust 来得易学易用。笔者先后接触这两种语言,并分别写成入门教程 (Go 可看这里,Rust 可看这里),的确也有相似的感受。

    要使用那个 web framework,通常是技术长要去烦恼的;如果要维护现有的项目,其实也不会在没有强烈好处下任意砍掉重练。不过,如果没有包袱的话,倒是可以帮自己选一下 web framework。如果想要沿用自己现有的语言,通常就是从该语言中选框架即可;像是 PHP 大概会选 Laravel 或 Symfony,Ruby 通常还是会选 Rails,Java 目前可选 Spring Boot 等。如果愿意学新语言的话,Go 倒是可以考虑;有些程序设计者会选用某个 Go web framework,但 Go 其实可不依赖框架的情形下做网页程序。再过几年,可能这些答案又会改变,但本来就没有绝对性的答案。

    【赞助商连结】