此文章爲原生 nodejs ,僅作學習使用javascript
想學習 express 和 koa2 的小夥伴請繞路css
此文章適合有HTML 和css 、js 基礎的小夥伴看哦html
若是能幫到你,榮幸之至java
文章純手打,若有紕漏歡迎下方留言node
寫在前面:web
127.0.0.1 : 迴環地址,每一臺電腦都有該ip,指向當前使用的電腦express
nodejs 中的 js 與 瀏覽器中 js 的區別:瀏覽器
瀏覽器中 js :ECMAScript 核心 + DOM + BOM服務器
Node 中的 js :ECMAScript 核心 + 全局成員 + 模塊系統(系統模塊、第三方模塊、自定義模塊)koa
全局成員: setTimeout、setInterval、console.log() 等。
注意 :這幾個名稱和功能雖然和瀏覽器中的同樣,可是是 Nodejs 本身實現的,與瀏覽器無關
安裝nodejs
Nodejs 系統模塊是什麼 :隨着 Nodejs 一塊兒安裝
經常使用的系統模塊: fs、http、url、path 等一個模塊中包含了不少方法和屬性,能夠幫助咱們實現不一樣的功能
使用 HTTP 模塊搭建 web 服務器:
一、引入 http 模塊
建立一個 js 文件,例如此處取名爲 kiss.js 。
const http = require('http');
二、建立服務器對象
const server = http.createServer();
三、開啓服務器
此處監聽了 3000 端口
server.listen(3000, () => { console.log('Server is running...'); });
四、監聽瀏覽器請求並進行處理
server.on('request', (req, res) => { // end方法可以將數據返回給瀏覽器,瀏覽器會顯示該字符串 res.end('Hello Nodejs'); });
on :該方法用來監聽事件
參數1(此處的request):事件類型,request 表明瀏覽器請求事件
參數2 :回調函數。當監聽到瀏覽器請求後出發的回調函數,該函數中有兩個參數
第一個參數(此處的 req ):請求對象
第二個參數(此處的 res ):相應對象
end 方法可以將數據返回給瀏覽器,瀏覽器會顯示該字符串
遂,在 kiss.js 文件中,內容以下:
//1. 導入 http 模塊 const http = require('http'); //2. 建立服務器對象 const server = http.createServer(); //3. 開啓服務器 server.listen(3000, () => { console.log('Server is running...'); }); //4. 監聽瀏覽器請求並進行處理 server.on('request', (req, res) => { // end方法可以將數據返回給瀏覽器,瀏覽器會顯示該字符串 res.end('Hello Nodejs'); });
在文件目錄中打開 cmd ,運行命令 node .\kiss.js ,便可開啓服務器:
打開瀏覽器,在地址欄輸入 http://127.0.0.1:3000/ ,會看到 res.end() 所返回的字符串
如圖
顯示頁面
服務器已經搭建起來了,那麼下一步就是如何在瀏覽器端展現頁面了
首先準備一個 HTML 文件,在 kiss.js 文件同級目錄下建立一個 index.html 文件,準備內容以下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>kisskiss</title> <style> h2 { width: 800px; height: 60px; margin: 100px auto; line-height: 60px; text-align: center; color: white; background-image: linear-gradient(to right, rgb(255, 211, 218) 0%, rgb(132, 223, 132) 100%) } </style> </head> <body> <h2>我是 kiss 首頁</h2> </body> </html>
此時服務器文件 kiss.js 須要另外一個模塊 :文件讀取模塊 ——> readFile
一、引入 fs 模塊
const fs = require('fs');
二、調用 readFile 方法讀取文件內容
fs.readFile('./index.html', 'utf-8', (err, data) => { if (err) { return console.log(err); } console.log(data); })
參數1 : 要讀取的文件路徑,相對路徑和絕對路徑都可(推薦使用絕對路徑)
參數2 : 設置字符集, 經常使用的中文字符集有三種 : utf-八、 gb23十二、 gbk 該參數是可選參數,若是不設置該參數,讀取內容默認是二進制數據
參數3 : 讀取完成後觸發的回調函數,該函數中有兩個參數 err 和 data
err : 錯誤對象 - 若是讀取正確 : err 爲 null ; 若是讀取失敗 : err 爲錯誤對象 ;
data : 文件中的數據
在 congsole.log(data) 處,即可進行對文件內容的操做,data 整個是以字符串類型被取出
調整後 kiss.js 文件內容以下 :
const http = require('http'); //1. 導入 http 模塊 const fs = require('fs'); //5. 導入/加載/引入 文件模塊 //2. 建立服務器對象 const server = http.createServer(); //3. 開啓服務器 server.listen(3000, () => { console.log('Server is running...'); }); //4. 監聽瀏覽器請求並進行處理 server.on('request', (req, res) => { //6. 讀取文件 fs.readFile('./index.html', 'utf-8', (err, data) => { if (err) { return console.log(err); } //7. end方法返回讀取的文件字符串,瀏覽器會顯示該文件內容 res.end(data); }) });
在 cmd 中 Ctrl + C 退出以前啓動的服務器,從新啓動服務器 node kiss.js
在瀏覽器中刷新頁面 http://127.0.0.1:3000/ ,能夠看到準備的 HTML 頁面已經成功展現在瀏覽器中
如圖
Tips : 中文亂碼問題
fs 的 readFile 函數中第二個參數可不寫,可是會形成頁面中文亂碼,另外一個解決辦法是,使用 res(響應對象)中的 setHeader 方法:
res.setHeader('content-type', 'text/html;charset=utf-8');
多個頁面時
再新建一個HTML頁面,index_2.html 內容以下 :
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>第二個頁面</title> <style> i { display: block; background-color: pink; width: 300px; height: 50px; border-radius: 15px; text-align: center; line-height: 50px; } </style> </head> <body> <i>這是第二個頁面</i> </body> </html>
此時問題是,如何才能在輸入不一樣的網址的時候,顯示不一樣的兩個頁面?
解決辦法,修改 kiss.js 代碼以下 :
const http = require('http'); //1. 導入 http 模塊 const fs = require('fs'); //5. 導入/加載/引入 文件模塊 //2. 建立服務器對象 const server = http.createServer(); //3. 開啓服務器 server.listen(3000, () => { console.log('Server is running...'); }); //4. 監聽瀏覽器請求並進行處理 server.on('request', (req, res) => { //6. req對象的url屬性中保存了當前請求的url地址 const url = req.url //7.判斷不一樣url,返回不一樣頁面到瀏覽器端進行展現 if (url === '/') { //8. 讀取文件index.html fs.readFile('./index.html', 'utf-8', (err, data) => { if (err) { return console.log(err); } // end方法返回讀取的文件字符串,瀏覽器會顯示該文件內容 res.end(data); }) } else if (url === '/index_2') { //8. 讀取文件index_2.html fs.readFile('./index_2.html', 'utf-8', (err, data) => { if (err) { return console.log(err); } // end方法返回讀取的文件字符串,瀏覽器會顯示該文件內容 res.end(data); }) } });
重啓服務器,在瀏覽器地址欄輸入 http://127.0.0.1:3000 ,依舊顯示原來 index.html 頁面的內容
在地址欄輸入 http://127.0.0.1:3000/index_2 ,顯示新的 index_2.html 頁面的內容,以下 :
注意: url屬性中保存的地址是沒有 協議、IP、端口號,而且以 / 開頭的地址
http://127.0.0.1:3000 ===> /
http://127.0.0.1:3000/index_2 ===> /index_2
靜態資源加載
上面已經初步體驗了一個服務器是怎樣跑起來的,可是!上面只有一個 html 文件,而且它的樣式是直接包含在 html 文件中的,若是一個 HTML 文件內引入了它的資源文件呢? 好比 css 和 js 文件。
修改文件結構目錄以下 :
index.html 頁面內容 :
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>kisskiss</title> <link rel="stylesheet" type="text/css" href="../public/css/index.css"> <script type="text/javascript" src="../public/js/index.js"></script> </head> <body> <h2>我是 kiss 首頁</h2> </body> </html>
將原來 HTML 文件中的 css 資源單獨抽取出來寫入 index.css 文件中,index.css 文件內容 :
h2 { width: 800px; height: 60px; margin: 100px auto; line-height: 60px; text-align: center; color: white; background-image: linear-gradient(to right, rgb(255, 211, 218) 0%, rgb(132, 223, 132) 100%) }
index.js 文件內容 :
alert('this is kiss.js');
kiss.js 文件內容 :
const http = require('http'); //1. 導入 http 模塊 const fs = require('fs'); //5. 導入/加載/引入 文件模塊 //2. 建立服務器對象 const server = http.createServer(); //3. 開啓服務器 server.listen(3000, () => { console.log('Server is running...'); }); //4. 監聽瀏覽器請求並進行處理 server.on('request', (req, res) => { //6. req對象的url屬性中保存了當前請求的url地址 const url = req.url //7.判斷不一樣url,返回不一樣頁面到瀏覽器端進行展現 if (url === '/') { //8. 讀取文件index.html fs.readFile('./view/index.html', 'utf-8', (err, data) => { if (err) { return console.log(err); } // end方法返回讀取的文件字符串,瀏覽器會顯示該文件內容 res.end(data); }) } });
啓動服務器,主頁一直處於加載狀態
按下鍵盤 f12 ,或者單擊鼠標右鍵 → 檢查 → 選擇 network :
能夠看到 index.css 和 index.js 文件的狀態(status)顯示爲 pending
服務器發起了對 index.css 和 index.js 文件的請求,可是卻一直未獲得服務器的響應
來分析一下此處的原理 :
一、瀏覽器中輸入請求地址 http:127.0.0.1:3000,按下回車發送請求
二、服務器根據請求信息的 url (此時爲 "/")找到 index.html ,並將內容返回給瀏覽器
三、瀏覽器接收到服務器返回的內容,開始對 index.html 進行解析,當解析到 link 標籤和 script 標籤時,再次請求服務器,想要獲取 index.css 和 index.js 文件,但是咱們的服務器代碼中,並無寫針對這兩個文件的內容,因此也就不會返回這兩個文件的內容,服務器就會一直處於等待狀態,直到超時報錯。
接下來咱們修改一下 kiss.js 文件,內容以下 :
const http = require('http'); //1. 導入 http 模塊 const fs = require('fs'); //5. 導入/加載/引入 文件模塊 //2. 建立服務器對象 const server = http.createServer(); //3. 開啓服務器 server.listen(3000, () => { console.log('Server is running...'); }); //4. 監聽瀏覽器請求並進行處理 server.on('request', (req, res) => { //6. req對象的url屬性中保存了當前請求的url地址 const url = req.url //7.判斷不一樣url,返回不一樣頁面到瀏覽器端進行展現 if (url === '/') { //8. 讀取文件index.html fs.readFile('./view/index.html', 'utf-8', (err, data) => { if (err) { return console.log(err); } // end方法返回讀取的文件字符串,瀏覽器會顯示該文件內容 res.end(data); }) } else if (url === '/index_2') { //8. 讀取文件index_2.html fs.readFile('./view/index_2.html', 'utf-8', (err, data) => { if (err) { return console.log(err); } // end方法返回讀取的文件字符串,瀏覽器會顯示該文件內容 res.end(data); }) } else if(url.startsWith('/public')) { //8. 讀取index.html文件的靜態資源文件 fs.readFile('.'+url, 'utf-8', (err, data) => { if (err) { return console.log(err); } // end方法返回讀取的文件字符串,瀏覽器會顯示該文件內容 res.end(data); }) } });
分析 :由於靜態資源文件所有被放到了同一個 public 文件夾下,因此咱們用一個 else if 分支來處理就能夠了
index.css 文件的 req(請求對象)的 url 屬性,值爲 '/public/css/index.css'
index.js 文件的 req(請求對象)的 url 屬性,值爲 '/public/js/index.js'
因此咱們判斷,當 url 以 '/public' 開頭的時候,便將 fs 的 readFile 方法的第一個參數(文件路徑)拼接成相對路徑加上 url 的形式
刷新頁面,能夠看到彈出 js 文件內容:
點擊肯定後能夠看到帶有 css 樣式的頁面,成功顯示!