TypeScript - 导入外部 npm 模块会导致 tsc 的输出文件夹更改

Posted

技术标签:

【中文标题】TypeScript - 导入外部 npm 模块会导致 tsc 的输出文件夹更改【英文标题】:TypeScript - Importing external npm module causes tsc's output folder to change 【发布时间】:2016-12-22 04:47:53 【问题描述】:

我设置了一个 TypeScript 项目来将生成的 javascript 文件构建到 ./src/。在针对现有的 npm 模块进行构建时,这非常有效(这是一个 Angular 2 项目,因此需要导入这些模块,但我认为在这种情况下这并不重要)。

当我安装一个特定的 npm 模块(我是作者 ng2-dynamic-dialog)并从该模块导入任何内容时,tsc 突然将 JavaScript 构建到不同的文件夹(而不是构建到 ./src/,它现在是构建到 ./src/src/) 并且它还在 ./src/ 中复制 node_modules 文件夹,其中仅包含 ng2-dynamic-dialog。

这可能不是一个很好的解释,所以这里有一个例子 https://github.com/leewinder/ng2-dynamic-dialog (Sha - 8ef439d6)

如果您克隆开发分支,并在 ./samples 中运行 tsc,您将看到 JS 文件已正确构建到 ./src。如果您打开 src/samples/samples.component.ts 并取消注释行 'import Ng2DynamicDialogComponent from 'ng2-dynamic-dialog';'再次运行 tsc,你会看到 src/ 现在包含 ./src/src 和 ./src/node_modules

我的 tsconfig.json 设置如下


  "compilerOptions": 
    "target": "es5",
    "outDir": "src/",
    "module": "commonjs",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false,
    "watch": true,
    "diagnostics": true,
    "listFiles": true
  

如果我将 'outDir' 更改为 ./,则不再发生此重复文件夹问题,但为什么引用此单个 npm 包会导致此问题?

无论我是否将 NPM 模块添加到 systemjs.config.js 都会出现此问题,因此它似乎与此无关。

我只能假设我的配置或我的 npm 包有问题,但 npm 包看起来不错。

npm 包的源代码与上述相同,但在开发文件夹中。

任何帮助都将不胜感激,因为我现在正用头撞砖墙。

【问题讨论】:

【参考方案1】:

导入外部 npm 模块会导致 tsc 的输出文件夹发生变化

使用compilerOptions.baseDir 选项锁定基本目录,而不是被魔法确定。

【讨论】:

无法识别 baseDir,但能识别 compilerOptions.rootDir。将 rootDir 设置为 src/,removing compilerOptions.outDir 似乎已经解决了这个问题。将 outDir 设置为 anything 会导致与 OP 中描述的问题相同。

以上是关于TypeScript - 导入外部 npm 模块会导致 tsc 的输出文件夹更改的主要内容,如果未能解决你的问题,请参考以下文章

如何将 typescript npm 模块导入语法转换为 ECMA2015 模块导入语法

如何使用 typescript / gulp / browserify 导入 npm 模块

Typescript - 内部模块中的导入声明不能引用外部模块

将 npm 链接的 React JSX 项目/模块导入 AngularJS TypeScript 模块不起作用

使用 WebPack + TypeScript 定义导入的外部模块

Typescript:esnext 编译器选项会破坏从外部库导入的 es6