Workspace'lar
Nest kodni tashkil qilishning ikki rejimini qo'llab-quvvatlaydi:
Nest kodni tashkil qilishning ikki rejimini qo'llab-quvvatlaydi:
- standart rejim: o'z dependency'lari va sozlamalari bo'lgan, modul ulashishni yoki murakkab buildlarni optimallashtirishni talab qilmaydigan alohida, loyiha markazli ilovalarni qurish uchun foydali. Bu default rejim.
- monorepo rejimi: bu rejim kod artefaktlarini yengil monoreponing bir qismi sifatida ko'radi va developer jamoalari va/yoki ko'p loyiha muhitlari uchun ko'proq mos bo'lishi mumkin. U build jarayonining ayrim qismlarini avtomatlashtirib, modulli komponentlarni yaratish va kompozitsiya qilishni osonlashtiradi, koddan qayta foydalanishni rag'batlantiradi, integratsion testlarni yengillashtiradi,
eslintqoidalari va boshqa konfiguratsiya siyosatlari kabi loyiha darajasidagi artefaktlarni ulashishni oson qiladi va Git submodullari kabi alternativalarga qaraganda foydalanishga oson. Monorepo rejiminest-cli.jsonfaylida ko'rsatilgan workspace tushunchasidan foydalanib, monorepo komponentlari o'rtasidagi munosabatlarni muvofiqlashtiradi.
Shuni ta'kidlash kerakki, Nestning deyarli barcha imkoniyatlari kodni tashkil qilish rejimidan mustaqil. Bu tanlovning yagona ta'siri - loyihalaringiz qanday kompozitsiya qilinishi va build artefaktlari qanday generatsiya qilinishidir. CLI dan tortib core modullargacha va add-on modullargacha bo'lgan boshqa barcha funksionalliklar har ikki rejimda ham bir xil ishlaydi.
Shuningdek, siz istalgan vaqtda standart rejimdan monorepo rejimiga oson o'tishingiz mumkin, shuning uchun qaysi yondashuvning foydasi ko'proq ekanligi aniq bo'lguncha bu qarorni kechiktirishingiz mumkin.
Standart rejim
nest newni ishga tushirganda, built-in schematic yordamida yangi project yaratiladi. Nest quyidagilarni bajaradi:
nest newga bergannameargumentiga mos yangi papka yaratadi- Shu papkani minimal darajadagi Nest ilovaga mos default fayllar bilan to'ldiradi. Bu fayllarni typescript-starter repozitoriyasida ko'rishingiz mumkin.
- Ilovangizni kompilyatsiya qilish, test qilish va servis qilish uchun turli vositalarni sozlaydigan
nest-cli.json,package.jsonvatsconfig.jsonkabi qo'shimcha fayllarni taqdim etadi.
Shundan so'ng siz starter fayllarini o'zgartirishingiz, yangi komponentlar qo'shishingiz, dependency'larni qo'shishingiz (masalan, npm install) va ilovangizni ushbu hujjatlarning qolgan qismida tasvirlanganidek rivojlantirishingiz mumkin.
Monorepo rejimi
Monorepo rejimini yoqish uchun standart rejim tuzilmasidan boshlaysiz va projects qo'shasiz. Loyiha to'liq application bo'lishi mumkin ( nest generate app buyrug'i bilan workspace'ga qo'shiladi) yoki library bo'lishi mumkin ( nest generate library buyrug'i bilan workspace'ga qo'shiladi). Bu turdagi loyiha komponentlari tafsilotlarini quyida muhokama qilamiz. Hozir e'tibor qaratiladigan asosiy nuqta shuki, mavjud standart rejim tuzilmasiga loyiha qo'shishning o'zi uni monorepo rejimiga aylantiradi. Keling, misol ko'raylik.
Agar biz quyidagini ishga tushirsak:
1$ nest new my-projectBiz standart rejim tuzilmasini yaratamiz, u quyidagicha ko'rinadi:
Buni quyidagicha monorepo rejimiga o'tkazishimiz mumkin:
1$ cd my-project
2$ nest generate app my-appShu paytda nest mavjud tuzilmani monorepo rejimi tuzilmasiga aylantiradi. Bu bir nechta muhim o'zgarishlarga olib keladi. Papkalar tuzilmasi endi quyidagicha bo'ladi:
generate app schematic kodingizni qayta tashkil qiladi - har bir application loyihasini apps papkasi ostiga ko'chiradi va har bir loyihaning root papkasiga loyiha uchun maxsus tsconfig.app.json faylini qo'shadi. Bizning original my-project ilovamiz monoreponing default loyihasiga aylanadi va endi apps papkasi ostida joylashgan yangi my-app bilan tengdosh bo'ladi. Default loyihalar haqida quyida to'xtalamiz.
Standart rejim tuzilmasini monorepoga aylantirish faqat kanonik Nest loyiha tuzilmasiga rioya qilgan loyihalarda ishlaydi. Xususan, konvertatsiya paytida schematic src va test papkalarini loyiha papkasidan rootdagi apps papkasi ostiga ko'chirishga urinadi. Agar loyiha bu tuzilmani ishlatmasa, konvertatsiya muvaffaqiyatsiz bo'lishi yoki ishonchsiz natija berishi mumkin.
Workspace loyihalari
Monorepo o'z a'zolarini boshqarish uchun workspace tushunchasidan foydalanadi. Workspace'lar projectsdan tashkil topadi. Loyiha quyidagilardan biri bo'lishi mumkin:
- application:
main.tsfayli orqali ilovani bootstrap qiladigan to'liq Nest ilova. Kompilyatsiya va build masalalaridan tashqari, workspace ichidagi application turidagi loyiha standart rejim tuzilmasidagi ilova bilan funksional jihatdan bir xil. - library: umumiy maqsadli funksiyalar to'plamini (modullar, providerlar, controllerlar va h.k.) paketlash usuli bo'lib, boshqa loyihalarda foydalaniladi. Kutubxona o'zicha ishlay olmaydi va
main.tsfayliga ega emas. Batafsil hereda o'qing.
Barcha workspace'larda default loyiha bo'ladi (bu application turidagi loyiha bo'lishi kerak). Bu nest-cli.json faylidagi yuqori darajadagi "root" propertysi bilan aniqlanadi va u default loyiha rootiga ishora qiladi (batafsil ma'lumot uchun CLI properties bo'limiga qarang). Odatda bu siz boshlagan standart rejim ilovasi bo'ladi va keyin nest generate app yordamida monorepoga aylantiriladi. Bu qadamlarni bajarganingizda, ushbu property avtomatik to'ldiriladi.
Default loyihalar nest build va nest start kabi nest buyruqlarida loyiha nomi berilmaganda ishlatiladi.
Masalan, yuqoridagi monorepo tuzilmasida
1$ nest startmy-project ilovasini ishga tushiradi. my-appni ishga tushirish uchun quyidagini ishlatamiz:
1$ nest start my-appIlovalar
Application turidagi loyihalar, yoki oddiy qilib "ilovalar", ishga tushirish va deploy qilish mumkin bo'lgan to'liq Nest ilovalardir. Application turidagi loyiha nest generate app bilan generatsiya qilinadi.
Bu buyruq typescript starterdagi standart src va test papkalarini o'z ichiga olgan loyiha skeletini avtomatik generatsiya qiladi. Standart rejimdan farqli ravishda, monorepodagi application loyihasida package.json kabi package dependency artefaktlari yoki .prettierrc va eslint.config.mjs kabi loyiha konfiguratsiya fayllari bo'lmaydi. Ularning o'rniga monorepo darajasidagi dependency va config fayllari ishlatiladi.
Biroq schematic loyiha root papkasida loyiha uchun maxsus tsconfig.app.json faylini generatsiya qiladi. Bu config fayl avtomatik ravishda mos build opsiyalarini o'rnatadi, jumladan kompilyatsiya output papkasini to'g'ri belgilaydi. Fayl yuqori darajadagi (monorepo) tsconfig.json faylini kengaytiradi, shuning uchun global sozlamalarni monorepo bo'ylab boshqarib, zarur bo'lsa ularni loyiha darajasida override qilishingiz mumkin.
Kutubxonalar
Aytilganidek, kutubxona turidagi loyihalar yoki oddiy qilib "kutubxonalar" - bu ilovalarga kompozitsiya qilib ishlatiladigan Nest komponentlari paketlari. Kutubxona turidagi loyiha nest generate library bilan generatsiya qilinadi. Nimalar kutubxonaga kirishini aniqlash - arxitektura dizayni qarori. Kutubxonalarni libraries bobida batafsil muhokama qilamiz.
CLI properties
Nest standard va monorepo tuzilmasidagi loyihalarni tashkil qilish, build va deploy qilish uchun kerakli metadatani nest-cli.json faylida saqlaydi. Siz loyihalar qo'shganingizda Nest bu faylga avtomatik qo'shadi va yangilaydi, shuning uchun odatda siz uni o'zgartirish yoki tahrirlash haqida o'ylamasangiz ham bo'ladi. Biroq, qo'lda o'zgartirmoqchi bo'lgan ayrim sozlamalar bo'lishi mumkin, shuning uchun faylni umumiy darajada tushunish foydali.
Yuqoridagi qadamlar orqali monorepo yaratganimizdan so'ng nest-cli.json quyidagicha ko'rinadi:
1{
2 "collection": "@nestjs/schematics",
3 "sourceRoot": "apps/my-project/src",
4 "monorepo": true,
5 "root": "apps/my-project",
6 "compilerOptions": {
7 "webpack": true,
8 "tsConfigPath": "apps/my-project/tsconfig.app.json"
9 },
10 "projects": {
11 "my-project": {
12 "type": "application",
13 "root": "apps/my-project",
14 "entryFile": "main",
15 "sourceRoot": "apps/my-project/src",
16 "compilerOptions": {
17 "tsConfigPath": "apps/my-project/tsconfig.app.json"
18 }
19 },
20 "my-app": {
21 "type": "application",
22 "root": "apps/my-app",
23 "entryFile": "main",
24 "sourceRoot": "apps/my-app/src",
25 "compilerOptions": {
26 "tsConfigPath": "apps/my-app/tsconfig.app.json"
27 }
28 }
29 }
30}Fayl quyidagi bo'limlardan iborat:
- standard va monorepo darajasidagi sozlamalarni boshqaruvchi yuqori darajadagi global bo'lim
- har bir loyiha haqida metadataga ega bo'lgan yuqori darajadagi
"projects"propertysi. Bu bo'lim faqat monorepo rejimdagi tuzilmada mavjud.
Yuqori darajadagi propertylar quyidagilar:
"collection": komponentlarni generatsiya qilish uchun ishlatiladigan schematics collectionga ishora qiladi; odatda bu qiymatni o'zgartirmasligingiz kerak"sourceRoot": standart rejimdagi yagona loyiha source code rootiga yoki monorepo rejimdagi default loyiha rootiga ishora qiladi"compilerOptions": kompilyator opsiyalarini ko'rsatadigan key-value map; tafsilotlar quyida"generateOptions": global generate opsiyalarini ko'rsatadigan key-value map; tafsilotlar quyida"monorepo": (faqat monorepo) monorepo rejim tuzilmasi uchun bu qiymat doimotrue"root": (faqat monorepo) default loyiha project rootiga ishora qiladi
Global kompilyator opsiyalari
Bu propertylar nest build yoki nest startning bir qismi bo'lgan istalgan kompilyatsiya bosqichiga ta'sir qiladigan kompilyator va turli opsiyalarni belgilaydi, va tsc yoki webpack kabi kompilyatorga bog'liq bo'lmaydi.
| Property nomi | Property qiymati turi | Tavsif |
|---|---|---|
webpack | boolean | true bo'lsa webpack compiler ishlatiladi. false bo'lsa yoki yo'q bo'lsa tsc ishlatiladi. Monorepo rejimida default true (webpack), standart rejimda default false (tsc). Batafsil ma'lumot quyida. (deprecated: o'rniga builderdan foydalaning) |
tsConfigPath | string | (faqat monorepo) nest build yoki nest start project opsiyasisiz chaqirilganda foydalaniladigan tsconfig.json sozlamalari fayliga ishora qiladi (masalan, default loyiha build yoki start qilinganda). |
webpackConfigPath | string | Webpack opsiya fayliga ishora qiladi. Ko'rsatilmagan bo'lsa, Nest webpack.config.js faylini qidiradi. Batafsil ma'lumot uchun quyiga qarang. |
deleteOutDir | boolean | true bo'lsa, kompilyator chaqirilganida avval kompilyatsiya output direktoriyasini o'chiradi (tsconfig.jsonda sozlangan, default ./dist). |
assets | array | Har bir kompilyatsiya bosqichi boshlanganda non-TypeScript assetsni avtomatik tarqatishni yoqadi (asset tarqatish --watch rejimidagi incremental compile'larda bo'lib o'tmaydi). Batafsil ma'lumot uchun quyiga qarang. |
watchAssets | boolean | true bo'lsa, barcha non-TypeScript assetslarni kuzatgan holda watch rejimida ishlaydi. (Assetsni yanada nozik boshqarish uchun quyidagi Assets bo'limiga qarang). |
manualRestart | boolean | true bo'lsa, serverni qo'lda qayta ishga tushirish uchun rs shortcutini yoqadi. Default qiymat false. |
builder | string/object | Loyiha kompilyatsiyasi uchun qaysi builder ishlatilishini ko'rsatadi (tsc, swc, yoki webpack). Builder xatti-harakatini moslashtirish uchun type (tsc, swc, yoki webpack) va optionsdan iborat obyekt berishingiz mumkin. |
typeCheck | boolean | true bo'lsa, SWC ishlatiladigan loyihalarda type checkingni yoqadi (builder swc bo'lganda). Default qiymat false. |
Global generate opsiyalari
Bu propertylar nest generate buyrug'i uchun default generate opsiyalarini belgilaydi.
| Property nomi | Property qiymati turi | Tavsif |
|---|---|---|
spec | boolean or object | Agar qiymat boolean bo'lsa, true bo'lganda spec generatsiyasi default yoqiladi, false bo'lganda o'chiriladi. CLI buyruq qatorida berilgan flag bu sozlamani override qiladi, xuddi loyiha darajasidagi generateOptions ham (quyida). Agar qiymat obyekt bo'lsa, har bir key schematic nomini bildiradi va boolean qiymat o'sha schematic uchun spec generatsiyasi yoqilgan/yo'qligini belgilaydi. |
flat | boolean | True bo'lsa, barcha generate buyruqlari flat tuzilma generatsiya qiladi |
Quyidagi misolda spec fayllarini generatsiya qilish default bo'yicha barcha loyihalar uchun o'chirilgan bo'ladi:
1{
2 "generateOptions": {
3 "spec": false
4 },
5 ...
6}Quyidagi misolda flat fayl generatsiyasi default bo'ladi:
1{
2 "generateOptions": {
3 "flat": true
4 },
5 ...
6}Quyidagi misolda spec fayl generatsiyasi faqat service schematicsi uchun o'chirilgan (masalan, nest generate service...):
1{
2 "generateOptions": {
3 "spec": {
4 "service": false
5 }
6 },
7 ...
8}spec obyekt sifatida berilganda, generation schematics uchun key hozircha avtomatik alias handlingni qo'llab-quvvatlamaydi. Bu service: false deb yozib, s aliasi orqali service generatsiya qilsangiz ham spec generatsiya qilinishini anglatadi. Oddiy schematic nomi ham, alias ham to'g'ri ishlashi uchun quyidagi kabi ikkisini ham ko'rsating.
{
"generateOptions": {
"spec": {
"service": false,
"s": false
}
},
...
}
Loyiha darajasidagi generate opsiyalari
Global generate opsiyalariga qo'shimcha ravishda, loyiha darajasidagi generate opsiyalarini ham ko'rsatishingiz mumkin. Loyiha darajasidagi generate opsiyalari global generate opsiyalaridagi formatning aynan o'zidir, ammo har bir loyiha ichida ko'rsatiladi.
Loyiha darajasidagi generate opsiyalari global generate opsiyalarini override qiladi.
1{
2 "projects": {
3 "cats-project": {
4 "generateOptions": {
5 "spec": {
6 "service": false
7 }
8 },
9 ...
10 }
11 },
12 ...
13}Generate opsiyalari uchun ustuvorlik tartibi quyidagicha: CLI buyruq qatorida ko'rsatilgan opsiyalar loyiha darajasidagi opsiyalardan ustun. Loyiha darajasidagi opsiyalar global opsiyalarni override qiladi.
Belgilangan kompilyator
Turli default kompilyatorlarning sababi shundaki, kattaroq loyihalarda (masalan, monorepolarda) webpack build vaqtlarida va barcha loyiha komponentlarini bitta faylga yig'ishda sezilarli ustunlikka ega bo'lishi mumkin. Agar alohida fayllarni generatsiya qilishni xohlasangiz, "webpack"ni falsega o'rnating, bu build jarayonini tsc (yoki swc)dan foydalanishga majbur qiladi.
Webpack opsiyalari
Webpack opsiya fayli standart webpack configuration optionsni o'z ichiga olishi mumkin. Masalan, node_modulesni bundlega qo'shish uchun (default bo'yicha ular tashqarida) webpack.config.jsga quyidagini qo'shing:
1module.exports = {
2 externals: [],
3};Webpack config fayli JavaScript fayl bo'lgani uchun, default opsiyalarni qabul qilib, o'zgartirilgan obyektni qaytaradigan funksiya ham taqdim etishingiz mumkin:
1module.exports = function (options) {
2 return {
3 ...options,
4 externals: [],
5 };
6};Assets
TypeScript kompilyatsiyasi kompilyator outputini (.js va .d.ts fayllari) ko'rsatilgan output direktoriyasiga avtomatik tarqatadi. Shuningdek, .graphql fayllar, images, .html fayllar va boshqa assetlar kabi non-TypeScript fayllarni tarqatish ham qulay bo'lishi mumkin. Bu nest buildni (va istalgan initial compilation bosqichini) yengil development build bosqichi sifatida ko'rishga imkon beradi, bunda siz non-TypeScript fayllarni tahrirlab, iterativ ravishda kompilyatsiya va test qilishingiz mumkin.
Assets src papkasida joylashgan bo'lishi kerak, aks holda ular ko'chirilmaydi.
assets kalitining qiymati tarqatiladigan fayllarni ko'rsatuvchi elementlar massividir. Elementlar glob-ga o'xshash fayl spetsifikatsiyalari bo'lgan oddiy stringlar bo'lishi mumkin, masalan:
1"assets": ["**/*.graphql"],
2"watchAssets": true,Yanada nozik nazorat uchun elementlar quyidagi kalitlarga ega obyekt bo'lishi mumkin:
"include": tarqatiladigan assetlar uchunglob-ga o'xshash fayl spetsifikatsiyalari"exclude":includero'yxatidan chiqarib tashlanadigan assetlar uchunglob-ga o'xshash fayl spetsifikatsiyalari"outDir": assetlar tarqatiladigan path (root papkaga nisbatan)ni ko'rsatuvchi string. Default bo'yicha kompilyator outputi sozlangan direktoriyaga teng."watchAssets": boolean;truebo'lsa, ko'rsatilgan assetlarni watch rejimida kuzatadi
Masalan:
1"assets": [
2 { "include": "**/*.graphql", "exclude": "**/omitted.graphql", "watchAssets": true },
3]Yuqori darajadagi compilerOptions propertysida watchAssetsni o'rnatish assets propertysi ichidagi watchAssets sozlamalarini override qiladi.
Loyiha propertylari
Bu element faqat monorepo rejimidagi tuzilmalar uchun mavjud. Odatda bu propertylarni tahrirlashingiz kerak emas, chunki Nest monorepo ichida loyihalarni va ularning konfiguratsiya opsiyalarini topish uchun ulardan foydalanadi.