帶你理清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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 商業智慧的三個層次,你在哪個層次?
- 你是網路推廣的哪個層次?
- 精益化的三個層次,你們做到了第幾層?
- 強大的 Node.js Web 框架 - Daze.jsNode.jsWeb框架
- 一文帶你理清Spark Core調優的方方面面Spark
- 目前最受歡迎的12個Python web框架,你用過幾個?PythonWeb框架
- 從3個層次分析商業智慧的價值在哪裡?
- 3個框框帶你理解EventLoopOOP
- 聊聊阿里面試的三個層次!阿里面試
- 由node.js搭建的一個簡單的web網站Node.jsWeb網站
- 帶你手把手實操一個RPC框架RPC框架
- 2 個案例帶你迅速入門 Python Flask 框架PythonFlask框架
- 帶領火必走向Web3,孫宇晨的下一個野望Web
- Java程式設計師不同層次的薪資對照,你在哪個檔口?Java程式設計師
- 學會這12個框架,你的薪資和level能更上一層樓框架
- 深入理解 Flutter 框架層次結構Flutter框架
- 新聞稿釋出效果的三個層次
- 帶你用 Vue 全家桶和 Node.js 完成一個聚合應用VueNode.js
- 【Camera專題】你應該熟悉的Camera驅動框架一(Hal層->kernel層)框架
- CherryPy :一個輕量級的 Python Web 框架PythonWeb框架
- 一個超級簡單的 go Web 框架GoWeb框架
- 三個最火的Python Web開發框架PythonWeb框架
- 使用Go寫一個簡易的MVC的Web框架GoMVCWeb框架
- Go For Web:一篇文章帶你用 Go 搭建一個最簡單的 Web 服務、瞭解 Golang 執行 web 的原理WebGolang
- 【帶你手擼Spring】沒有哪個框架開發,能離開 Spring 的 FactoryBean!Spring框架Bean
- 學習web前端你必須要了解的主流框架!Web前端框架
- 大模型綜述來了!一文帶你理清全球AI巨頭的大模型進化史大模型AI
- 帶你認識Java開發框架是如何使用的Java框架
- 層次3 DCGAN動漫影像生成
- 使用者研究影響力的三個層次
- 幽默:軟體的五個層次,通俗易懂 -CatMcGeeCode
- 手把手帶你打造一個 Android 熱修復框架Android框架
- ThinkPHP中文WEB框架歡迎你PHPWeb框架
- 樹的層次遍歷
- Java中的四層框架Java框架
- Web前端開發最好用的幾個WebGL框架Web前端框架
- go + koa = ? 一個新的 Web 框架 goa 誕生GoWeb框架
- 推薦 5 個 yyds 的開源 Python Web 框架PythonWeb框架