1. 程式人生 > >拒絕 Python、C 和 Go,我只用 Node.js

拒絕 Python、C 和 Go,我只用 Node.js

Node.js 實在是太強大了,遠遠不止執行網站那麼簡單。

拒絕 Python、C 和 Go,我只用 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 寫個指令碼。