javascript - Hvordan håndtere produksjonsbygget av et TypeScript-monorepo (NestJS) med felles biblioteker?
Jeg sliter med produksjonsbygget av en TypeScript-monorepo. Selskapet jeg jobber for har et monorepository med flere API-er (NestJS) og noen få vanlige biblioteker (hovedsakelig TypeScript-kildekode bygget med tsc) som jeg dessverre ikke kan dele her.
API-ene kan kjøres ved å bruke nest start og vi kan også få tilgang til @nestjs/swagger distribuert innenfor API-ene uten problemer. Frem til for noen uker siden bygde vi produksjonsartefaktet ved å bruke nest build --webpack med følgende webpack-konfigurasjon :
const path = require("path");
const webpack = require("webpack");
module.exports = function (options) {
return {
...options,
mode: "production",
target: "node",
node: {
__dirname: false,
__filename: false
},
entry: "./src/main.ts",
output: {
path: path.resolve(__dirname, "build"),
filename: "main.js",
clean: true
},
externals: [...options.externals, "fastify-swagger"],
module: {
...options.modules,
rules: [
{
test: /\.(t|j)sx?$/,
exclude: /node_modules/,
use: {
loader: "ts-loader",
options: {
transpileOnly: true,
projectReferences: true
}
}
}
]
},
plugins: [
...options.plugins,
new webpack.IgnorePlugin({
checkResource(resource) {
const lazyImports = [
"@nestjs/microservices",
"@nestjs/microservices/microservices-module",
"@nestjs/websockets",
"@nestjs/websockets/socket-module",
"@nestjs/platform-express",
"@nestjs/swagger",
"@nestjs/mapped-types"
];
if (!lazyImports.includes(resource)) {
return false;
}
try {
require.resolve(resource);
} catch (err) {
return true;
}
return false;
}
})
]
};
};
Vi er ikke helt sikre på denne konfigurasjonen, den lar oss pakke våre APIer som én fil per API som inneholder alle avhengigheter (noe som, basert på mine mange undersøkelser, er et dårlig mønster). Vår bruk av IgnorePlugin er ganske risikabel og konfliktfylt.
Inntil nå fungerte det fint, men vi klarer nå ikke å få tilgang til swagger-siden levert av @nestjs/swagger og konfigurert i våre API-er. Ruten eksisterer, men fører til en hvit side (json-filen som inneholder API-beskrivelsen lastes, men alle statiske swagger-ressurser gir 404).
Jeg tenkte på en Swagger statisk ressurskopi, men det ser ut til å være et dårlig mønster. Dessuten har vi ikke en node_modules siden vi bruker Yarn med Plug'n play nodeLinker.
Avslutningsvis: etter flere dager med å lete etter gode praksiser og eksempler, er jeg litt forvirret siden problemet har forskjellige dimensjoner:
- Hvordan bygge hver API og pakke den med sine lokale avhengigheter (vanlige biblioteker)? Distribusjonen gjøres ved å bruke et Docker-bilde, slik at vi kan installere de eksterne avhengighetene fra package.json i byggefasen av bildet.
- Trenger vi virkelig webpack?
- Hvordan servere de statiske ressursene til swagger?
Jeg fulgte NestJS monorepo-dokumentasjonen, men den tilsvarer ikke vårt problem siden selskapets monorepo inneholder flere API-er og deres biblioteker, men også en webapplikasjon og en React Native-applikasjon som retter seg mot Android. Begge disse prosjektene, som ikke er Nest-prosjekter, bruker også de delte bibliotekene.
Jeg er klar til å refaktorere hele monorepo-konfigurasjonen, men jeg trenger et godt eksempel å basere arbeidet mitt på.
Takk for hjelpen, tips eller ideer