node.js - Kan jag exkludera filer dynamiskt från ts-kompilatorn?
Jag sätter upp en Node/TypeScript-server för att bygga en realtidsapplikation. Jag har min server och min klient i samma mapp.
Det jag vill göra är att utesluta "src/client" från TypeScript-kompilatorn när jag kör skriptet "server:dev" och utesluta "src/server" när jag kör "client:dev".
Jag har redan försökt hitta ett sätt att utesluta filer från kommandoraden, men jag hittade inga lösningar för det.
så här ser min tsconfig.json ut
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"lib": ["dom","es2017"],
"sourceMap": true,
"outDir": "dist",
"strict": true,
"noImplicitAny": true,
"moduleResolution": "node",
"esModuleInterop": true,
"resolveJsonModule": true
},
"exclude": [
"src/client"
]
}
men jag behöver inkludera "src/client" och exkludera "src/server" när jag kör klienten.
Svar #1
tsconfig.json stöder extends-fältet. I ditt fall bör du lägga den gemensamma konfigurationen i en grundläggande tsconfig.json, och sedan skapa tsconfig med extends för klient och server respektive.
// tsconfig.json
{
"compilerOptions": {
...
}
}
// tsconfig.client.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
...
},
"exclude": ["src/server"]
}
// tsconfig.server.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
...
},
"exclude": ["src/client"]
}
För npm-skript:
// package.json
{
"scripts": {
"server:dev": "tsc --build tsconfig.server.json",
"client:dev": "tsc --build tsconfig.client.json",
}
}
Svar #2
Det allmänna tillvägagångssättet för att ändra kompilatoralternativen dynamiskt:
eftersom fs-modulen kan användas i node.js, kan du lägga till denna verktygsfunktion i ditt node.js-projekt:
const fs = require("fs")
const prettier = require("prettier")
function changeTs(){
// this guarantees that I am on server
if(typeof window === "undefined"){
// process.cwd returns base folder, current working directory
// whatever path is
const tsPath = path.join(process.cwd(), "tsconfig.json")
const tsConfig = require(tsPath)
tsConfig.compilerOptions.exclude = ["src/client"]
fs.writeFileSync(
tsPath,
prettier.format(
JSON.stringify(tsConfig), { parser: "json" }
)
)
}
}
anropa ovanstående funktion i toppnivå när node.js-appen laddas, så att tsconfig.json kommer att uppdateras. standardinställningen bör vara "exclude": ["src/server"]. När du är på servern kommer det att ändras till "exclude": ["src/client"]
Med detta tillvägagångssätt kan du till och med skicka ett argument till funktionen, så du kan ändra ts-kompilatoralternativen baserat på en specifik inställning som din app behöver.
