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.

Relaterade artiklar