前言 今天上推特看見這篇文章,點進去發現是新貨。 正好最近想入Node的坑,又有一些Java基礎,所以希望翻譯出來給大家,同時也讓自己加深理解。 才疏學淺,如有不妥之處請指正。 原文鏈接: "Node for Java Developers" 這個 "Node University" 貌似也提供一些 ...
前言
今天上推特看見這篇文章,點進去發現是新貨。
正好最近想入Node的坑,又有一些Java基礎,所以希望翻譯出來給大家,同時也讓自己加深理解。
才疏學淺,如有不妥之處請指正。
原文鏈接:Node for Java Developers
這個Node University貌似也提供一些免費的線上課程。
正文
在我舉辦的Node.js研討會、開設的課程以及編撰的書之中(尤其是我線上教學的時候),最大的受眾便是Java開發者。因為在很久以前,作為一位專業的軟體開發人員,你必須得知曉Java這門語言。然而現在情況大不相同,Node.js以及其他語言諸如Go、Elixir、Python、Clojure的蓬勃發展,表明工程師們更傾向選擇多語言環境作為他們的開發工具。
Node.js,一種跑在伺服器上的JavaScript運行時,設置起來既簡單又快速,因此在從前屬於Java的伺服器領域中廣受好評。這篇文章將用以下幾個小節,幫助Java開發者向Node轉型:
- 給Java開發者看的Node術語
- 類型
- 模塊
- 非同步
給Java開發者看的Node術語
既然你是一名Java開發者,那麼就請允許我用你熟悉的Java名稱和概念來介紹Node術語:
console.log('Hello')
相當於System.out.println("Hello");
- npm相當於Apache Maven(但是npm集成捆綁了Node)
- npmjs.org相當於mvnrepository.com
- Mongoose/Sequelize/Juggler/Waterline/Bookshelf相當於Hibernate(都是對象關係持久化/文檔映射框架)
- Loopback(Node.js API框架)相當於Spring MVC(都是Web應用的MVC框架)
- Express middleware(Express中間件)相當於Servlet filters(都是Web應用的代碼重用)
- Atom/VS Code相當於Eclipse(都是寫代碼的工具)
- Webstorm相當於IntelliJ IDEA(都是出自Jet Brains的IDE)
- Webpack/Grunt/Gulp相當於Ant/SBT/Gradle(都是構建工具,Node需要被解釋器翻譯而非編譯成二進位碼,這種翻譯通常被稱為Transpilation)
- Node非阻塞I/O相當於NIO
- MongoDB/PostgreSQL相當於Oracle database
- V8相當於JVM
node debug
相當於jdb
(都是命令行調試器)
- Node Inspector相當於JVE(都是可視化調試器)
- Node基金會相當於Oracle公司(然而Node基金會是非盈利的)
- nvm/n/nave相當於jenv(都用於版本管理)
- Mocha相當於Junit
- Winston相當於Log4J
只要把以上的推論熟記於心,就能夠加速Node學習。
這其中有幾條的說法比較牽強,比如MongoDB屬於NoSQL而Oracle幾乎可以說是一個SQL資料庫。
既然已經介紹了一些Node基本術語,接下來我們將面對一些常見問題,在我的直播課程中經常有人提出這一類問題,即Node/JavaScript與Java的區別。
類型
在Node/JavaScript中,類型非常寬鬆。每一個變數都能夠存儲任何類型的數據,也就是說,是存儲在變數中的數據決定了這個變數的類型,而非變數本身。例如:
let str = 10
console.log(typeof str) // -> number
str = '現在這是個字元串了'
console.log(typeof str) // -> string
同樣在函數的聲明中,不需要為函數參數指定類型。例如,參數page
可以是一個數字類型也可以是一個函數,因為它是一個可選的參數:
const f = function (limit, page, callback) {
if (typeof page == 'function' && !callback) {
callback = page
page = 1
}
// ...
return callback()
}
f(10, ()=>{}) // 可行
f(10, 2, ()=>{}) // 同樣可行
模塊
Node模塊是本地存儲的。存放模塊所占用的空間不足掛齒,但是解決項目中模塊之間的衝突所花去的時間至關重要。
Java通常將項目中的外部依賴放在一個全局文件夾中。
而Node和npm則將項目中的外部依賴存放在項目子文件夾node_modules
中。通過此種方式,Node各個項目能夠使用任何不同版本的模塊而不會在項目之間引起衝突。
要避免把任何東西安裝在一個全局的位置,當然node-static
或者http-server
(本地開發用Web伺服器、靜態內容)除外。甚至像WebPack這類工具也需要安裝進本地的node_modules
文件夾。
正確的安裝姿勢:
npm i express
錯誤的安裝姿勢:
npm i -g express
非同步
Node是一個非阻塞輸入/輸出平臺,可以幫助你更好地搭建高性能Web應用。(Java中同樣有Play或者NIO這類的框架用以類比Node,然而這些框架並不如Node這樣的平臺底層,並且還更加複雜。)
你需要將自己的編程思維從同步轉換到非同步,放棄從前那些用請求、資料庫或文件讀寫來阻塞代碼執行的方式。在Node中,開發者將充分挖掘回調(Callbacks)的力量(同時自由選擇是否使用Promises、async/await等等)。
fs.writeFile('message.txt', 'Hello Node.js', (error) => { // 可能要耗費很長時間!
if (error) console.error(error);
console.log('保存完成!')
})
// 還沒有寫完文件,下一個周期將回到這裡
這種為非阻塞I/O提供支持的機制叫做事件輪詢(Event Loop),是直接從Google Chrome V8引擎中拿來用的。欲知詳情請參見這篇文章:how Event Loop works。
進一步學習
本文僅是簡介,如果希望更多地瞭解Node以及其設計模式(包括async)和最佳實踐,可以戳下麵的鏈接: