天天看點

NestJS入門之Hello World

在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的伺服器端應用

NestJS入門之Hello World

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指令。

NestJS入門之Hello World

浏覽器無外乎Chrome和Firefox。浏覽器的開發者工具還是很有必要了解和掌握一下的,以Chrome的DeveloperTools為例,重點建議掌握使用Console和Network兩個關鍵工具。

當以調試模式啟動應用程式時,會有一個WebSocket的接口開放,此時可以利用調試工具,進行跟蹤。

打開Chrome,位址欄輸入chrome://inspect

在界面中點"Configure..."按鈕

NestJS入門之Hello World

輸入啟動Nest報告中的ws的位址,關鍵是那個端口

NestJS入門之Hello World

完成後,會在界面中多出一個目标(Target),并标記了Node的版本号,點inspect,即可打開調試視窗,前背景可以同時調試。

NestJS入門之Hello World
NestJS入門之Hello World

這個方式在本地開發情景下比較雞肋(因為直接用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項目的詳細情況

繼續閱讀