Vyhledávání na webu

node.js - Mohu dynamicky vyloučit soubory z kompilátoru TS?


Nastavuji server v Node/TypeScript, abych vytvořil aplikaci v reálném čase. Mám server i klienta ve stejné složce.

Co chci udělat, je vyloučit "src/client" z kompilátoru TypeScript, když spustím skript "server:dev", a vyloučit "src/server", když spustím "client:dev".

Už jsem se snažil najít způsob, jak vyloučit soubory z příkazového řádku, ale nenašel jsem pro to řešení.

takto vypadá můj tsconfig.json

{
  "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"
  ]
}

ale potřebuji zahrnout "src/client" a vyloučit "src/server", když spouštím klienta.

Odpověď č. 1

Soubor tsconfig.json podporuje pole extends, ve vašem případě byste měli umístit společné nastavení do základního tsconfig.json, a poté vytvořit tsconfig s extends pro klienta a server zvlášť.

// tsconfig.json
{
  "compilerOptions": {
    ...               
  }
}

// tsconfig.client.json
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    ...               
  },
  "exclude": ["src/server"]
}

// tsconfig.server.json
{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    ...               
  },
  "exclude": ["src/client"]
}

Pro skripty npm:

// package.json
{
  "scripts": {
    "server:dev": "tsc --build tsconfig.server.json",
    "client:dev": "tsc --build tsconfig.client.json",
  }
}

Odpověď č. 2

Obecný přístup ke změně možností překladače dynamicky:

jelikož modul fs může být používán v node.js, můžete do svého projektu node.js přidat tuto utilitní funkci:

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" }
             )
           )
    
      }  
  }

volejte výše uvedenou funkci na nejvyšší úrovni při načítání aplikace node.js, aby byl aktualizován soubor tsconfig.json. Výchozí nastavení by mělo být "exclude": ["src/server"]. Když jste na serveru, bude změněno na "exclude": ["src/client"]

S tímto přístupem můžete dokonce předat argument funkci, takže můžete změnit možnosti kompilátoru TypeScript na základě konkrétního nastavení, které vaše aplikace potřebuje.

Související články