吐槽被NodeJS用滥的软件设计哲学

NodeJS 真的很火,一把大火带热了一直被轻视的、几乎要被认为不是编程语言的前端语言 javascript。火是不是 NodeJS 烧起来的已经不重要,反正它在大火里面烧得火红火红。

NodeJS 的包管理工具 npm(Nodejs Package Management)在这其中功不可没。

直到 2016 年初,有一个很硬的程序猿 Azer,非常不满自己的权益没有被 npm 这个平台正确对待——具体说,就是 npm 收到另外一个用户的律师信之后,擅自删除了前面这个 Azer 的 package,把 package 的名字直接转让给发律师信的用户管理——一气之下将自己创建并管理的所有 npm 上的项目全部 unpublish 了。这种行为在游戏里面叫自杀。关键人家还说挺对的:我解放了我所有的模块,因为我不会在一个某些人滥用特权的地方分享我的开源工作。结果就比较搞笑了,因为其中一个被删除的模块 left-pad 被大家广泛引用,导致 Babel、Ember、ReactNative 等等构建工具、框架,都不能正常使用。除了一些将 package 打包发布的应用,例如 Atom。这事儿在当时简直就是灾难,N 多前端程序猿被迫加班解决问题。

从这件事情之后,有些人也开始反思,于是知乎上有人问『如何看待 Azer Koçulu 删除了自己的所有 npm 库?』这一类的问题。直到后来终于有人问:难道一个只有十一行代码的功能你们都不能自己写了么?(PS:left-pad 只有十一行有效代码)问题才逐渐回归本源上。

要我说,从我了解 npm 开始,就一直觉得它是 DRY(Donot Repeat Yourself)和 KISS(Keep It Simple, Stupid)的极端实践者。极端到什么地步呢,就像上面提到的,连一个十一行代码的功能都要找 npm 上面的 package 来实现,而不是自己写一份。层层叠叠,相互之间的引用关系堪比用 DNA 图谱勾勒人类进化史和迁移史。

现在看来,哲学是好的,但做得有点儿过。


这两天被 npm 搞得够呛。

一直用 hexo 写博客,好好的。手贱升级了 node 到 7.4.x,完了,发现不正常了,报类似下面的错误。

Fatal error in ../deps/v8/src/api.cc, line 1051
Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo().

github 上找到答案,升级 node 到 8.4.0 之后解决了问题。可是,今天升级 hexo 到 3.3.8 之后,又出现上面的问题。

从 github issue 和错误 stack 中已经知道是 fsevents 引发的问题,而且 fsevents 之前是经过大改的,版本有讲究。对这些历史了解很重要。

删除 node_modules 和 npm cache 之后重新安装 npm 模块,不行。

1
2
3
rm -rf .npm/ node_modules/ package-lock.json db.json
rm -rf ~/.npm/.cache
npm install

yarn 来安装。还是不行。

1
2
3
rm -rf .npm/ node_modules/ package-lock.json db.json yarn.lock
rm -rf ~/.npm/.cache
yarn install

连错误都一模一样。

直到用 npm ls | grep fsevents 命令,发现 fsevents 有两个版本,其中一个是 0.3.8——明显大改之前的。这时候,一个粗暴的办法出现在脑海里面。

在 iTerm3 里面快速定位到使用 fsevents@0.3.8 的组件,原来是 hexo-github@1.0.1 依赖的 nunjucks 这个库。

hexo-github 的作用是将 github 时间线展现在 blog 里面,非常适合程序猿出身的博主,但是我这会儿还没用上。所以先卸载吧。

1
npm uninstall --save hexo-github

好吧,其实我是删除 node_modules 之后修改 package.json,再重装来的。:-P

总之,就好了。

hexo-github 的依赖关系指明依赖 nunjucks@^1.3.4,这好像是 npm install --save nunjucks 时会自动添加进 package.json 文件中的格式。默认格式。现在 nunjucks 的版本是 3.0.1,已经不在 1.x.x 这条主版本线上。所以,除非 hexo-github 的作者手动更新依赖中 nunjucks 的主版本号,否则就被栓死在 1.x.x 主线上。

万一真遇到 hexo-github 这样几乎已经不维护的 package,我真有自己 fork 一个库自己改的冲动。但这样又不 DRY 了,对吧?

心好累啊。[捂脸]