NodeJS 小工具推薦

初嘗 Node.js 開發(fā),使用到了一些小工具,在此與大家分享。一篇小白出品的小白文,歡迎大神們慷慨指導!

首先介紹具體需求:使用 .html 模板根據(jù)配置內(nèi)容生成定制的靜態(tài)網(wǎng)頁,這些靜態(tài)網(wǎng)頁被部署至 n 臺服務器上供訪問。

為何要生成大量相似度極高的靜態(tài)文件,而非使用數(shù)據(jù)庫并通過請求渲染模板呢?項目背景如此,不必糾結(jié)吐槽,本文重點在于分享幾款實用小工具。


Cheerio

使用 .html 模板生成靜態(tài)網(wǎng)頁,我們需要解析模板文件,根據(jù)配置替換相應元素。

假定該模板文件名為 template.html,我們這樣讀取它:

fs.readFile('template.html', 'utf8', function (err, data) {
    if (err) {
        // code
    } else {
        console.log(data);
    }
});

需要指定字符編碼為 utf8,不然 data 值如下:

獲取到 .html 模板內(nèi)容后如何解析并定位元素呢?正則匹配是可行的,但有更好的方法:使用 Cheerio。

var cheerio = require('cheerio');
fs.readFile('template.html', 'utf8', function (err, data) {
    if (err) {
        // code
    } else {
        var $ = cheerio.load(data);
        var $elem = $('.elem');
        // code
    }
});

其中 $ 的使用與 jQuery 中的并無太大差異。


Simple Git

機智的你發(fā)現(xiàn)我僅操作了一臺服務器上的文件,而為實現(xiàn)負載均衡用戶會訪問至其中一臺服務器,那么如何同步 n 臺服務器的資源呢?

使用 Github 作為媒介:

文件的增刪改在服務器 A 上進行,而后提交至 Github,服務器 B 從 Github 上拉取更新即可完成資源同步。

可使用 Simple Git 以執(zhí)行函數(shù)代替在終端內(nèi)執(zhí)行 Git 命令行。

Simple Git: A light weight interface for running git commands in any node.js application.

var git = require('simple-git');
git(path)
    .checkout(branch)
    .pull('origin', branch)
    .add('.')
    .commit(message)
    .push('origin', branch);

PM2

NodeJS 服務部署至服務器時需要開啟 Daemon 模式,即進程始終運行于后臺。

若拋出的異常未被 try {} catch (err) {} 捕獲,uncaughtException 事件處理程序可防止進程直接退出。但一些底層錯誤引發(fā)的進程崩潰,uncaughtException 便不再適用。

可使用 PM2 實現(xiàn) NodeJS 服務的進程管理。當進程異常退出時,PM2 會嘗試重啟進程保證服務的穩(wěn)定運行。

執(zhí)行如下命令開啟服務并為該進程命名:

pm2 start ./bin/www --name [名稱]

當服務端代碼更新時,需要重啟服務,執(zhí)行:

pm2 restart [名稱]

原先的進程會被 kill,并開啟新的進程。故無需通過 lsof 端口號手動 kill 進程。


Express Http Proxy

Express Http Proxy: Express middleware to proxy request to another host and pass response back to original caller.

渲染一個前端頁面所需的數(shù)據(jù)可能來源于 n 個不同域的 n 個接口。瀏覽器存在跨域行為,跨 n 個域請求 n 個接口不現(xiàn)實。API 層就是要將這些接口和諧統(tǒng)一為一個接口供前端調(diào)用。扯遠了...需求背景沒辣么復雜,需要搬出 RPC(遠程調(diào)用)這個概念。但希望將來能有機會與大家分享經(jīng)驗。

其實我只想轉(zhuǎn)發(fā)一個請求解決跨域問題。使用到了 Express Http Proxy。

var proxy = require('express-http-proxy');
router.get('/hybrid/topic_reply/:id', proxy('backend.test.env', {
    userResDecorator: function (proxyRes, proxyResData) {
        var data = JSON.parse(proxyResData.toString('utf8'));
        return JSON.stringify(data);
    }
}));

此時訪問 [我的域名]/hybrid/topic_reply/:id 可請求到 backend.test.env/hybrid/topic_reply/:id 的數(shù)據(jù)。其中 data 可隨意修改,return 值為請求返回值。


作者:呆戀小喵

我的后花園:https://sunmengyuan.github.io/garden/

我的 github:https://github.com/sunmengyuan

原文鏈接:https://sunmengyuan.github.io/garden/2017/10/20/node-tool.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,680評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,281評論 25 708
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,252評論 7 249
  • 看《進化心理學》,里面提到一個概念:生存適應器。 適應器,用科學的話來說,是一種進化而來的、通過遺傳獲得的、穩(wěn)定發(fā)...
    逄格亮閱讀 619評論 1 1
  • (頻陽人)古風滄桑閱盡人世淡恩怨悲歡都系緣墨滴毫端寫春雨詩吟紙上詠秋泉三生得失東流去一枕黃粱夢里遷何人沒有憂心事銀...
    石川河女神閱讀 248評論 0 0

友情鏈接更多精彩內(nèi)容