寫給Java開發者的Node.JS簡介

KatCable 7年前發布 | 10K 次閱讀 Java Node.js 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

 

 本文由用戶 KatCable 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!