Node.js後端開發起手式

Tommy

用JavaScript統治世界

目前已知的JavaScript應用

  • 瀏覽器(Chrome, FireFox, Safari, IE......)
  • 前端工具(Webpack, Gulp, Grunt......)
  • 後端開發(Express, Koa......)
  • 資料庫(MongoDB......)
  • 硬體板(Raspberry Pi, Webduino......)
  • Google雲端服務(Google Apps Script......)
  • ......等等

前端工程師更在乎的是?

前端工具

  • 提升前端開發效率
    • 打包工具
    • 自動化流程
  • 框架CLI工具
    • 快速建構
    • 自帶開發環境

後端開發

  • 伺服器端程式開發
    • 網頁後端
    • 指令工具開發
  • MongoDB資料庫
    • Functions(類似SQL預儲程序)
    • MapReduce(分散運算)

 

安裝環境從零開始

首先要安裝Node.js

透過NVM安裝

優點

  • 快速切換不同版本
  • 方便測試

缺點

  • 占用較多磁碟空間

直接安裝

優點

  • 官網直接下載
  • 版本固定

缺點

  • 切換版本需移除重裝

安裝NVM

nvm for windows

NVM下載Node.js版本

nvm install 10.0.0

NVM切換Node.js版本

nvm use 10.0.0

開發環境選擇

個人偏好使用 vs code

當然你要用記事本也是可以的啦

廣義JavaScript泛指瀏覽器

但Node.js沒有瀏覽器

所以你不能操作DOM和BOM

但跟瀏覽器一樣

都是採用V8引擎

號稱地表最快的JavaScript引擎

REPL

交互式命令(類似開發人員工具的console介面)

執行demo.js檔案

C:\>node demo

等等,這裡有個雷!

this?

var a = 100;

function run() {

    console.log(this.a);

}

run();

先用瀏覽器跑跑看

再用Node.js跑跑看

ex: C:\>node demo

最後在REPL跑跑看

有沒有感覺發現了什麼?

搞得我都快不認識this了

C:\>node demo

裡面的this是新物件

但是function內的this仍然還是global

所以this !== global 很合理

為什麼會有這樣的設計?

避免汙染Node.js全域環境

如果隨便加一個變數可以就掛載到全域其實還蠻可怕的!!!

有點像在一個限定的

function內開始

new (function(exports, require, module, __filename, __dirname) {
//=====================
  console.log(require);
  console.log(this);
  function run () {
    console.log(this);
  }
  run();
//=====================
})({},function() {
  // require
},{},"xxx","yyy");

REPL沒有這個問題?

C:\>node
> this === global
true
>

看出端倪了嗎?

弄懂運行環境差異避免踩雷

Globals

Node.js所提供的全域操作屬性和方法

瀏覽器沒有喔

  • exports
  • require()
  • module
  • __firename
  • __dirname
  • process

require

載入模組(Node.js內建模組)

載入套件(從npm下載的套件)

載入自訂模組(自己寫的模組)

var fs = require("fs");
var data = fs.readFileSync("abc.txt");
console.log(data);

NPM下載套件

C:\>npm install colors
...安裝過程(略)
C:\>dir/w
[.]                 [..]                [node_modules]      package-lock.json
C:\>node
>var colors = require("colors");
undefined
>console.log("text".red);
text
undefined
>

package.json

專案設定檔

記錄專案用到那些套件

 

npm init

透過問答產生package.json

或是全部直接預設npm init -y

package-lock.json

又是什麼?

避免套件更新後
導致與現有專案不相容

鎖定目前安裝套件版本
重新安裝時用相同版號

從npm 5.0開始會自動產生

exports

v.s.

module.exports

exports是現有空物件

module.exports 指向 exports

但require 看的是 module.exports

 

有聽過共享參考嗎?

大部分的人都聽過"傳值參考"和"傳址參考"吧!

var a = {name: "John"};
var b = a;
b.name = "Mark";
console.log(a.name); //?
var a = {name: "John"};
var b = a;
b = null;
console.log(a); //?
var exports = {};
var module = {};
module.exports = exports;

exports = function() { 
  //... 
}

console.log(module.exports); //?

exports不能重新Assign

但module.exports可以

__filename
__dirname

目前正在執行的檔案
目前正在執行的資料夾

在自訂模組上也是顯示
該檔案的名稱與路徑

process

提供全域資訊和訊息控制

常用屬性和方法

  • process.argv
  • process.env
  • process.cwd()

下次直播預告

從0開始打造網頁伺服器

打造一個純靜態檔案的網頁伺服器

Node.js後端開發起手式

By Yi-Tai Lin

Node.js後端開發起手式

  • 847