我可以从ts编译器动态排除文件吗?

时间:2019-04-02 13:14:11

标签: node.js reactjs typescript

我正在设置节点/打字稿服务器以构建实时应用程序。我的服务器和客户端位于同一文件夹中。

我想做的是,当我运行“ server:dev”脚本时,从打字稿编译器中排除“ src / client”,当我运行“ client:dev”时,排除“ src / server”。

我已经试图找到一种从命令行中排除文件的方法,但是我没有找到解决方案。

这就是我的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"
  ]
}

但是运行客户端时,我需要包括“ src / client”,而要排除“ src / server”。

2 个答案:

答案 0 :(得分:1)

tsconfig.json支持extends字段,在这种情况下,应将通用配置放在基础tsconfig.json中,然后分别用extends为客户端和服务器创建tsconfig。

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

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

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

对于npm脚本:

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

答案 1 :(得分:0)

动态更改编译器选项的一般方法:

由于 fs 模块可以在 node.js 中使用,您可以将此 util 函数添加到您的 node.j sproject 中:

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

调用上面的函数,当node.js应用加载时顶层,所以tsconfig.json会被更新。默认设置应为 "exclude": ["src/server"]。当您在服务器上时,它将更改为 "exclude": ["src/client"]

通过这种方法,您甚至可以将参数传递给函数,这样您就可以根据应用需要的特定设置更改 ts 编译器选项。