帶你理清Node.js 的Web框架的3個層次
eb 框架指的是處理 http、https 的服務端框架,Node.js 提供了 http、https 模組用於處理協議資料,這是 web 框架的基礎。
但是 http、https 的 api 過於簡單,用起來比較麻煩,所以一般會用 express、koa、fastify 這種封裝了一層的框架來簡化。
但 express 類的框架不提供程式碼架構方面的限制,所以對於模組比較多比較複雜的企業級應用來說並不適合,這時就要用實現了 MVC 的 eggjs、nestjs 這類企業級 web 框架。
這是 web 框架的 3 個層次,理清了它們的關係和適用場景,再去學習才不會迷茫。
下面我們分別來看一下:
http 是基於 TCP 的,對 TCP 傳過來的 http 協議資料做 parse,傳給 handler 處理,handler 處理完要返回 http 響應,這是 http 模組做的事情。
const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('okay'); }); server.listen(8080, '127.0.0.1');
http 模組雖然能處理請求和響應,但是提供的 api 過於原始:
比如獲取請求引數還要用 url 模組 parse 一次
const http = require('http'); const url = require('url'); http.createServer(function (req, res) { const queryObject = url.parse(req.url,true).query; console.log(queryObject); res.writeHead(200, {'Content-Type': 'text/html'}); res.end('xxx'); }).listen(8080);
比如返回響應只能用 write 或者 end 返回一段 buffer 或 string,想返回 JSON、檔案下載、html 檢視等都要自己實現。
而且 get、post、put、delete 等請求型別也要自己做判斷。
if(req.method === 'get') { //... } else if (req.method === 'post') { //... } //...
因為有這些痛點,所以一般我們不會直接用 http 模組,而是用封裝了一層的 express、koa、fastify 這類 web 框架。
express 這類框架解決了剛才的那個痛點問題:
提供了路由機制,不用自己手動判斷 method 和 path
app.get('/list', function (req, res) { //... }) app.post('/save', function(req, res) { //... })
提供了更好用的 request 和 response api:
比如 req.params 獲取請求引數
app.get('/user/:id', function (req, res) { res.send('user ' + req.params.id) }) res.download 返回下載的響應 res.download('/report-12345.pdf') res.render 返回模版引擎渲染的 html app.render('xxx-template', { name: 'guang' }, function (err, html) { // ... })
提供了中介軟體機制,用於複用一些一些邏輯:
比如檔案上傳中介軟體
app.use(fileUpload({ useTempFiles : true, tempFileDir : '/tmp/' }));
提供了這麼多方便的功能,確實比 http 模組用起來簡單多了。
但是 express 類的 web 框架也有問題,就是沒有提供組織程式碼的模式,當模組多了程式碼很容易亂掉,因為它只是按照類似洋蔥的順序呼叫中介軟體,沒有模組和 MVC 的劃分。
express 類框架做一些小的服務可以,企業級應用還得用 nestjs、eggjs 這類 MVC 框架。
nestjs 類的框架就實現了 MVC 的模式,程式碼有明顯的 Controller、Service、Model、View 的劃分:
import { Body, Controller, Delete, Get, Param, Post } from '@nestjs/common'; import { CreateUserDto } from './dto/create-user.dto'; import { User } from './user.entity'; import { UsersService } from './users.service'; @Controller('users') export class UsersController { constructor(private readonly usersService: UsersService) {} @Post() create(@Body() createUserDto: CreateUserDto): Promise{ return this.usersService.create(createUserDto); } @Get() findAll(): Promise{ return this.usersService.findAll(); } @Get(':id') findOne(@Param('id') id: string): Promise{ return this.usersService.findOne(id); } @Delete(':id') remove(@Param('id') id: string): Promise{ return this.usersService.remove(id); } }
nestjs 是對標 java 的 spring 的,實現了 IOC、AOP 等模式,模組之間耦合度很低,就算再複雜的專案,透過 Module、Controller、Service 等也可以很好的被組織起來,相比 express 來說,組織程式碼方面提升了一個檔次。
nestjs 的底層就是 express、fastify 等 web 框架,而且還可以靈活的切換底層實現。
可以看到,nestjs、eggjs 類的企業級框架,除了有豐富的 api 以外,更重要的是提供了程式碼組織的規範,透過 Module、Controller、Service 等概念可以很好的組織複雜的業務邏輯。
web 框架都是基於 http、https 模組,但它提供的 api 過於原始,使用起來比較麻煩,所以我們一般會用 express、koa 這類框架來簡化,它提供了中介軟體機制來複用邏輯,提供了更多的 request、response 的 api,但卻沒有組織複雜程式碼的能力,對於企業級的複雜應用,還是會用 nestjs、eggjs 這類 MVC 框架,它們的底層是 express、koa,但提供了 Module、Controller、Service 等概念,可以很好的組織複雜的程式碼。
要理清楚為什麼會有這三個層次,都各自適合什麼場景,這樣才能更好的掌握它們,在技術選型上才不會迷茫。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2837787/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 商業智慧的三個層次,你在哪個層次?
- 你是網路推廣的哪個層次?
- LoadRunner與Web頁面互動的兩個層次Web
- Express 4.x Node.js的Web框架ExpressNode.jsWeb框架
- 分享一個基於 Node.js 的 Web 開發框架 – NokitjsNode.jsWeb框架
- 一文帶你理清Spark Core調優的方方面面Spark
- 強大的 Node.js Web 框架 - Daze.jsNode.jsWeb框架
- 3個框框帶你理解EventLoopOOP
- 從3個層次分析商業智慧的價值在哪裡?
- 10個最好的Node.js MVC框架Node.jsMVC框架
- 你使用的框架都是假的 帶你認知未來前端UI框架框架前端UI
- 目前最受歡迎的12個Python web框架,你用過幾個?PythonWeb框架
- 帶領火必走向Web3,孫宇晨的下一個野望Web
- 聊聊阿里面試的三個層次!阿里面試
- 簡述OSI七個層次與TCP/IP四個層次TCP
- 15個最好用的Node.JS後端框架Node.js後端框架
- 帶你玩轉css3的3D!CSSS33D
- 分享10個最新的Web前端框架Web前端框架
- 你的首個 Progressive Web AppWebAPP
- 遊戲的社交屬性:六個層次的心理需求遊戲
- 如何選擇Node.js Web開發框架?Node.jsWeb框架
- 你應該避開的 3 個響應式 Web 設計的陷阱Web
- Java程式設計師不同層次的薪資對照,你在哪個檔口?Java程式設計師
- 2 個案例帶你迅速入門 Python Flask 框架PythonFlask框架
- 帶你手把手實操一個RPC框架RPC框架
- 深入理解 Flutter 框架層次結構Flutter框架
- 由node.js搭建的一個簡單的web網站Node.jsWeb網站
- 新聞稿釋出效果的三個層次
- 資料化運營需要的四個層次
- 學會這12個框架,你的薪資和level能更上一層樓框架
- 帶你用 Vue 全家桶和 Node.js 完成一個聚合應用VueNode.js
- 為你帶來靈感的 20 個 HTML5/CSS3 模板HTMLCSSS3
- 帶你認識Java開發框架是如何使用的Java框架
- 大模型綜述來了!一文帶你理清全球AI巨頭的大模型進化史大模型AI
- Java Web效能優化之一:減少DAO層的呼叫次數JavaWeb優化
- WebService開發的層次Web
- 讓你的 Node.js 應用跑得更快的 10 個技巧Node.js
- Go For Web:一篇文章帶你用 Go 搭建一個最簡單的 Web 服務、瞭解 Golang 執行 web 的原理WebGolang