拒绝 Python、C# 和 Go,我只用 Node.js!
Node.js 实在是太强大了,远远不止运行网站那么简单。
我要写很多脚本。很多很多脚本。许多时候只是因为许多任务太复杂,或者量太大,以致没法手工完成。所以任何需要花时间的任务我都会写脚本。脚本不仅能减少错误,还能提高效率。我常说的一句话就是:
如果一件事情要做两次,那就写个脚本吧。
一些常见的任务有:
从巨大的数组中找出匹配的字符串,或者某个值。
删掉所有满足某些条件的一些值。
比较 x 和 y 然后输出 z。
我知道大多数程序员都认为 Python,甚至 C# 和 Go 更适合这些任务,但我一直都选择 Node.js 的理由有三个。
不会阻塞 I/O
默认情况下,Node.js 可以读取文件、解析内容放入数据库,再将新内容写入文件,这一切几乎都不需要思考。虽然 Python 和其他类似的语言可以通过库函数实现异步的能力,但默认情况下 Python 不是异步的,必须等一个函数执行完成后才能执行下一个函数。
Node.js 就没有这个问题,因为它的设计目标就是处理 Web 上连续不断的请求,而且它的设计是一切皆在后台处理(如文件访问、邮件等等)。
这个特点非常适合我的任务——我经常需要从我的研究对象中提取信息,然后保存到数据库中供以后使用。这样做还可以持久保存数据,同时释放内存,因为内存中不需要保留整个数组也可以调用数据库中的信息,操作、修改数据,所有这一切都在后台执行,所以可以在数据库中存储更多的信息。
I/O 请求也可以放在单独的线程中执行,与 Node.js 的主线程独立。也就是说,读取特别大或者读取困难的文件不会影响到主程序的性能(除了不能立即获取文件内容)。
自给自足
在编写只需使用几次的临时脚本时,代码优化并不重要。重要的是把代码写出来并运行。而负责运行 Node.js 的 V8 引擎(C++)正好能派上用场。
如果你只能将数组放到内存中操作,那么当数组非常非常大时,你会担心机器的状态和使用的内存量。幸运的是,V8 能通过自动垃圾回收来处理这一切。
也就是说,一块信息不再使用之后(比如从数组中删除掉的信息),其内存会自动被清除,然后在下次垃圾回收时被释放。尽管垃圾回收的检查和回收过程很复杂,但至少我可以专注于编写我的代码,而不用担心内存管理等,可以放心地把这一切交给 V8 来处理。
交互式结果怎么办?
一方面 Node.js 的目标之一就是运行网站。而另一方面我需要显示脚本结果或者将其发给别人,比如让别人也能查看运行结果甚至能够修改脚本的运行参数,所以我可以利用 Node.js 的真正的目标来实现这一需求。
Node.js 可以通过模板语言很容易地将结果直接放到服务器上。我使用的模板引擎是 EJS,因为它跟脚本一样非常直观。这是典型的“只做一件事并且做好一件事”的例子。
我知道其他脚本语言也能运行网站,而且也非常容易(比如 Python),但能在同一个脚本中编写逻辑代码并提供结果,而无需离开 Node.js 的生态系统,还是很有诱惑的。
以上就是我干什么都是用 Node.js 的理由。不论是构建网站,访问数据库还是编写脚本来自动处理文件,我都会默认选择 Node.js。在此也推荐你也试试用 Node.js 写个脚本。
原文:https://medium.com/@kieranmaher13/why-i-use-nodejs-for-basically-everything-i-do-e0a627787ecc
作者:Kieran Maher
译者:弯月,责编:屠敏
推荐阅读: