[Node] Node 基本觀念
NodeJS 是一個在 Chrome 的 V8 引擎之上的執行環境,加上一系列的 C/C++ 的套件,讓我們可以在 server 端執行 JavaScript。
NodeJS 裡面有許多內建模組,在 lib 資料夾中就有 http.js 可以建立網路伺服器。
安裝與執行
去到 Node 的官網下載 LTS 版本,安裝之後開啟 Terminal,可以透過 node --version 確認當前版本。
若是僅在 terminal 輸入 node 進入 Node 環境中,撰寫程式碼可立刻執行,就像是在瀏覽器寫程式碼一樣。
而下個範例,在建立好一個 JS 檔 (app.js) 之後,我們可以透過 node app.js 來執行該 JS 檔。
全域物件
在網頁端的全域物件為 window ,下面為範例,在全域定義了 a
var a = 1;
window.a; // 1
在伺服器端 (Node) 中的全域物件為 global ,要透過定義物件屬性的方式,去定義全域變數 a
global.a = 1;
console.log(global.a); // 1;
是因為每一隻 JS 檔都是一個模組,預設不會影響到其他模組,所以要特別定義在 global 上面,才能讓每隻 JS 檔都可以使用全域變數。
匯入與匯出
假設有 app.js 和 data.js 兩個檔案,我們要在 app.js 內匯入 data.js 的資料,首先要先匯出我們要的資料
var data = 2;
module.exports = { content: data, title: "title" };
接著,在 app.js 匯入資料,就可以使用該資料
var content = require("./data");
console.log(content); // { content: data, title: "title"}
省略 module 關鍵字的寫法
export.data = 2;
export.bark = function() {
return "bark!!";
}
一樣,在 app.js 匯入資料
var content = require("./data");
console.log(content.data); // 2
console.log(content.bark()); // bark!!
值得注意的是,兩種寫法不能混用,通常來說,後面定義的模組會蓋掉前面的。
createServer
如何透過 http 模組開啟網路伺服器呢?
var http = require("http");
http
.createServer(function (request, response) {
response.writeHead(200, { "Content-Type": "text/plain" }); // 表頭
response.write("hello!!"); // 送回純文字的內容
response.end();
})
.listen(8080); // 在 127.0.0.1://8080 監聽
request 表示瀏覽器的請求物件,response 表示伺服器的回應物件,在瀏覽器的 devtools 裡面的 Network 可以查看細節。 下面範例回傳 HTML 格式
var http = require("http");
http
.createServer(function (request, response) {
response.writeHead(200, { "Content-Type": "text/html" });
response.write("<h1>hello!!</h1>");
response.end();
})
.listen(8080);
最後,我們看向監聽的網址,127.0.0.1 為內部主機的 IP 位址,8080 為通訊埠,目前被這隻應用程式給使用,常見的編號有 21 (FTP) 、80 (http)、3389 (遠端桌面)。
Path 模組
Path 路徑模組為預設模組,非常常使用到,下方為常見使用範例
var path = require("path");
// 抓目錄路徑
console.log(path.dirname("/xx/yy/zz.js")); // /xx/yy
// 路徑合併
console.log(path.join(__dirname, "/xx")); // Users/steve/Desktop/project/xx
// 抓檔名
console.log(path.basename("/xx/yy/zz.js")); // zz.js
// 抓副檔名
console.log(path.extname("/xx/yy/zz.js")); // .js
// 分析路徑
console.log(path.parse("xx/yy/zz/js")); // { root: '/', dir: '/xx/yy', base: 'zz.js', ext: '.js', name: 'zz' }