拒绝 Python、C 和 Go,我只用 Node.js!
Node.js 实在是太强大了,远远不止运行网站那么简单。
我要写很多脚本。很多很多脚本。许多时候只是因为许多任务太复杂,或者量太大,以致没法手工完成。所以任何需要花时间的任务我都会写脚本。脚本不仅能减少错误,还能提高效率。我常说的一句话就是:
如果一件事情要做两次,那就写个脚本吧。
一些常见的任务有:
- 从巨大的数组中找出匹配的字符串,或者某个值。
- 删掉所有满足某些条件的一些值。
- 比较 x 和 y 然后输出 z。
我知道大多数程序员都认为 Python,甚至 C# 和 Go 更适合这些任务,但我一直都选择 Node.js 的理由有三个。
1.不会阻塞 I/O
默认情况下,Node.js 可以读取文件、解析内容放入数据库,再将新内容写入文件,这一切几乎都不需要思考。虽然 Python 和其他类似的语言可以通过库函数实现异步的能力,但默认情况下 Python 不是异步的,必须等一个函数执行完成后才能执行下一个函数。
Node.js 就没有这个问题,因为它的设计目标就是处理 Web 上连续不断的请求,而且它的设计是一切皆在后台处理(如文件访问、邮件等等)。
这个特点非常适合我的任务——我经常需要从我的研究对象中提取信息,然后保存到数据库中供以后使用。这样做还可以持久保存数据,同时释放内存,因为内存中不需要保留整个数组也可以调用数据库中的信息,操作、修改数据,所有这一切都在后台执行,所以可以在数据库中存储更多的信息。
I/O 请求也可以放在单独的线程中执行,与 Node.js 的主线程独立。也就是说,读取特别大或者读取困难的文件不会影响到主程序的性能(除了不能立即获取文件内容)。
2.自给自足
在编写只需使用几次的临时脚本时,代码优化并不重要。重要的是把代码写出来并运行。而负责运行 Node.js 的 V8 引擎(C++)正好能派上用场。
如果你只能将数组放到内存中操作,那么当数组非常非常大时,你会担心机器的状态和使用的内存量。幸运的是,V8 能通过自动垃圾回收来处理这一切。
也就是说,一块信息不再使用之后(比如从数组中删除掉的信息),其内存会自动被清除,然后在下次垃圾回收时被释放。尽管垃圾回收的检查和回收过程很复杂,但至少我可以专注于编写我的代码,而不用担心内存管理等,可以放心地把这一切交给 V8 来处理。
3.交互式结果怎么办?
一方面 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
译者:弯月,责编:屠敏
“征稿啦!”
CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。
如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱([email protected])。