【NestJS系列】從Nest CLI開始入門

2023-07-12 12:01:46

初識Nest JS

Nest 是一個漸進的 Node.js 框架,它可以在 TypeScript 和 JavaScript (ES6、ES7、ES8)之上構建高效、可伸縮的企業級伺服器端應用程式。

Nest 基於 TypeScript 編寫並且結合了 OOP(物件導向程式設計),FP(函數語言程式設計)和 FRP (函數式響應程式設計)的相關理念。在設計上的很多靈感來自於 Angular,Angular 的很多模式又來自於 Java 中的 Spring 框架,依賴注入、面向切面程式設計等,所以我們也可以認為:Nest 是 Node.js 版的 Spring 框架

Nest 框架底層 HTTP 平臺預設是基於 Express 實現的,所以無需擔心第三方庫的缺失。

NestJs 的核心思想:就是提供了一個層與層直接的耦合度極小,抽象化極高的一個架構體系。

腳手架 NestJS CLI

與其它框架一樣,NestJS也有自己的腳手架,它可幫助我們快速初始化Nest專案以及開發和維護 Nest 應用程式。

安裝

絕大多數人可能會選擇全域性安裝,因為方便,但需要注意的是,全域性安裝任何npm軟體包都會將確保它們執行正確版本的責任留給我們開發者自身。這還意味著,如果你有不同的專案,每個專案都將執行相同版本的 CLI。

npm install -g @nestjs/cli

⚠️這裡需要注意Node版本,可能會遇到腳手架安裝成功了但初始化專案時報錯,這裡建議使用高版本node,我這裡用是node版本是16.19.0

當然你也可以不選擇全域性安裝,Nest提供了@nestjs/cli包同樣可以使用nest命令

npx @nestjs/cli@latest

nest命令

安裝完腳手架之後我們可以通過nest --help看看它都有哪些命令:

new|n

該命令是用來初始化一個Nest專案的

nest new project-name

該命令表示初始化一個名為project-nameNest專案,並且會幫你安裝好所有必要的依賴,簡直就是一步到位,非常棒~

上圖中我們可以看到nest|nn代表nest的別名,所以為了方便,你也可以這樣使用:

nest n project-name

generate|g

該命令可以為我們生成各種程式碼,其中包括:控制器Controller、服務service、模組module等。

# 生成控制器
nest generate controller controller-name

# 生成服務
nest generate service service-name

# 生成模組
nest generate module module-name

當你覺得一個一個生成很麻煩時,可以使用下面這個命令

nest g resource filename

當你執行這個命令時,它會讓你選擇生成那種型別的程式碼:

這裡我們直接選擇REST API,它會再問你是否需要生成CURD程式碼

我們選擇是就好了,這個它就為我們生成了一個完整的CURD程式碼。

我們會發現生成的檔案中可能會有一些測試檔案,當我們不需要這些檔案時,可以直接刪除掉,或者在生成時加上--no-spec表示不生成測試檔案

nest g resource filename --no-spec

當然它還可以生成更多型別的程式碼,可以通過以下命令檢視:

nest g --help

start

該命令用於啟動開發服務,支援 watch 和偵錯

# 啟動
nest start

# 啟動並監聽檔案變動
nest start --watch

#啟動並偵錯
nest start --debug --watch

這些命令可以在package.json檔案中找到

所以我們本地開發一般使用npm run start:dev啟動專案

build

該命令用於專案打包

nest build

它有兩種編譯方式可選:--wepback--tsc ,預設是 tsc 編譯,也可以切換成 webpack。

區別在於tsc模式並不會將node_modules模組打包進去,而webpack模式則會將node模組打包成單檔案

腳手架組態檔

Nest腳手架與其它腳手架不同的是,它生成的專案下會有一個腳手架組態檔nest-cli.json,上面我們用的命令的很多選項都可以在這個檔案中直接設定。

該檔案的頂級屬性如下:

  • "collection":指向用於生成元件的原理圖集合;(最好不要改)
  • "sourceRoot":指向標準模式結構中單個專案的原始碼根目錄,或monorepo 模式結構中的預設專案
  • "compilerOptions":編譯相關的設定選項
  • "generateOptions":全域性生成相關的設定選項
  • "monorepo":(僅限 monorepo)對於 monorepo 模式結構,該值始終為true
  • "root":(僅限 monorepo)指向預設專案的專案根目錄

全域性編譯選項

這些屬性指定要使用的編譯器以及影響任何編譯步驟的各種選項,無論是作為nest build或的一部分nest start,也不考慮編譯器,無論tsc是還是 webpack。

名稱 描述
webpack 如果是true,使用webpack編譯。如果false存在或不存在,請使用tsc. 在 monorepo 模式下,預設為true(use webpack),在標準模式下,預設為false(use tsc)。
tsConfigPath (僅 monorepo ) 指向包含在不帶選項的情況下呼叫或呼叫tsconfig.json時將使用的設定的檔案(例如,當構建或啟動預設專案時)。nest build``nest start``project
webpackConfigPath 指向 webpack 選項檔案。如果未指定,Nest 會查詢檔案webpack.config.js. 請參閱下面的更多細節。
deleteOutDir 如果true,則每當呼叫編譯器時,它都會首先刪除編譯輸出目錄(如 中設定tsconfig.json,預設為./dist)。
assets 每當編譯步驟開始時,啟用自動分發非 TypeScript 資源(在增量編譯模式下不會發生資源--watch分發)。詳情請參閱下文。
watchAssets 如果true,則以監視模式執行,監視所有非 TypeScript 資源。
manualRestart 如果,則啟用手動重新啟動伺服器的true快捷方式。rs預設值為false
builder 指示 CLI 使用什麼builder來編譯專案(tscswcwebpack)。要自定義構建器的行為,您可以傳遞包含兩個屬性的物件:type( tscswcwebpack) 和options
typeCheck 如果true,則啟用 SWC 驅動專案的型別檢查(當builder為時swc)。預設值為false

全域性生成選項

這些屬性指定命令使用的預設生成選項nest generate

名稱 描述
spec 如果值為布林值,則預設情況下true啟用spec生成,值為 則false禁用生成。CLI 命令列上傳遞的標誌會覆蓋此設定,專案特定的generateOptions設定也會覆蓋此設定(更多內容見下文)。如果該值是一個物件,則每個鍵代表一個原理圖名稱,並且布林值確定是否為該特定原理圖啟用/禁用預設規範生成。
flat 如果為 true,則所有生成命令都將生成平面結構

本系列文章會持續更新哦,關注前端南玖,敬請期待吧~