初嘗 Node.js 開發,使用到了一些小工具,在此與你們分享。一篇小白出品的小白文,歡迎大神們慷慨指導!html
首先介紹具體需求:使用 .html 模板根據配置內容生成定製的靜態網頁,這些靜態網頁被部署至 n 臺服務器上供訪問。前端
爲什麼要生成大量類似度極高的靜態文件,而非使用數據庫並經過請求渲染模板呢?項目背景如此,沒必要糾結吐槽,本文重點在於分享幾款實用小工具。node
使用 .html 模板生成靜態網頁,咱們須要解析模板文件,根據配置替換相應元素。git
假定該模板文件名爲 template.html,咱們這樣讀取它:github
fs.readFile('template.html', 'utf8', function (err, data) { if (err) { // code } else { console.log(data); } });
須要指定字符編碼爲 utf8 ,否則 data 值以下:數據庫
獲取到 .html 模板內容後如何解析並定位元素呢?正則匹配是可行的,但有更好的方法:使用 Cheerio。express
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 中的並沒有太大差別。跨域
機智的你發現我僅操做了一臺服務器上的文件,而爲實現負載均衡用戶會訪問至其中一臺服務器,那麼如何同步 n 臺服務器的資源呢?瀏覽器
使用 Github 做爲媒介:bash
文件的增刪改在服務器 A 上進行,然後提交至 Github,服務器 B 從 Github 上拉取更新便可完成資源同步。
可以使用 Simple Git 以執行函數代替在終端內執行 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);
NodeJS 服務部署至服務器時須要開啓 Daemon 模式,即進程始終運行於後臺。
若拋出的異常未被 try {} catch (err) {} 捕獲, uncaughtException 事件處理程序可防止進程直接退出。但一些底層錯誤引起的進程崩潰, uncaughtException 便再也不適用。
可以使用 PM2 實現 NodeJS 服務的進程管理。當進程異常退出時,PM2 會嘗試重啓進程保證服務的穩定運行。
執行以下命令開啓服務併爲該進程命名:
pm2 start ./bin/www --name [名稱]
當服務端代碼更新時,須要重啓服務,執行:
pm2 restart [名稱]
原先的進程會被 kill,並開啓新的進程。故無需經過 lsof 端口號手動 kill 進程。
Express Http Proxy: Express middleware to proxy request to another host and pass response back to original caller.
渲染一個前端頁面所需的數據可能來源於 n 個不一樣域的 n 個接口。瀏覽器存在跨域行爲,跨 n 個域請求 n 個接口不現實。API 層就是要將這些接口和諧統一爲一個接口供前端調用。扯遠了...需求背景沒辣麼複雜,須要搬出 RPC(遠程調用)這個概念。但但願未來能有機會與你們分享經驗。
其實我只想轉發一個請求解決跨域問題。使用到了 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 的數據。其中 data 可隨意修改, return 值爲請求返回值。
做者:呆戀小喵
個人後花園:https://sunmengyuan.github.io...
個人 github:https://github.com/sunmengyuan