構建複雜的應用程序時,架構設計與代碼質量同等重要。即使代碼編寫精良,但缺乏良好的組織結構,隨著複雜性的增加,維護和擴展將變得異常困難。因此,最佳實踐是在項目啟動前就規劃好架構,以項目目標為指導,做出明智的選擇。
與Ruby on Rails等框架不同,Node.js 並沒有一個事實上的標準框架來強制執行特定的架構和代碼組織方式。這使得構建完整的Node.js Web應用程序時,架構選擇變得相對自由,但也增加了挑戰。
本教程將使用MVC架構構建一個基本的筆記應用程序,演示如何利用Node.js的Hapi.js框架、SQLite數據庫(通過Sequelize.js進行操作)以及Pug模板引擎來實現高效開發。
核心要點:
package.json
文件來管理依賴項。 什麼是MVC?
模型-視圖-控制器 (MVC) 可能是最流行的應用程序架構之一。 MVC模式最初在PARC為Smalltalk語言設計,用於解決圖形用戶界面應用程序的組織問題。雖然最初用於桌面應用程序,但其理念已成功應用於Web開發。
簡單來說,MVC架構包含:
本應用程序將允許創建、查看、編輯和刪除純文本筆記。雖然功能簡單,但堅實的架構將使日後添加新功能變得容易。
本教程假設您已在機器上安裝了最新版本的Node.js。如果沒有,請參考相關教程進行安裝。
最終應用程序代碼已上傳至GitHub倉庫,您可以查看完整的項目結構。
奠定基礎
構建任何Node.js應用程序的第一步是創建package.json
文件,其中包含所有依賴項和腳本。可以使用npm的init
命令自動生成此文件:
mkdir notes-board cd notes-board npm init -y
完成後,您將擁有一個可用的package.json
文件。
注意:如果您不熟悉這些命令,請查看我們的npm入門指南。
接下來,安裝Hapi.js框架:
npm install @hapi/hapi@18.4.0
此命令將下載Hapi.js並將其添加到package.json
文件中的依賴項中。
注意:我們指定了Hapi.js的v18.4.0版本,因為它與Node 8、10和12版本兼容。如果您使用的是Node 12,可以選擇安裝最新版本(Hapi v19.1.0)。
現在,創建入口文件——啟動所有內容的Web服務器。在應用程序目錄中創建一個server.js
文件,並添加以下代碼:
"use strict"; const Hapi = require("@hapi/hapi"); const Settings = require("./settings"); const init = async () => { const server = new Hapi.Server({ port: Settings.port }); server.route({ method: "GET", path: "/", handler: (request, h) => { return "Hello, world!"; } }); await server.start(); console.log(`Server running at: ${server.info.uri}`); }; process.on("unhandledRejection", err => { console.log(err); process.exit(1); }); init();
這是應用程序的基礎。首先,我們使用嚴格模式;然後,我們引入依賴項並實例化一個新的服務器對象,將連接端口設置為3000(端口可以是1023到65535之間的任何數字);我們的第一個路由將作為測試,所以“Hello, world!” 消息就足夠了;最後,我們使用server.start()
方法啟動服務器。
存儲設置
最佳實踐是將配置變量存儲在專用文件中。此文件導出一個包含數據的JSON對象,其中每個鍵都分配自環境變量,但不要忘記備用值。
在這個文件中,我們還可以根據環境(例如開發或生產)擁有不同的設置。例如,我們可以為開發目的使用SQLite的內存實例,但在生產環境中使用真實的SQLite數據庫文件。
根據當前環境選擇設置非常簡單。由於我們還在文件中有一個env變量,它將包含development或production,我們可以執行以下操作來獲取數據庫設置:
const dbSettings = Settings[Settings.env].db;
因此,當env變量為development時,dbSettings將包含內存數據庫的設置;當env變量為production時,將包含數據庫文件的路徑。
此外,我們可以添加對.env
文件的支持,在其中可以為開發目的存儲本地環境變量。這可以通過像dotenv這樣的Node.js包來實現,它將讀取項目根目錄下的.env
文件,並將找到的值自動添加到環境中。
注意:如果您決定也使用.env
文件,請確保使用npm install dotenv
安裝該包,並將其添加到.gitignore
中,以免發布任何敏感信息。
我們的settings.js
文件如下所示:
// This will load our .env file and add the values to process.env, // IMPORTANT: Omit this line if you don't want to use this functionality require("dotenv").config({ silent: true }); module.exports = { port: process.env.PORT || 3000, env: process.env.NODE_ENV || "development", // Environment-dependent settings development: { db: { dialect: "sqlite", storage: ":memory:" } }, production: { db: { dialect: "sqlite", storage: "db/database.sqlite" } } };
現在,我們可以通過執行以下命令並在Web瀏覽器中導航到http://localhost:3000
來啟動應用程序:
mkdir notes-board cd notes-board npm init -y
注意:此項目在Node v12.15.0上進行了測試。如果您遇到任何錯誤,請確保您已安裝更新的版本。
(後續步驟,由於篇幅限制,以下內容將簡略概括,具體實現細節請參考原文)
定義路由: 在lib/routes.js
文件中定義應用程序的路由,包括GET、POST、PUT和DELETE方法處理筆記的創建、讀取、更新和刪除。
構建模型: 使用Sequelize.js和SQLite創建Note
模型,定義筆記的數據結構(日期、標題、內容等)。在lib/models/note.js
中定義模型。
構建控制器: 創建控制器來處理路由請求。 lib/controllers/home.js
處理首頁,lib/controllers/note.js
處理筆記相關的CRUD操作。
構建視圖: 使用Pug模板引擎創建視圖。 lib/views/home.pug
顯示筆記列表,lib/views/note.pug
顯示單個筆記詳情。 lib/views/components/note.pug
定義筆記組件。
服務靜態文件: 使用Hapi.js的Inert插件服務靜態文件(JavaScript和CSS)。在server.js
中註冊Inert插件,並在routes.js
中添加靜態文件路由。
客戶端JavaScript: 編寫客戶端JavaScript代碼來處理模態窗口的顯示/隱藏,以及使用Ajax提交表單。
總結
本教程構建了一個基本的基於Hapi.js和MVC架構的筆記應用程序。雖然還有許多細節需要完善(例如輸入驗證、錯誤處理等),但這提供了一個學習和構建Node.js應用程序的基礎。 您可以在此基礎上添加用戶認證、更複雜的UI等功能。
以上是如何構建和構建節點。JSMVC應用程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!