摘要:服務(wù)器端在響應(yīng)兩種請(qǐng)求方式時(shí),響應(yīng)數(shù)據(jù)格式參考官方文檔。關(guān)于熱部署啟動(dòng)服務(wù)器時(shí)是將腳本放入內(nèi)存,以后都會(huì)直接訪問(wèn)內(nèi)存,避免重復(fù)載入。參考學(xué)習(xí)筆記用搭建一個(gè)簡(jiǎn)單的本地服務(wù)器熱部署代碼,實(shí)現(xiàn)動(dòng)態(tài)調(diào)試,可以實(shí)現(xiàn)熱更新
原文:https://zhictory.github.io/bl...
網(wǎng)友 bottle_ 提供搭建一個(gè)簡(jiǎn)單本地服務(wù)器的思路為下:
我們需要一個(gè) HTTP 服務(wù)器
對(duì)于不同的請(qǐng)求,根據(jù)請(qǐng)求的 URL,我們的服務(wù)器需要給予不同的響應(yīng),因此我們需要一個(gè)路由,用于把請(qǐng)求對(duì)應(yīng)到請(qǐng)求處理程序(request handler)
當(dāng)請(qǐng)求被服務(wù)器接收并通過(guò)路由傳遞之后,需要可以對(duì)其進(jìn)行處理,因此我們需要最終的請(qǐng)求處理程序
我們需要從 HTML 文件里提取數(shù)據(jù)以及展示服務(wù)器傳入的數(shù)據(jù),因此需要將 HTML 和服務(wù)器結(jié)合起來(lái)
index.js
引用模塊
const fs = require("fs"); // 系統(tǒng)文件及目錄進(jìn)行讀寫(xiě)操作 const http = require("http"); // 封裝了高效的 HTTP 服務(wù)器和 HTTP 客戶端 const url = require("url"); // URL 處理
路由
/** * 路由 * @param {Function} handle 請(qǐng)求處理程序 * @param {String} pathname 路徑 * @param {Object} response 響應(yīng)數(shù)據(jù) * @param {Object} postData 請(qǐng)求參數(shù) */ function route(handle, pathname, response, postData) { if (typeof handle[pathname] === "function") { handle[pathname](response, postData); } else { response.writeHead(404, { "Content-Type": "text/plain" }); response.write("404 Not Found"); response.end(); } }
服務(wù)器
/** * 服務(wù)器 * @param {Function} route 路由 * @param {Function} handle 請(qǐng)求處理程序 */ function start(route, handle) { function onRequest(request, response) { const pathname = url.parse(request.url).pathname; let postData = ""; switch (request.method) { case "GET": postData += url.parse(request.url).query; request.setEncoding("utf8"); route(handle, pathname, response, postData); break; case "POST": request.addListener("data", function (postDateChunk) { postData += postDateChunk; }); request.addListener("end", function () { route(handle, pathname, response, postData); }); break; }; } http.createServer(onRequest).listen(8080); console.log("Server has started"); }
請(qǐng)求處理程序
// 請(qǐng)求處理程序 const handle = { // index 接口 "/public/index.html": function (response, postData) { const pathname = __dirname + "/public/index.html"; fs.readFile(pathname, function (err, data) { response.end(data); }); }, // download 接口 "/download": function (response, postData) { response.writeHead(200, { "Content-Type": "text/html" }); response.write(JSON.stringify({ code: 200, data: { "time": new Date().toLocaleString("en-US") } })); response.end(); }, // upload 接口 "/upload": function (response, postData) { response.writeHead(200, { "Content-Type": "text/html" }); response.write("You have sent: " + JSON.parse(postData).value); response.end(); } };
啟動(dòng)服務(wù)器
// 啟動(dòng)服務(wù)器 = 路由處理 + 接口處理 start(route, handle);
index.html
Document
關(guān)于 GET 和 POST 方式的請(qǐng)求參數(shù)
GET 的請(qǐng)求參數(shù)是以查詢參數(shù)形式放在 URL 后面的,服務(wù)器可以從 URL 上獲取參數(shù):url.parse(request.url).query。
POST 的請(qǐng)求參數(shù)則需要作為 xhr.send() 的參數(shù)并轉(zhuǎn)換為字符串來(lái)傳遞,本文使用 JSON.stringify() 來(lái)轉(zhuǎn)換,再在服務(wù)器端用 JSON.parse() 轉(zhuǎn)換。
服務(wù)器端在響應(yīng)兩種請(qǐng)求方式時(shí),響應(yīng)數(shù)據(jù)格式參考官方文檔。
關(guān)于服務(wù)器響應(yīng)頭中的 Content-Type
一般網(wǎng)站的做法是:當(dāng)返回 HTML 頁(yè)面時(shí)為 text/html,當(dāng)使用 JSONP 時(shí)為 text/javascript,當(dāng)使用 CORS 時(shí)為 application/json。
關(guān)于 Node.js 熱部署
Node.js 啟動(dòng)服務(wù)器時(shí)是將腳本放入內(nèi)存,以后都會(huì)直接訪問(wèn)內(nèi)存,避免重復(fù)載入。這種設(shè)計(jì)雖然有利于提高性能,卻不利于開(kāi)發(fā)調(diào)試,導(dǎo)致修改 Node.js 代碼后需要手動(dòng)終止進(jìn)程并重啟才會(huì)生效。
網(wǎng)友 會(huì)奔跑的胖子 提出方案:
你只需要在修改文件后保存,它就能自動(dòng)替你發(fā)布,這就是所謂的熱部署。
supervisor 就是一個(gè) Node.js 的開(kāi)源熱部署工具:
npm i supervisor -g supervisor server.js
該網(wǎng)友還提到另一個(gè)開(kāi)源熱部署工具 hotcode,但經(jīng)測(cè)試 hotcode 若使用 express 4.x 則會(huì)報(bào)錯(cuò),因?yàn)?hotcode 使用的 express.createServer() 已經(jīng)被廢棄。
參考:
學(xué)習(xí)筆記:用Nodejs搭建一個(gè)簡(jiǎn)單的本地服務(wù)器
NodeJS”熱部署“代碼,實(shí)現(xiàn)動(dòng)態(tài)調(diào)試(hotnode,可以實(shí)現(xiàn)熱更新)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94445.html
摘要:搭建本地服務(wù)器參考了的搭建本地服務(wù)器做轉(zhuǎn)發(fā)使用實(shí)現(xiàn),官方文檔配置服務(wù)器和轉(zhuǎn)發(fā)接口地址判斷如果是接口訪問(wèn),則通過(guò)轉(zhuǎn)發(fā)這里參考的源碼,補(bǔ)充了幾個(gè)字體文件的。 起因:公司的產(chǎn)品更換前端框架,接口的訪問(wèn)原本是通過(guò)nginx配置反向代理實(shí)現(xiàn)的,本地沒(méi)有安裝nginx,就用node.js做一個(gè)。 node.js搭建本地http服務(wù)器參考了shawn.xie的《nodejs搭建本地http服務(wù)器》...
原文鏈接 隨著Vateral主題的開(kāi)發(fā)接近了尾聲,在對(duì)主題速度優(yōu)化的時(shí)候發(fā)現(xiàn)之前用的githubpage問(wèn)題多多:首先就是因?yàn)樵趪?guó)內(nèi)的原因,訪問(wèn)速度本身就很慢,曾經(jīng)有次加載一張16kb的圖標(biāo)時(shí)間耗費(fèi)了26s!!?其次,在對(duì)資源做CDN托管加速時(shí),域名是需要備案的,顯然githubpage也是做不了的;所以果斷舍棄了這個(gè)把hexo搭建到了我的阿里云服務(wù)器上 總體來(lái)說(shuō)還是比把hexo搭建到github...
摘要:前言要做一個(gè)全沾的工程師,對(duì)于后端和數(shù)據(jù)庫(kù)來(lái)說(shuō),即使不認(rèn)識(shí)也要見(jiàn)個(gè)面的。基本了解的概念就好,主要是安裝上數(shù)據(jù)庫(kù),并進(jìn)行簡(jiǎn)單的增刪操作。 前言:要做一個(gè)全沾的工程師,對(duì)于后端和數(shù)據(jù)庫(kù)來(lái)說(shuō),即使不認(rèn)識(shí)也要見(jiàn)個(gè)面的。本文給的例子很簡(jiǎn)單,也貼出來(lái)源碼,只要一步步下來(lái),就可以跑起來(lái)啦~~~ 思考一個(gè)需求:做一個(gè)登錄頁(yè)面,自己搭建服務(wù)和數(shù)據(jù)庫(kù),將用戶輸入的登錄信息保存到數(shù)據(jù)庫(kù)如何完成呢:首先選擇...
摘要:文件夾用來(lái)存放供瀏覽器讀取的文件,這個(gè)是打包成的文件。在文件下手動(dòng)建立一個(gè)文件,并寫(xiě)入下面的代碼。配置出口文件的地址在版本后,支持多出口配置。可以防止不同操作系統(tǒng)之間的文件路徑問(wèn)題,并且可以使用相對(duì)路徑按照預(yù)期工作。 搭建webpack_demo1項(xiàng)目,使其運(yùn)行起來(lái) webpack的強(qiáng)大就不介紹了,我們直接動(dòng)手做起來(lái),我們從零開(kāi)始一步步搭建一個(gè)多頁(yè)面的系統(tǒng),多參考webpack中文文檔...
摘要:然后找了個(gè)例子,都成功實(shí)現(xiàn)了,一個(gè)是自已寫(xiě)代碼,要處理好多問(wèn)題,比如我的網(wǎng)頁(yè)是,是搞了半天裝了個(gè)庫(kù)安裝編碼轉(zhuǎn)換結(jié)果可以運(yùn)行了,中文路徑的問(wèn)題也搞定了,但是圖片問(wèn)題還沒(méi)搞定,也變成了文字讀取。 初學(xué)NODEJS,從網(wǎng)站下載了一個(gè)單文件的node.exe,簡(jiǎn)單JS測(cè)試可以了,但是需要用到一些庫(kù)就完全不行了什么npm命令,輸了都無(wú)效,想安裝npm也不知咋弄后面下載了最新版本,安裝的msi版本...
閱讀 1004·2021-11-25 09:43
閱讀 1672·2019-08-30 13:59
閱讀 1589·2019-08-30 11:22
閱讀 2123·2019-08-30 11:06
閱讀 1299·2019-08-28 17:51
閱讀 3717·2019-08-26 12:12
閱讀 778·2019-08-26 12:11
閱讀 443·2019-08-26 12:10