2018年3月15日 星期四

Node.js 學習筆記 (一) : 安裝 Node.js

上週市圖預約的 "動手玩藍牙 : 用Arduino.Raspberry Pi與智慧型手機打造低功耗藍牙專題" 到館, 翻閱內容發現第 11 章有用到 Node.js 來遙控 Rolling Spider 無人機, 讓我對 Node.js 功能的進展感到驚艷 :


Source : 金石堂


這讓我想起過年前向金石堂買的 "打造Web物聯網|使用Node.js與Raspberry Pi", 書到後一直沒時間讀就晾在書架上, 好奇之下找出來看發現作者以 Node.js 為基礎開發的 WoT (Web of Things) 概念非常棒, 只要嵌入式設備可以跑 Node.js (例如樹莓派 Pi 3, Pi zero, Beaglebone 等), 就可以在上面搭建 WOT 環境, 使用方便的網頁技術就可以玩 IoT :

Source : 金石堂


其實我在 2012 年就注意到 Node.js 了, 當時下載安裝的版本還只是 v0.8.16; 2015 年再度關注 Node.js 時下載的是 0.12.5 版; 現在則已經升版到 v9.8.0 了, 經過六年的躍進, 功能想必已非昔日吳下阿蒙, 唉, 我是不是錯過了甚麼? 這種感覺就好像找到一支好股票, 卻沒有在它還曖曖內含光的時候進場一樣. 參考 :

# 關於 Node.js

上周末帶一堆書回去, 事實上只看了 "打造Web物聯網|使用Node.js與Raspberry Pi" 這本, 看了前三章覺得 WoT 的構想非常優, 因為傳統玩 IoT 都要學習 C, Python, 或 Lua 等語言, 導致非工程背景的人即使對 IoT 有興趣也只能望之卻步.

WoT 的想法就是要用最普及也最成功的 Web 技術把 IoT 細節包裝起來, 學習者只要具備 Javascript 與 HTML 知識即可實作物聯網創意, 而以Javascript 建構的 Node.js 就是一個非常理想的框架, 除了其事件驅動與非阻塞式 IO 特性外, 前後端統一以 Javascript 撰寫也使實作技術單純化. 這讓很久沒摸物聯網的我想從 Node.js 為起點重新出發.

首先在 Windows 安裝 Node.js, 複習一下 Javascript 語法, Windows 版下載位置 :

https://nodejs.org/en/

安裝檔案列表在此 :

https://nodejs.org/dist/latest/

我下載的是目前穩定的 8.10.0 LTS 版, 為了存取方便, 我修改安裝路徑為 "C:\nodejs\", 其他都按下一步即可 :





Node.js 的 API 與教學參考 :

https://nodejs.org/en/docs/
https://nodejs.org/dist/latest-v8.x/docs/api/
https://www.w3schools.com/nodejs/default.asp
Node.js v8.11.2 Documentation

安裝好後開啟命令提示字元視窗輸入 node -v 查詢 Node.js 版本 :

D:\test>node -v
v8.10.0

輸入 node 就會進入 Node.js 解譯器介面, 這相當於 MicroPython 的 REPL (Read-Eval-Print Loop) 介面, 因為安裝時預設會自動幫我們設好環境變數.

執行 Node.js 指令有三種方式 :
  1. REPL 互動式介面
  2. 執行指令檔
  3. 以 eval 執行
最常用來做測試的是 REPL 互動式介面, 例如呼叫 console.log() 函數透過標準輸出介面輸出文字 :

C:\Users\Tony>node 
> console.log("Hello World!")
Hello World!
undefined       
>

console.log() 會先輸出內容, 然後輸出傳回值, 此處 console.log() 無傳回值故輸出 undefined. 這只有在 REPL 介面才會這樣, 如果用指令檔或 eval 方式執行就不會輸出 undefined, 而是顯示一列空行.

退出 REPL 介面的方法有四 :
  1. 按 Ctrl+D
  2. 按 Ctrl+C 兩次
  3. 輸入 .exit
  4. 輸入 process.exit()
執行 NodeJS 指令的第二種方式是將指令編輯為 JS 檔, 然後用 node xxx.js 即可, 例如可將  console.log(Hello World!) 指令存成 hello.js, 然後在命令列執行 node hello.js :

D:\test>node hello.js
Hello World!

D:\test>

注意, 這種方式不會顯示 undefined, 而是顯示空行. 其次, 指令檔不一定要存成 .JS 檔, 任何副檔名都可以 (例如 .txt 檔), 甚至沒有副檔名也可以 :

D:\test>node hello.txt
Hello!

D:\test>node hello
Hello!

D:\test>

第三種執行方式是用 eval 方式執行指令, 只要將指令以括號括起來放在 node -e 後面即可 :

D:\test>node -e "console.log('Hello World!')"
Hello World!

D:\test>

不過顯然這種方式比較適合執行單行指令.

至於樹莓派 Rasbian 已內建 Node.js, 但版本比較舊, 升至最新版的方法 :

如何更新樹莓派的 Node.js

2 則留言 :

Unknown 提到...

嗨嗨 我剛接觸nodejs這一塊
有沒有相關書籍是教怎麼寫架構比較好
不然很容易1路寫到底

小狐狸事務所 提到...

您指的是 Node.js 的框架嗎? 可用 Express, 書的話我覺得下面這本不錯 :

https://www.kingstone.com.tw/book/book_page.asp?kmcode=2013120384583