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:

  1. Yeni bir Angular projesi oluştur
  2. Dosya sisteminde bir yere export enum ApiSample { X="X" } içeriğine sahip "api.ts" adında bir dosya oluşturun
  3. "tsconfig.json" dosyasında compilerOptions'a {"paths":{"api":["/path/to/server/api"]}} ekleyin
  4. Angular projesinin herhangi bir dosyasından ApiSample.X öğesine erişin
  5. npm start komutunu çalıştırın

Şimdiye kadarki bulgular

  • Göç ettirici tsconfig.json dosyasına "importHelpers": true ekledi. Bu yüzden daha önce çalışıyordu ve artık çalışmıyor. Tsconfig.json dosyasında "importHelpers": false belirtmek 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.

İlgili makaleler