Skip to main content

[Node] Node 基本觀念

NodeJS 是一個在 Chrome 的 V8 引擎之上的執行環境,加上一系列的 C/C++ 的套件,讓我們可以在 server 端執行 JavaScript。

node deps

node src

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.jsdata.js 兩個檔案,我們要在 app.js 內匯入 data.js 的資料,首先要先匯出我們要的資料

data.js
var data = 2;

module.exports = { content: data, title: "title" };

接著,在 app.js 匯入資料,就可以使用該資料

app.js
var content = require("./data");

console.log(content); // { content: data, title: "title"}

省略 module 關鍵字的寫法

data.js
export.data = 2;
export.bark = function() {
return "bark!!";
}

一樣,在 app.js 匯入資料

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' }

參考資料