node.js - 为什么 `allowJS` 会在我的编译输出中导致不需要的 `src` 子目录?

标签 node.js typescript express tsconfig

我正在按照 Microsoft TypeScript starter 将旧版 Node/express 代码库转换为 TypeScript。作为起始引用。

在此引用输出中,输出被编译为 dist,但是当在 tsconfig.json 中启用 allowJS 时,输出会发送到 dist/src - 这是为什么?

这是我的tsconfig.json

{
"compilerOptions": {
  "module": "commonjs",
  "target": "es6",
  "noImplicitAny": false,
  "moduleResolution": "node",
  "sourceMap": true,
  "rootDir" : "./",
  "outDir": "dist",
  "baseUrl": ".",
  "allowJs": true,
  "paths": {
    "*": [
      "node_modules/*",
      "src/types/*"
    ]
  }
},
"include": [
  "src/**/*"
]

}

  • 我尝试将 rootDir 更改为 ./src 但出现错误,提示“node_modules/someModule”不在 src 根目录中。
  • 根据我看到的 GitHub 问题,我尝试将 tsconfig.json 移动到 src,但没有生成任何输出。

AllowJS

输出在 /dist 下正确映射,直到在 tsconfig.json 中打开 allowJS 标志,之后输出出现在 /dist/src

最佳答案

这里发生了两件事:

  • Typescript 依赖 rootDir 来决定输出的目录结构(请参阅 this comment from Typescript's bossman )。
  • 只有 rootDir 中的代码可以由 tsc 编译/发出。
  • 如果您没有显式设置 rootDir,则默认为 ./(相对于 tsconfig)...除非您在 ./ 之外包含了需要由 tsc 编译/发出的内容,在这种情况下,它会强制 rootDir 自动设置为包含所有源代码的目录。
  • allowJS 设置告诉 tsc.js 代码视为源代码,并将其发送到 outDir

我怀疑当您启用 allowJS 时,src 之外有 .js 代码,tsc 现在必须将其发送到 outDir,因此它会自动将 rootDir 上移一级。由于 src 现在是 rootDir 的子目录,因此它会在 outDir 中镜像。

参见this answer获取一个解决方案,使您能够让 src 保留 rootDir 并包含来自其外部的代码。

关于node.js - 为什么 `allowJS` 会在我的编译输出中导致不需要的 `src` 子目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48847182/

相关文章:

node.js - 用于 api 的 kubernetes 集群安全入口点

javascript - 如何在 Node.JS 代码中在套接字事件之外的范围内使用 let 变量?

接口(interface)的 TypeScript 反射

javascript - Redis GET 函数返回未定义

javascript - 如何从剧作家那里读取文本框值

angular - 组件中的变量仅在 Angular 4 服务中的第二次函数调用后才会更新

javascript - typescript D3 v4 导入不工作

javascript - React 和 Express 不起作用?

node.js - 将路由移动到 Express.js 中的文件中

MongoDB E11000 重复键错误