TypeScript+Webpack 解析符号链接文件夹中的依赖项

Posted

技术标签:

【中文标题】TypeScript+Webpack 解析符号链接文件夹中的依赖项【英文标题】:TypeScript+Webpack resolving dependencies in symlink folder 【发布时间】:2017-12-17 18:44:34 【问题描述】:

如果 TypeScript+Webpack 在符号链接文件夹中,我遇到了无法正确解析依赖项的问题。我有这样的文件结构:

- main
-- index.ts
-- package.json
-- webpack.config.js

- shared-lib
-- services
--- session.ts
-- package.json

main 中存在shared-lib@file:../shared-lib 的依赖关系,结果npm 会在node_modules 中为其创建符号链接。

shared-lib 中,我对lodash-es 有依赖关系,在main 中也有它,但是项目中应该只有一个lodash-es,我想保留在main 中,结果当我尝试构建项目时,我得到类似:

ERROR in [at-loader] ../shared-lib/index.ts:1:24 TS2307: Cannot find module 'lodash-es/capitalize'.

Webpack 也抱怨过这个问题,但如果在 resolve.modules 中提供到 node_modules 的绝对路径,则可以解决此问题。现在看起来是唯一一个不知道在哪里寻找依赖项的 TypeScript。我查看了 TypeScript 配置文档,但找不到任何有用的信息,如果文件位于主文件夹之外,是否有任何方法可以提示 TypeScript 在哪里查找依赖项?我尝试使用rootDirs,但似乎不适合我的情况。

【问题讨论】:

【参考方案1】:

好的,TypeScript 有 2 种(可能更多,但在我的例子中只使用了 2 种)解决非相对依赖关系的策略,它们都依赖于真实的文件路径。如果 npm 会复制本地依赖,那么不会有任何问题,但它会创建符号链接。

我发现了一种可能解决此问题的解决方法,但不是以最优雅的方式。如果将baseUrl指定为.,则可以提供paths,并且可以提供第3方依赖的准确位置。

现在我的.tsconfig 有以下几行:

"baseUrl": ".",
"paths": 
  "lodash-es": ["node_modules/lodash-es"]
,

这将强制将所有 lodash-es 条目解析为 ./node_modules/lodash-es,其中 dot 指向主项目根目录。

希望 TypeScript 能够提供自定义模块解析策略的可能性。

【讨论】:

以上是关于TypeScript+Webpack 解析符号链接文件夹中的依赖项的主要内容,如果未能解决你的问题,请参考以下文章

Webpack 和 TypeScript 无法解析 Vue 的声明文件

模块解析失败:Webpack Typescript Loader 中出现意外的令牌

使用 Webpack 2 和 awesome-typescript-loader 的 baseUrl 和路径解析

Webpack 和 TypeScript:无法解析 node.d.ts 中的模块“child_process”

当我使用 webpack 和 ts-loader 构建项目时,Typescript 环境模块未解析

Electron 和 TypeScript:“fs”无法解析