javascript - Typescript'ten yollarla Monorepo çalışmıyor


Aşağıdaki dosya yapısına sahip bir monorepom (yarn workspaces) var:

├── client                (workspace @client)
│   ├── package.json
│   └── tsconfig.json     (extended tsconfig)
├── server                (workspace @server)
│   ├── getData.ts
│   ├── package.json
│   └── tsconfig.json     (extended tsconfig)
├── shared
│   └── sanitizeData.ts
├── package.json          (monorepo root)
└── tsconfig.json         (base tsconfig)

Ve server/getData.ts dosyasında shared/sanitizeData.ts dosyasındaki fonksiyonu kullanmak istiyorum

Typescript'ten paths kullanmayı denedim, dokümanlara göre oldukça basit görünüyor, ama yanlış bir şey yapıyorum:

error TS2307: Cannot find module '@shared/sanitizeData'.

server/tsconfig.json:

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "baseUrl": ".",
    "rootDir": "../",
    "outDir": "build",
    "paths": {
      "@shared/*": ["shared/*"]
    }
  }
}

server/getData.js:

import { sanitizeData } from "@shared/sanitizeData";

Bana yardım edebilir misin lütfen?

Cevap #1

Yollar baseUrl'e göre göreli olduğundan, sizin durumunuzda ["shared/*"] yerine ["../shared/*"] kullanmanız gerekir

Cevap #2

Sadece kök tsconfig dosyasında baseUrl'i tanımlayın, yeniden baz alma karmaşıklıklarını önlemek için. Daha sonra tüm yolları baseUrl'den referans verin.

Unutmayın: paths özelliği, "extends" argümanının ima ettiği gibi birden fazla tsconfig dosyasındaki girdileri birleştirmez. Bir temel tsconfig dosyasının yolları, türetilmiş tsconfig dosyasındaki yollar tarafından üzerine yazılır.

Yani, yolları temel tsconfig dosyasından herhangi bir türetilmiş tsconfig dosyasına kopyalamanız/taşımanız gerekecek.

Ve, herhangi bir yol takma adını diğer göreli yollardan ayırt edilebilmesi için mutlaka '@' ile süsleyin. Bunu söylüyorum çünkü "commonlib/src" ile yapılan bir ithalatın bir yol takma adı olduğu hemen anlaşılmayabilir ve basitçe yerel src'den bir göreli yol olabilir. Ancak, "@commonlib/src" kolayca bir yol takma adı olarak tanınır, çünkü '@' geçerli bir dosya/klasör baş karakteri değildir.

İlgili makaleler