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後端開發起手式
- 927