仅仅几个月时间,我的 JavaScript 程序就打不开了

摘要:作为一门深受开发者喜爱的编程语言,JavaScript 的应用广泛,也不断有新的开发者在尝试使用它搭建新的程序。但同时,许多人发现,JavaScript 项目总是在时隔几个月后,就出现不少问题。

链接:https://pouria.dev/programs-are-dead/

声明:本文为 CSDN 翻译,未经允许禁止转载。作者 | Pouria Ezzati

译者 | 弯月 责编 | 郑丽媛

出品 | CSDN(ID:CSDNnews)曾几何时,你是否曾厌倦了自己所做的一切工作,烦透了屏幕上的每一个亮点,于是一个大胆的想法在你的脑海中闪现--"我可以创建一个程序!"只要一个简单的程序,就可以解决问题,让自己的生活更轻松。如果幸运的话,同事们可能也会喜欢这个程序,每个人都将露出笑容。

于是,你坐下来,开始编写你的 JavaScript 项目。只需敲入几个命令,就可以安装所需的一切。你的服务器架构和前端界面都在同一个地方。

接下来,你添加了一些库,并尝试了 TypeScript,所有代码都可以很好地协同工作。用了很短的一段时间,你就编写好了一个可以正常运转的程序。从酝酿最初的想法,到编写出最终的程序,整个过程快到令人难以置信。

几个月后打开程序,出现一连串的问题

这一天终于来了。你对自己构建的产品感到自豪,你决定与全世界分享你的程序。事实证明,确实有很多人喜欢你的程序。你的 GitHub 代码库获得了大量 Star,而且日常用户数量也很庞大。

六个月过去,虽然你几乎已经忘记了自己的小项目,但现在你有了一些更好的新想法。这个项目还有一些悬而未决的问题和功能请求,于是你又重新打开了项目。

你按捺着激动的心情,低声对自己说,来吧。你打开终端,运行 npm install,然后一边等待 npm 安装依赖项,一边浏览网页。片刻之后,你看了一眼终端,却发现屏幕上显示了一个--错误!再次运行 npm install,并仔细观察,红色的错误仍然在--可是,在过去的六个月里,你甚至没有碰过这些代码,究竟怎么回事?

仔细检查错误,你注意到构建二进制插件的某个 node-gyp 包出了问题,因为这个包与你的新操作系统不兼容。之前你也遇到过类似的问题,也已经修复了这个问题,但这一次的错误消息有点不同。你仔细研究了一番,但没有找到合适的解决方案。

两个小时过去,你放弃了。反正你也不需要压缩那么多图像,所以只需要删除这个依赖项就好了。当然,这只是临时的解决方案,你想着等完成其他工作以后再来添加。于是再次运行 npm install,谢天谢地,这次终于没有错误了(其实,还有 50 个严重的漏洞,只不过此刻你还不知道,至少你可以启动应用程序了)。

你的应用程序终于可以运行了,现在你可以添加自己想到的新功能了。为此,你需要最新版本的 Next.js,而它依赖于最新版本的 React。你注意到 Next.js 的主要版本已经升级了两次,所以现在必须立刻升级。你的应用程序目前使用的版本已经旧了、很慢、很低效,再过几年,就有可能落后 4-6 个主版本,还是赶快升级比较好。

于是,你更新了 Next.js 和 React,并再次尝试运行应用程序。这时,你又遇到了一个错误。你使用的 CSS-in-JS 解决方案与这两者都不兼容,而且状态管理器库也不能正常工作,因为该项目已被维护者放弃,另外现在还要解决 TypeScript 的问题,还有一堆不能修复的漏洞,因为修复这些漏洞会进一步破坏应用程序。我只能默默地祝你好运了!

经过漫长的努力,你终于设法解决了所有问题,并将新功能添加到了应用程序。你长长地舒出一口气,心想自己付出的这些努力是否值得。你问自己,如果再过几个月,你还会想再次打开这个项目吗?你相信一切都能正常工作吗?你信得过 JavaScript 及其生态系统吗?

JavaScript 的发展太快了

根据我个人过去五六年使用 JavaScript 的经验,每次打开一个老项目--无论规模大小、也无论是服务器端还是前端,总会遇到各种问题。如果想开发新功能,甚至有时只是想运行程序,都首先需要克服重重障碍。

刚开始,我以为这只是我个人的问题,可能我缺乏经验,不知道如何使用这门编程语言及其工具。但即便如此,为什么一门编程语言会出现这样的问题?为什么这么容易出错呢?我认为,编程语言应该帮助我们,给我们信心和力量,减少错误,引导我们朝着正确的方向前进,而不是不断地让我们产生自我怀疑,以为自己做错了什么,找不到正确的方法。

我知道,上面提到的这些问题涉及整个 JavaScript 生态系统,而不仅仅是语言本身,也许有人会说把一切责任推到 JavaScript 头上是不公平的,但我认为语言本身也难辞其咎。这些问题涉及范围甚广,而且并不简单,不能归结成依赖系统等问题。语言有责任为程序提供上下文和环境。当我们谈论一种编程语言时,我们指的是一个整体以及用户的使用方式,而不仅仅是语言的规范。

JavaScript 一直在快速发展和进步,这与我接触过的任何其他技术都不一样。其中一个原因是,越来越多的应用程序和设备都采用了 JavaScript,因此使用的程序员和用户也越来越多。这意味着,所有这些领域每天都会遇到新问题,而这些问题统统需要通过这门语言及其背后的社区来解决,所以他们会不断发布新的功能和工具,这样才能跟上前进的步伐。

这些人每天都在朝着自己前进的方向努力,他们推出了 TypeScript、Vite 或 esbuild 之类的工具、Node.js、Deno 或 Bun 之类的运行时、Next.js 或 Electron 之类的框架和库、eslint 或 tslint 之类的 linters、Jest 之类的测试运行器,他们每天都在进步,凭借自己的努力突破极限,同时彼此依赖,并努力跟上最新版本的 JavaScript。

另一个原因可能是 JavaScript 本身存在缺陷。这门语言当初的设计初衷与如今的发展大相径庭。我们来比较一下如今的 JavaScript 与十年前的样子。

在 2009 年之前,JavaScript 甚至没有 .map() 之类基本的不可变数组方法。JavaScript 走了很长一段路才发展成今天的样子,尽管这一路上 JavaScript 推出了各种补丁、工具以及 TypeScript 之类的超集,但依然无法满足所有的需求。事实上,人们对 JavaScript 的要求太高了,甚至超出了它目前可以处理的范围。就目前的状态而言,JavaScript 还面临着一大堆漏洞需要填补,核心的问题需要解决,缺乏的功能需要实现。

JavaScript 的这些需求是否证明了我们创建的框架和工具的变化速度及频率很合理呢?也许是,也许不是。但考虑到 JavaScript 生态系统的结构及其互相依赖性,以及该语言在各个领域的使用,也许在做决定之前,我们应该先退后几步,反思整个语言的长期发展愿景,并认识到每一个变化,哪怕是一个微不足道的小变化,也有可能影响到所有用户。我们有责任确保我们的应用程序、库或框架能够与其他常用的库或框架协同工作。

完美世界

我并不是设计编程语言或为其编写运行时的专家,而且我明白即便是解决一个很小的问题也有很多难处,尤其是在 JavaScript 如此规模之下。然而,作为一名用户,我依然有一个心愿,我希望在完美的世界里,我可以轻松地打开旧项目,一切都能正常工作。在这个完美的世界里,我的程序能够经得起时间的考验。

在这个完美的世界里,我有一个统一的模块系统,我不需要担心文件扩展名、构建工具和兼容性,我不需要几十个第三方 linter、类型检查器和配置来确保我的代码正确,我不会因为没有使用某项技术而觉得得我的应用程序不够完美。

在这个完美的世界里,我可以随意使用任何库,不必担心这些库依赖于数百个其他库,不必担心这些库已无人维护。

在这个完美的世界里,我正在使用的框架不会每隔几个月就从头开始重写。

我希望将来有一天我能微笑着重温这篇文章,JavaScript 能够证明我错了,他们已经将一切资源整合到一起了。

Google 拉起「红色警戒线」,应对 ChatGPT 的巨大威胁!?openGauss+Wasm:构建安全高效的UDF执行引擎?年薪达 35 万元,杭州成为薪酬最高的城市,北上、重庆通勤时间最久,揭晓 2022 年最具潜力的软件名城!

「点点赞赏,手留余香」

赞赏

  • 无敌双色球
  • 陈丑帅男
  • 2人赞过
2
0
0
评论 0 请文明上网,理性发言

相关文章

  • 1、console.log输出console.log(([][[]]+[])[+!![]]+([]+{})[!+[]+!![]]) 2、优雅的取随机字符串Math.random().toString(16).substring(2) 3、if比较["toString"]()==="10" 4、优雅的取整vara=2.3
    Pr83ho0 5 2 0 条评论
  • 在电影《叶问》中,甄子丹饰演的叶问每天会利用木人桩练习武艺,使得泳春拳法成为肌肉记忆的一部分。临场迎敌时,身体会使用正确的拳式,自然而然。 我以为JS编程基本功的练习于武术拳法的练习是一样的。通过一套有效的『拳法』将JS基本功内置其中,反复练习,使得JS技艺成为手指记忆的一部分。这样,当面对实际开发时,我们就不需要为
    tud3yhp8t_ 7 0 0 条评论
  • 前言我们知道Javascript语言的执行环境是"单线程"。也就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务。 这种模式虽然实现起来比较简单,执行环境相对单纯,但是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(假死),往往就是因
    小小呆萌 7 0 0 条评论
  • 一、是什么函数式编程是一种"编程范式"(programmingparadigm),一种编写程序的方法论 主要的编程范式有三种:命令式编程,声明式编程和函数式编程 相比命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而非设计一个复杂的执行过程
    程语嫣晨芳芳响 8 9 0 条评论
  • 探索函数式编程,通过它让你的程序更具有可读性和易于调试--MattBanz 本文导航?什么不是函数式编程04%?纯函数08%?不变性17%?函数组合42%?递归50%?高阶函数69%?柯里化80%?总结95%编译自|https://opensource.com/article/17/6/functional-java
    韩兔兔 5 3 0 条评论
  • 作者丨AlexanderHafemann 译者|布加迪 用JavaScript编写第一段代码可能需要一天左右的时间,但深入了解其未知知识和背景知识可能让你在整个职业生涯受益无穷! 作用域(scope) 简而言之,作用域就是"你可以在代码中访问声明的地方"。 我们有两种作用域:全局作用域和局部作用域,区别在于你可以在代
    保罗8007 5 0 0 条评论
  • 前面的文章我们一起玩了Flowable中的ServiceTask,今天我们再来看看Flowable中的脚本任务。 1.脚本任务个人感觉脚本任务和我们前面说的ServiceTask很像,都是流程走到这个节点的时候自动做一些事情,不同的是,在ServiceTask中,流程在这个节点中所做的事情是用Java代码写的,在脚本任
    摩羯会弹琴吗 5 0 0 条评论
  • 网络研究院 新的Windows零日漏洞允许威胁参与者使用恶意的独立JavaScript文件绕过Web标记安全警告。已经看到威胁参与者在勒索软件攻击中使用零日漏洞。Windows包含一个称为Web标记(MoTW)的安全功能,该功能将文件标记为已从Internet下载,因此应谨慎处理,因为它可能是恶意的。MoTW标志作为
    隐若蕊 5 0 0 条评论
  • 写在前面 为了提升应用稳定性,我们对前端项目开展了脚本异常治理的工作,对生产上报的jserror进行了整体排查,试图通过降低脚本异常的发生频次来提升相关告警的准确率,结合最近在这方面阅读的相关资料,尝试阶段性的做个总结,下面我们来介绍下js异常处理的一些经验。先说概念 什么是异常先来看一下官方的定义:Errorobj
    莫灬z 7 0 0 条评论
  • 喜讯 在2022年9月,由海南省计算机学会组织的全省全国青少年信息学奥林匹克联赛(NOIP)及CSP-JS非专业级别的能力认证考试,以及2022海南省青少年信息学竞赛中,我校共六名学生参加第一轮认证暨2022海南省青少年信息学竞赛(初赛),并全部入围第二轮认证暨复赛,其中获得二等奖2人,三等奖3人。 向以上获奖的同学表
    乜环可 7 3 0 条评论