Typescript 编译器选项 - 尝试将“平面”输出输出到 outDir

ksh*_*ine 15 typescript tsconfig

我有一个src包含源代码和单元测试的目录,以及一个test包含单独速度测试的目录。

当我使用 构建项目时tsc,我得到如下目录结构:

dist/
  src/
    index.js
    ...
  test/
    speed-test.js
Run Code Online (Sandbox Code Playgroud)

然而,我更喜欢将“平面”输出发送到我的dist目录,如下所示:

dist/
  index.js
  ...
  speed-test.js
  ...
Run Code Online (Sandbox Code Playgroud)

如果我speed-test.tstest目录中删除,tsc则不会将src目录添加到dist. 仅当需要(或者至少当tsc决定需要时)来区分编译代码的源时,才会添加额外的目录结构。

我确信这有时对于避免文件名冲突非常有用,但在这种情况下这对我来说并不重要,而且我不想得到这个额外的“帮助”。

这是我的tsconfig.json

{
  "compilerOptions": {
    "target": "ES6",
    "module": "commonjs",
    "outDir": "./dist",
    "noImplicitAny": true,
    "noImplicitThis": true,
    "alwaysStrict": true,
    "noImplicitReturns": true,
    "moduleResolution": "node",
    "esModuleInterop": true,
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    "resolveJsonModule": true,
    "allowSyntheticDefaultImports": true
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试添加"rootDirs"的选项["src", "test"],但这没有帮助。

无论如何,我有办法获得我正在寻找的输出结构吗?

for*_*d04 12

为什么要在里面嵌套输出文件夹outDir

\n
\n

如果我speed-test.tstest目录中删除,tsc则不会将src目录添加到dist.

\n
\n

TypeScript 确定一个包含所有源文件的父文件夹。该文件夹由编译器设置或rootDir自动计算。tsconfig.json

\n

例如,如果您包含./test/speed-test.ts在编译中(./=项目根目录),它从 导入其他源文件./src,则其父文件夹将为./,编译后的版本将具有路径<outDir>/test/speed-test.js

\n

如何使输出文件夹变平?

\n

我们需要两件事:1.) TS 项目参考文献2.) rootDirs.

\n

项目引用将创建独立的子项目,每个子项目都有自己的rootDir配置。这有几个优点,例如提高编译时性能。我们可以outDir更灵活地构造输出文件夹( )。

\n

rootDirs将告诉编译器在编译过程中src和被合并到一个文件夹中。test现在我们可以编写导入路径,这些路径由编译器验证,就好像它们形成一个文件夹一样。考虑./test/speed-test.ts需求./src/main.ts- 然后您可以import使用现有的文件夹结构编写以下内容:

\n
// ./test/inside speed-test.ts\nimport {something} from "./main" // main.ts is still inside "./src"\n
Run Code Online (Sandbox Code Playgroud)\n

注意:TypeScript不会重写导入路径rootDirs仅影响输入类型验证。

\n

tldr:代码

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 package.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.test.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.ts\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 speedtest.ts\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tsconfig-base.json\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n
Run Code Online (Sandbox Code Playgroud)\n

./src/main.ts:

\n
export const foo = "foo"\n
Run Code Online (Sandbox Code Playgroud)\n

./src/tsconfig.json:

\n
{\n  "extends": "../tsconfig-base.json",\n  "compilerOptions": {\n    "outDir": "../dist",\n    "composite": true, // needed for references sub-projects\n    "rootDir": ".",\n    "tsBuildInfoFile": "../dist/srcbuildinfo"\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

./test/speedtest.ts:

\n
import { foo } from "./main"; // important(!): pretend, `src/main` is same folder\nconsole.log(foo);\n// ... do performance tests ...\n
Run Code Online (Sandbox Code Playgroud)\n

./test/tsconfig.json:

\n
{\n  "extends": "../tsconfig-base.json",\n  "compilerOptions": {\n    "outDir": "../dist",\n    "rootDir": ".",\n    "composite": true, \n    "tsBuildInfoFile": "../dist/testbuildinfo",\n    "rootDirs": ["../src", "../test"] // important (!)\n  },\n  "references": [\n    {\n      "path": "../src" // test project depends on src\n    }\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

./tsconfig.json:

\n
{\n  "files": [], // this root tsconfig just exists to compose sub-projects\n  "references": [\n    {\n      "path": "./src"\n    },\n    {\n      "path": "./test"\n    }\n  ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

tsconfig-base.json包含所有自己的配置值。编译tsc -b -v会将所有文件放置在./dist与源中指定的相同导入路径下:

\n
dist\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.d.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.js\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.test.d.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.test.js\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 speedtest.d.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 speedtest.js\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ...\n
Run Code Online (Sandbox Code Playgroud)\n

最后,如果您需要有关项目参考的更多信息 - 这是另一个代码示例

\n