滬江CCtalk視頻地址:https://www.cctalk.com/v/15114923889450
規范與部署懶人推動社會進步。
本篇中,我們會講述三個知識點
定制書寫規范
開發環境運行
如何部署運行
定制書寫規范文中所說的書寫規范,僅供參考,非項目必需。
隨著 Node 流行,JavaScript 編碼規范已經相當成熟,社區也產生了各種各樣的編碼規范。但是在這里,我們要做的不是『限制空格的數量』,也不是『要不要加分號』。我們想要說的規范,是項目結構的規范。
目前我們的項目結構如下:
├─ controller/ // 用于解析用戶的輸入,處理后返回相應的結果 ├─ service/ // 用于編寫業務邏輯層,比如連接數據庫,調用第三方接口等 ├─ errorPage/ // http 請求錯誤時候,對應的錯誤響應頁面 ├─ logs/ // 項目運用中產生的日志數據 ├─ middleware/ // 中間件集中地,用于編寫中間件,并集中調用 │ ├─ mi-http-error/ │ ├─ mi-log/ │ ├─ mi-send/ │ └── index.js ├─ public/ // 用于放置靜態資源 ├─ views/ // 用于放置模板文件,返回客戶端的視圖層 ├─ router.js // 配置 URL 路由規則 └─ app.js // 用于自定義啟動時的初始化工作,比如啟動 https,調用中間件,啟動路由等
當架構師準備好項目結構后,開發人員只需要修改業務層面的代碼即可,比如當我們增加一個業務場景時候,我們大概需要修改三個地方:
service/ 目錄下新建文件,處理邏輯層的業務代碼,并返回給 controller 層
controller/ 目錄下新建文件,簡單處理下請求數據后,傳遞給 service
修改路由文件 router.js,增加路由對應的處理器
隨著業務量的增大,我們就會發現有一個重復性的操作——『不斷的 require 文件,不斷的解析文件中的函數』。當業務量達到一定程度時候,可能一個文件里面要額外引入十幾個外部文件:
const controller1 = require("...") const controller2 = require("...") const controller3 = require("...") const controller4 = require("...") ... app.get("/fn1", controller1.fn1() ) app.get("/fn2", controller2.fn2() ) app.get("/fn3", controller3.fn3() ) app.get("/fn4", controller4.fn4() )
單是起名字就已經夠頭疼的!
所以,我們要做的事情就是,約定代碼結構規范,省去這些頭疼的事情,比如 router.js:
// const router = require("koa-router")() // const HomeController = require("./controller/home") // module.exports = (app) => { // router.get( "/", HomeController.index ) // router.get("/home", HomeController.home) // router.get("/home/:id/:name", HomeController.homeParams) // router.get("/user", HomeController.login) // router.post("/user/register", HomeController.register) // app.use(router.routes()) // .use(router.allowedMethods()) // } const router = require("koa-router")() module.exports = (app) => { router.get( "/", app.controller.home.index ) router.get("/home", app.controller.home.home) router.get("/home/:id/:name", app.controller.home.homeParams) router.get("/user", app.controller.home.login) router.post("/user/register", app.controller.home.register) app.use(router.routes()) .use(router.allowedMethods()) }
聰明的同學可能已經發現了,app.controller.home.index 其實就是 cotroller/home.js 中的 index 函數。
設計思路實現思路很簡單,當應用程序啟動時候,讀取指定目錄下的 js 文件,以文件名作為屬性名,掛載在實例 app 上,然后把文件中的接口函數,擴展到文件對象上。
一般有兩種方式入手,一種是程序啟動時候去執行,另外一種是請求過來時候再去讀取。
而在傳統書寫方式中,項目啟動時候會根據 require 加載指定目錄文件,然后緩存起來,其思路與第一種方式一致。如果以中間件的方式,在請求過來時候再去讀取,則第一次讀取肯定會相對慢一起。綜合考慮,我們采用了第一種方式:程序啟動時候讀取。
代碼實現新建目錄文件 middleware/mi-rule/index.js, 實現代碼如下:
const Path = require("path"); const fs = require("fs"); module.exports = function (opts) { let { app, rules = []} = opts // 如果參數缺少實例 app,則拋出錯誤 if (!app) { throw new Error("the app params is necessary!") } // 提取出 app 實例對象中的屬性名 const appKeys = Object.keys(app) rules.forEach((item) => { let { path, name} = item // 如果 app 實例中已經存在了傳入過來的屬性名,則拋出錯誤 if (appKeys.includes(name)) { throw new Error(`the name of ${name} already exists!`) } let content = {}; //讀取指定文件夾下(dir)的所有文件并遍歷 fs.readdirSync(path).forEach(filename => { //取出文件的后綴 let extname = Path.extname(filename); //只處理js文件 if (extname === ".js") { //將文件名中去掉后綴 let name = Path.basename(filename, extname); //讀取文件中的內容并賦值綁定 content[name] = require(Path.join(path, filename)); } }); app[name] = content }) }
opts 是參數對象,里面包含了實例 app,用來掛載指定的目錄文件。rules 是我們指定的目錄規則。
用法如下,修改 middleware/index.js:
// 引入規則中件間 const miRule = require("./mi-rule") module.exports = (app) => { /** * 在接口的開頭調用 * 指定 controller 文件夾下的 js 文件,掛載在 app.controller 屬性 * 指定 service 文件夾下的 js 文件,掛載在 app.service 屬性 */ miRule({ app, rules: [ { path: path.join(__dirname, "../controller"), name: "controller" }, { path: path.join(__dirname, "../service"), name: "service" } ] }) // 以下代碼省略 }業務代碼應用 1. 修改 router.js:
const router = require("koa-router")() module.exports = (app) => { router.get( "/", app.controller.home.index ) router.get("/home", app.controller.home.home) router.get("/home/:id/:name", app.controller.home.homeParams) router.get("/user", app.controller.home.login) router.post("/user/register", app.controller.home.register) app.use(router.routes()).use(router.allowedMethods()) }2. 修改 controller/home.js:
module.exports = { index: async(ctx, next) => { await ctx.render("home/index", {title: "iKcamp歡迎您"}) }, home: async(ctx, next) => { ctx.response.body = "HOME page
" }, homeParams: async(ctx, next) => { ctx.response.body = "HOME page /:id/:name
" }, login: async(ctx, next) => { await ctx.render("home/login", { btnName: "GoGoGo" }) }, register: async(ctx, next) => { // 解構出 app 實例對象 const { app } = ctx let params = ctx.request.body let name = params.name let password = params.password // 留意 service 層的調用方式 let res = await app.service.home.register(name,password) if(res.status == "-1"){ await ctx.render("home/login", res.data) }else{ ctx.state.title = "個人中心" await ctx.render("home/success", res.data) } } }
項目中引入這個結構規范,并不是必須的,畢竟大家的想法不一樣。iKcamp 團隊在提出此想法時候,也是有不少分歧。提出這樣一個思路,僅供大家參考。
開發環境運行作為后端代碼語言,開發環境中每次修改文件,都需要手動的重啟應用,不能像前端瀏覽器那樣清爽。為了減輕手工重啟的成本,我們建議采用 nodemon 來代替 node 以啟動應用。當代碼發生變化時候,nodemon 會幫我們自動重啟。
全局安裝 nodemon:
npm i nodemon -g
本地項目中也需要安裝:
npm i nodemon -S
更多細節用法,請查閱官方文檔
部署運行線上部署運行的話,方法也有很多,我們推薦使用 pm2。
pm2 是一個帶有負載均衡功能的Node應用的進程管理器。
安裝方法與 nodemon 相似,需要全局安裝:
npm i pm2 -g
運行方法:
pm2 start app.js
更多細節用法,請查閱官方文檔
推薦: 翻譯項目Master的自述: 1. 干貨|人人都是翻譯項目的Master 2. iKcamp出品微信小程序教學共5章16小節匯總(含視頻)文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/107312.html
摘要:玩轉同時全面掌握潮流技術采用新一代的開發框架更小更富有表現力更健壯。融合多種常見的需求場景網絡請求解析模板引擎靜態資源日志記錄錯誤請求處理。結合語句中轉中間件控制權,解決回調地獄問題。注意分支中的目錄為當節課程后的完整代碼。 ?? ?與眾不同的學習方式,為你打開新的編程視角 獨特的『同步學習』方式 文案講解+視頻演示,文字可激發深層的思考、視頻可還原實戰操作過程。 云集一線大廠...
摘要:云集一線大廠有真正實力的程序員團隊云集一線大廠經驗豐厚的碼農,開源奉獻各教程。融合多種常見的需求場景網絡請求解析模板引擎靜態資源日志記錄錯誤請求處理。結合語句中轉中間件控制權,解決回調地獄問題。注意分支中的目錄為當節課程后的完整代碼。 ?? ?與眾不同的學習方式,為你打開新的編程視角 獨特的『同步學習』方式 文案講解+視頻演示,文字可激發深層的思考、視頻可還原實戰操作過程。 云...
滬江CCtalk視頻地址:https://www.cctalk.com/v/15114923887518 showImg(https://segmentfault.com/img/remote/1460000013096340?w=1282&h=714); 處理錯誤請求 愛能遮掩一切過錯。 當我們在訪問一個站點的時候,如果訪問的地址不存在(404),或服務器內部發生了錯誤(500),站點會展示出某...
安裝搭建項目的開發環境 視頻地址:https://www.cctalk.com/v/15114357764004 showImg(https://segmentfault.com/img/remote/1460000012470016?w=1214&h=718); 文章 Koa 起手 - 環境準備 由于 koa2 已經開始使用 async/await 等新語法,所以請保證 node 環境在 7.6...
POST/GET請求——常見請求方式處理 ?? iKcamp 制作團隊 原創作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃 文案校對:李益、大力萌、Au、DDU、小溪里、小哈 風采主播:可木、阿干、Au、DDU、小哈 視頻剪輯:小溪里 主站運營:給力xi、xty 教程主編:張利濤 視頻地址:https://www.cctalk.com/v/15114357765870 ...
閱讀 1792·2021-09-03 10:50
閱讀 1327·2019-08-30 15:55
閱讀 3369·2019-08-30 15:52
閱讀 1231·2019-08-30 15:44
閱讀 934·2019-08-30 15:44
閱讀 3319·2019-08-30 14:23
閱讀 3551·2019-08-28 17:51
閱讀 2291·2019-08-26 13:52