寫給Java開發者的Node.JS簡介
前言
今天上推特看見這篇文章,點進去發現是新貨。
正好最近想入Node的坑,又有一些Java基礎,所以希望翻譯出來給大家,同時也讓自己加深理解。
才疏學淺,如有不妥之處請指正。
正文
在我舉辦的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: Persistence Object Relation/Document Mapper framework(都是對象關系持久化/文檔映射框架)
- 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)和最佳實踐,可以戳下面的鏈接:
來自:http://www.cnblogs.com/hwding/p/6386054.html