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

来源:http://www.cnblogs.com/hwding/archive/2017/02/10/6386054.html
-Advertisement-
Play Games

前言 今天上推特看見這篇文章,點進去發現是新貨。 正好最近想入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)和最佳實踐,可以戳下麵的鏈接:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言:無所不能的JavaScript JavaScript起源於Netscape公司的LiveScript語言,這是一種基於對象和事件驅動的客戶端腳本語言,最初的設計是為了檢驗HTML表單輸入的正確性,只是用於網頁開發的一個弱類型腳本語言。隨著Html5在PC和移動端越來越流行,JavaScript ...
  • 在高級應用中需要依靠js閉包(closure)來實現~ 1.變數的作用域:全局變數和局部變數。 Javascript可以在函數內部直接讀取全局變數。 var a=1; //全局變數 var c=2; //運行方法a1後 c被賦值為3 function a1(){ alert(a); //可獲得全局變 ...
  • 迴圈處理是最常見的編程模式之一,也是提升性能必須關註的要點之一。 常見的優化方案有: ①JavaScript的四種迴圈(for、do-while、while、for-in)中,for-in迴圈比其他幾種明顯要慢。由於每次迭代操作會同時搜索實例或原型屬性,for-in迴圈的每次迭代都會產生更多的開銷, ...
  • 破裂圖像 當我們img的src請求失敗的時候,會觸發 事件。這給我們提供了一個處理錯誤圖片的時機,但是很顯然這樣的處理對我們來說太昂貴了。 於是圖片就成了這樣: 這樣很顯然比較難看。 優雅的處理 這時候給我們的圖片添加下麵一些CSS,立馬就會和諧起來。 替換原有的破裂圖片 雖然上面已經相對優雅的處理 ...
  • 項目中突然需要使用複製功能,在網上搜索了下看到了ZeroClipboard插件,好用,但是也有局限。用法如下: 1、引用jquery、zclip.js、swf文件。demo地址:https://github.com/chaoli920029342/jquery_copy 2、初始化 註: 1、需在服 ...
  • 聲明:本文轉自露兜博客 在開始製作WordPress主題之前,首先得瞭解WordPress主題到底由哪些文件構成,你得清楚WordPress程式是怎樣與主題文件連接的。 以下是WordPress預設主題default文件夾下的所有模板文件。看了下圖,可能你還摸不著頭腦,到底這些文件是乾什麼的。Wor ...
  • 都轉爛了,不過還是貼上來了。查的時候方便。。。1. oncontextmenu="window.event.returnValue=false" 將徹底屏蔽滑鼠右鍵 <table border oncontextmenu=return(false)> <td>no </table> 可用於Table ...
  • 前面的話 history對象保存著用戶上網的歷史記錄,從視窗被打開的那一刻算起。由於安全方面的考慮,開發人員無法得到用戶瀏覽器的URL,但藉由用戶訪問過的頁面列表,可以在不知道實際URL的情況下實現後退和前進。本文將詳細介紹BOM中的history對象 length history.length屬性 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...