How to avoid "Module not found: Error: Can't resolve 'tslib'"-error when referencing an external typescript file?
How to avoid "Module not found: Error: Can't resolve 'tslib'"-error when referencing an external typescript file?
问题
我有一个 client/server 应用程序,其中客户端是一个 angular-app。服务器确实为它提供的 API 提供了几个打字稿定义。这些定义是从项目外部文件夹加载的。到目前为止,一切正常,但是现在我正在从 Angular 7 升级到 Angular 8(并且还将 Typescript 从版本 3.1 升级到 3.5),并且在尝试使用非静态枚举时定义,现在会产生此错误:
Module not found: Error: Can't resolve 'tslib' in '/path/to/server/definitions'
当 api.ts
文件位于客户端目录中时,一切正常。
为什么会这样,我能做些什么?
创建一个最小的可重现示例
这是一个快速脚本,可以创建一个最小的示例来重现:
mkdir project
cd project
ng new client --minimal=true --skipGit=true --routing=false --style=css
mkdir server
echo 'export enum ApiSample { X = "X" }' > server/api.ts
sed -i 's/"compilerOptions": {/"compilerOptions": {"paths":{"api":["..\/server\/api"]},/' client/tsconfig.json
sed -i -e "1iimport { ApiSample } from 'api';" -e "s/title = 'client';/title = 'client' + ApiSample.X;/" client/src/app/app.component.ts
cd client
npm start
或者,手动创建示例:
- 新建angular项目
- 在文件系统的某处创建一个文件"api.ts",内容为
export enum ApiSample { X = "X" }
- 在"tsconfig.json"中添加
{"paths":{"api":["/path/to/server/api"]}
到compilerOptions
- 从 angular 项目的任何文件访问
ApiSample.X
- 运行
npm start
目前的调查结果
- 迁移器在 tsconfig.json 中添加了
"importHelpers": true
。这就是为什么它以前有效而现在不再有效的原因。在 tsconfig.json 中指定 "importHelpers": false
解决了这个问题,但是当然这个选项是有原因的,所以这不是最终的解决方案
- 明确指定
"tslib": ["node_modules/tslib"]
可解决问题。这可能是最终的解决方案,尽管了解到底发生了什么以及记录在何处会很有趣。
Angular 8&9
所以对于 Angular 8 和 9 似乎将 "tslib": ["node_modules/tslib"]
添加到 tsconfig.json 中的 compilerOptions/paths
确实解决了问题。
Angular 10
在 Angular 10 中,问题完全消失,不再需要解决方法。
问题
我有一个 client/server 应用程序,其中客户端是一个 angular-app。服务器确实为它提供的 API 提供了几个打字稿定义。这些定义是从项目外部文件夹加载的。到目前为止,一切正常,但是现在我正在从 Angular 7 升级到 Angular 8(并且还将 Typescript 从版本 3.1 升级到 3.5),并且在尝试使用非静态枚举时定义,现在会产生此错误:
Module not found: Error: Can't resolve 'tslib' in '/path/to/server/definitions'
当 api.ts
文件位于客户端目录中时,一切正常。
为什么会这样,我能做些什么?
创建一个最小的可重现示例
这是一个快速脚本,可以创建一个最小的示例来重现:
mkdir project
cd project
ng new client --minimal=true --skipGit=true --routing=false --style=css
mkdir server
echo 'export enum ApiSample { X = "X" }' > server/api.ts
sed -i 's/"compilerOptions": {/"compilerOptions": {"paths":{"api":["..\/server\/api"]},/' client/tsconfig.json
sed -i -e "1iimport { ApiSample } from 'api';" -e "s/title = 'client';/title = 'client' + ApiSample.X;/" client/src/app/app.component.ts
cd client
npm start
或者,手动创建示例:
- 新建angular项目
- 在文件系统的某处创建一个文件"api.ts",内容为
export enum ApiSample { X = "X" }
- 在"tsconfig.json"中添加
{"paths":{"api":["/path/to/server/api"]}
到compilerOptions
- 从 angular 项目的任何文件访问
ApiSample.X
- 运行
npm start
目前的调查结果
- 迁移器在 tsconfig.json 中添加了
"importHelpers": true
。这就是为什么它以前有效而现在不再有效的原因。在 tsconfig.json 中指定"importHelpers": false
解决了这个问题,但是当然这个选项是有原因的,所以这不是最终的解决方案 - 明确指定
"tslib": ["node_modules/tslib"]
可解决问题。这可能是最终的解决方案,尽管了解到底发生了什么以及记录在何处会很有趣。
Angular 8&9
所以对于 Angular 8 和 9 似乎将 "tslib": ["node_modules/tslib"]
添加到 tsconfig.json 中的 compilerOptions/paths
确实解决了问题。
Angular 10
在 Angular 10 中,问题完全消失,不再需要解决方法。