在NodeJS程式設計語言中,Web服務架構排名第一非Express莫屬。因為其結構清晰、用法簡單易上手、擴充靈活(中間件)而被廣泛使用。Javascript的先天優勢同時又是一個非常重大的劣勢就是弱類型,注定了不适合大規模的協作開發。為了解決這個問題,微軟的TypeScript橫空出世,而NestJS利用TypeScript的優勢,将元件之間的解耦做到了一個新的高度。
特别值得一提的是,在Nest的官方文檔中,一直在宣傳他們的産品哲學:從Angular、React和Vue中得到的啟發,在後端的開發中,面對大量優秀的類庫,卻沒有一個有效解決架構問題的産品。而Nest的誕生,就是為了提供一個開箱即用的架構,實作了各種類庫之間的松耦合。是以,嚴格意義上定義NestJS并不是一款Web服務架構,而是一個IoC容器(IoC Container ),關于更多的IoC以及相關的内容,有興趣的同學可以參考我的另外一篇文章。
NestJS并沒有去重新發明輪子,而是利用現有優秀的輪子,例如Express、Fastify,将其抽象、定義接口和适配,使之成為應用程式架構中的功能實作,開發者可以很友善的替換之。除了Web架構,還有資料庫、隊列、緩存等的常用類庫。NestJS将其一一重新定義,納入自己的擴充矩陣中。
了解一個項目,需要從其項目的檔案目錄 結構入手。就如同了解人體構造,先脫衣服從其骨骼結構切入點,逐個分析其構成與關系,才能高效的學習與了解其設計用意以及最佳實踐方法。
為了更好的學習,強烈建議下載下傳兩個庫:
第一個是nest源代碼庫。在學習的時候,有些不明白的地方可以去找源代碼中尋找的相關資訊。另外,這個源代碼庫裡還有29個案例,可以給一定的參考。但是千萬别糾結,正如官方文檔一樣(的糟糕),僅僅是參考一下。
git clone github.com/nestjs/nest
Real world一個面向“真實”需求的學習項目,被人們用各種語言和架構實作。而NestJS作為一款後端架構,熱門從程度僅次于.net core總排名四的項目。從這方面,可見其日漸受追捧的趨勢。
git clone github.com/lujakob/nes…
全局安裝NEST指令行工具(腳手架) npm i -g @nestjs/cli(留意權限)
在工作目錄中建立一個項目 nest n -g project-name
此時已經獲得一個最基本的NEST的伺服器端應用

dist TypeScript檔案編譯為JS後輸出的目标目錄;
node_modules 依賴元件和庫檔案
src 源代碼檔案
.gitignore GIT忽略配置,通常忽略的有:
日志檔案 logs *.log
系統配置檔案 .DS_Store
依賴庫 node_modules
IDE配置檔案 .idea
項目配置檔案
輸出目标代碼 dist/*
.eslintrc.js eslint(代碼格式化)配置檔案
.prettierrc prettier(代碼格式化)配置檔案
nest-cli.json nest項目配置檔案,标準模式下這個配置檔案内容很簡單,如果是monorepo模式,則内容較為複雜。
nodemon.json,監控程式配置檔案,定義監控那些程式忽略那些程式以及啟動入口(index.js)
tsconfig.json,ts配置檔案,其中排除了對測試檔案的編譯
*.middleware.ts 中間件
*.controller.ts 控制器
*.decorator.ts 自定義裝飾器
*.entity.ts 資料對象執行個體(typeorm)
*.interface.ts 接口
*.module.ts NEST子產品
*.service.ts NEST服務對象
*.pipe.ts NEST管道對象
*.dto.ts 資料傳輸對象
*.spec.ts 單元測試檔案
通過分析一下package.json檔案,可以看到有很多可以選擇的腳本,以下所有的腳本,都可以npm run xxx或者yarn run xxx的方式運作,取決于你的包管理工具。例如,啟動項目 npm run start。
prebuild 删除dist目錄,為重新完整建構做準備(每次建構時,nest會自動執行這個);
build 建構目前工作區nest項目,會産生一個dist目錄,其中是經過編譯的代碼
format 使用prettier格式化目前項目的代碼
start 啟動目前項目
start:dev 以開發模式啟動目前項目,相比上面的start,差別是你可以邊開發邊調試程式,當發生檔案被改動(儲存),nest會自動重新加載;
start:debug 開發模式下,輸出更多的調試資訊;
start:prod 以生産模式運作,此時項目不在運作再nest cli中,而是直接運作編譯後的項目;
lint 格式化所有ts代碼,并修正代碼的格式問題;
test 運作jest進行測試;
test:watch 同上,程式檔案變化後自動測試;
test:cov 輸出測試覆寫資訊;
test:debug 運作一個websocket是的在浏覽器中可以直接調試;
test:e2e 根據配置檔案進行測試;
回到上面我們剛剛建立的項目,建議在開發時,用start:debug的腳本啟動項目,可以邊開發邊調試。預設情況下Nest會綁定本地位址的3000端口。
一般情況下我們會以兩種方式對Web應用進行調試,前後端分離和前後端混合模式(Html模闆)。前者調試需要借助一些工具,後者則直接使用浏覽器。
調試工具可以選擇Postman或者curl指令。
浏覽器無外乎Chrome和Firefox。浏覽器的開發者工具還是很有必要了解和掌握一下的,以Chrome的DeveloperTools為例,重點建議掌握使用Console和Network兩個關鍵工具。
當以調試模式啟動應用程式時,會有一個WebSocket的接口開放,此時可以利用調試工具,進行跟蹤。
打開Chrome,位址欄輸入chrome://inspect
在界面中點"Configure..."按鈕
輸入啟動Nest報告中的ws的位址,關鍵是那個端口
完成後,會在界面中多出一個目标(Target),并标記了Node的版本号,點inspect,即可打開調試視窗,前背景可以同時調試。
這個方式在本地開發情景下比較雞肋(因為直接用VSCode也能看到調試資訊),在遠端開發的話就比較實用了。注意綁定的本機的IP位址。
nest --help
可以列出指令行的主要指令以及幫助,簡單翻譯一下如下:
new(簡寫n)[options] [name] :建立一個NEST應用,例如 nest n hello-world。選項中支援:
--directory 指定目标目錄
-d或--dry-run 不輸出建立過程中的報告
-g或--skip-git 不要初始化git倉庫(預設是會在項目建立git倉庫)
-s或--skip-install 不要安裝依賴哭
-p或--package-manager [name] 指定包管理工具
-l或--language [lang] 指定語言JS或者TS
-c或--collection [name] 用特定的架構生成項目
build [options] [app] : 建構項目,預設會将TS檔案建構到項目的dist目錄中;options有:
-c或--config [path] 用cli建構時特定的配置檔案
-p或--path [path] tsconfig配置檔案
-w或--watch 實時重加載,觀察模式
--watchAssets 觀察非ts檔案模式
--webpackPath [path] webpack的配置檔案
--tsc 使用tsc編譯
start [options] [app]:運作NEST項目,options有:
-d或--debug [hostport] 調試模式
--webpack用webpack編譯
-e或--exec [binary] 以二進制運作(預設用node)
--preserveWatchOutput tsc的觀察模式
update或u [options]:更新目前項目的依賴元件
-f或--force 強制重新安裝依賴
-t或--tag 更新被打上(latest | beta | rc | next tag)的元件
generate或g [options] <schematic> [name] [path] 建立一個Nest架構元素,其類型如下表:
名稱
别名
說明
application
在工作區中建立一個新的應用
class
cl
新的類
configuration
config
指令行的配置檔案
controller
co
控制器
decorator
d
自定義裝飾器
filter
f
過濾器
gateway
ga
請求的網關
guard
gu
守衛
interceptor
in
攔截器
interface
接口
middleware
mi
中間件
module
mo
子產品
pipe
pi
管道
provider
pr
功能組
resolver
r
GraphQL處理器
service
s
服務
library
lib
單獨庫模式下建立一個庫
sub-app
app
子應用
resource
res
一個資料模型的CRUD
以上這張表差不多囊括了NEST所有的元素定義,在這裡給自己挖個大坑,未來一段時間,慢慢填上。
add [options] <library> 添加對外部庫的支援
info或i 擷取目前NEST項目的詳細情況