首先声明,每种语言都有擅长的领域与独一无二的生态,比较语言孰优孰劣是愚蠢而没有意义的。本文只是个人的一点展望,无恶意,评论区请求理性发言。
为什么我不太熟悉 Node.js 生态链?事实上整个前端技术栈我都不熟悉,一方面是没有一个很好的契机去接触它,另一方面是感觉前端的水太深,我把握不住。
我们先来看看历史上的前端技术栈:
Perl
一个曾经非常流行的技术逐渐被其他技术所取代。
Perl 由 Larry Wall 在 1987 年发布,因其在语法处理上的特色功能和完善的正则表达式集成使其在文本处理上表现优异,因而广受早期互联网开发者青睐,是 CGI(Common Gateway Interface)编程的主要语言,用于构建动态网页,还被广泛用于编写系统管理脚本,处理日志文件、自动化任务。
1990 年代和 2000 年代初,Perl 被广泛采用于各种领域,包括企业级应用、学术研究和开源项目。许多标志性项目(如 Perl 5、Apache 的 mod_perl)进一步巩固了 Perl 的地位。
Perl 的设计哲学是“有多种方式做同一件事”(There's More Than One Way To Do It,TMTOWTDI),这种灵活性极大地提高了开发者的生产力,并促使 CPAN(Comprehensive Perl Archive Network),Perl 的模块仓库,提供了大量的第三方模块,极大地扩展了 Perl 的功能。
然而,过强的灵活性损伤了可读性与可维护性,使得代码难以阅读和维护,特别是对于新手来说,同一任务的不同实现方式严重加大了阅读成本。也因此,Perl 被称为“只写语言”(write-only language)。CPAN 的许多模块缺乏维护,质量参差不齐。
Perl 6 的开发进一步导致了社区的分裂。Perl 6 是一个全新的语言,与 Perl 5 不兼容,这使得许多开发者感到困惑和不满。同时,Python 等新兴语言提供了更简洁、更易读的语法,许多原有的 Perl 项目开始迁移到其他语言,特别是 Python 逐渐取代了 Perl 在系统管理的脚本文件等领域的地位;而随着 Web 开发的演进,PHP、Java 和后来的 JavaScript 框架成为主流,Perl 在 Web 开发中的地位逐渐被边缘化。这导致了恶性循环:随着 Perl 的流行度下降,掌握 Perl 的开发者越来越少,企业招聘 Perl 开发者的难度增加,对 Perl 的选择就变少,加剧了 Perl 的流行度下降。
PHP
PHP 的兴衰与 Perl 有些相似,但也有其独特的发展轨迹。PHP 曾经是 Web 开发的主流语言,尤其是在动态网站和内容管理系统(Content Management System,CMS)领域占据主导地位。
PHP 由 Rasmus Lerdorf 在 1994 年发布,最初是为了管理个人主页(Personal Home Page Tools)。PHP 赶上了 Web 开发的黄金时代,在 2000 年代初期,PHP 被广泛用于开发动态网站,特别是在中小型项目中,许多流行的 CMS(如 WordPress、Typecho)都是基于 PHP 开发的。PHP 的语法简单,学习曲线低,使得初学者能够快速上手,且提供了大量的内置函数和扩展,使得开发者能够快速构建功能丰富的 Web 应用。然而,PHP 的性能在处理高并发和大规模应用时表现不佳,尤其是在与其他语言(如 Java、Go)相比时。PHP 早期没有包管理器,这确实在早期避免了 Perl 的软件包质量参差不齐的问题,但也阻止了 SDK(Software Development Kit)的分发等本可以避免的重复造轮子,使得用 PHP 开发大型项目几乎不可能。虽然 Composer 为 PHP 提供了现代化的依赖管理工具,但 PHP 的颓势木已成舟,难以挽回。同样,缺乏新生代开发者的加入导致了生态系统快速萎缩的恶性循环。
Node.js
Node.js 是一个相对年轻的技术(2009 年发布),但它已经经历了快速崛起和广泛应用的过程。
Node.js 由 Ryan Dahl 创建,基于 Chrome V8 引擎,首次将本用于前端的 JavaScript 引入服务器端开发,使大量本来只熟悉前端开发的开发者得以进行全栈开发,因而一开始就有相当大群体的开发者。Node.js 的事件驱动架构和非阻塞 I/O 模型使其在高并发场景中表现出色,特别适合实时应用和 I/O 密集型任务,使其成为构建 API 网关和微服务的理想选择,而它的轻量级和快速启动特性也使得它成为云原生时代 Serverless 架构的首选。npm(Node Package Manager)是世界上最大的软件包仓库,提供了数百万个开源模块,极大地扩展了 Node.js 的功能。
2010 年代中后期,Node.js 已经被许多大型公司(如 Netflix、PayPal、LinkedIn)采用,并推动了全栈开发的流行,开发者可以使用 JavaScript 同时开发前后端。
然而,npm 的依赖链问题仍然是一个痛点,尤其是在大型项目中,常常出现“依赖地狱”的问题,而 node_modules 的臃肿也饱受诟病。

Heavy node_modules
大量的依赖模块本质上反映的是 TMTOWTDI 的再现。虽然 TypeScript 提供了类型安全,但 JavaScript 本身的灵活性和动态特性仍然可能导致维护问题。当然,新兴工具(如 pnpm、Yarn)试图解决依赖管理问题,但尚未完全消除。
因而,在没有一个十分强烈的需求的条件下,我觉得我还是得谨慎对待前端的深入接触。