angular - Harici bir TypeScript dosyasına referans verirken "Module not found: Error: Can't resolve 'tslib'" hatasından nasıl kaçınılır?
Soru
Bir istemci/sunucu uygulamam var, burada istemci bir Angular uygulaması. Sunucu, sağladığı API için birkaç TypeScript tanımı sağlıyor. Bu tanımlar proje dışı bir klasörden yükleniyor. Şimdiye kadar bu sorunsuz çalışıyordu, ancak şimdi Angular 7'den Angular 8'e yükseltiyorum (ve bununla birlikte TypeScript'i 3.1 sürümünden 3.5 sürümüne yükseltiyorum) ve tanımlardan statik olmayan bir enum kullanmaya çalıştığımda, bu artık şu hatayı üretiyor:
Modül bulunamadı: Hata: '/path/to/server/definitions' içinde 'tslib' çözümlenemiyor
api.ts dosyası client-dizini içinde bulunduğunda, her şey sorunsuz çalışır.
Bu neden oluyor ve bunun için ne yapabilirim?
Minimal yeniden üretilebilir bir örnek oluşturma
İşte yeniden üretmek için minimal bir örnek oluşturacak hızlı bir betik:
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
Veya alternatif olarak, bir örneği elle oluşturmak için:
- Yeni bir Angular projesi oluştur
- Dosya sisteminde bir yere
export enum ApiSample { X="X" }içeriğine sahip "api.ts" adında bir dosya oluşturun - "tsconfig.json" dosyasında
compilerOptions'a{"paths":{"api":["/path/to/server/api"]}}ekleyin - Angular projesinin herhangi bir dosyasından
ApiSample.Xöğesine erişin npm startkomutunu çalıştırın
Şimdiye kadarki bulgular
- Göç ettirici tsconfig.json dosyasına
"importHelpers": trueekledi. Bu yüzden daha önce çalışıyordu ve artık çalışmıyor. Tsconfig.json dosyasında"importHelpers": falsebelirtmek sorunu çözüyor, ancak elbette bu seçenek bir nedenle vardır, bu yüzden bu nihai bir çözüm değildir. - Sorunu çözmek için
"tslib": ["node_modules/tslib"]açıkça belirtmek gerekir. Bu nihai bir çözüm olabilir, ancak tam olarak neyin gerçekleştiğini ve bunun nerede belgelendiğini bilmek ilginç olurdu.
Cevap #1
Angular 8 ve 9
Yani Angular 8 ve 9 için tsconfig.json içindeki compilerOptions/paths'a "tslib": ["node_modules/tslib"] eklemek sorunu çözüyor gibi görünüyor.
Angular 10
Angular 10'da sorun tamamen ortadan kalktı, artık herhangi bir geçici çözüm gerekmez.