npm - چگونه بسته محلی را در مونو رپوی تایپاسکریپت وارد کنیم
با فرض داشتن یک پروژه مونو رپو. --project_root/ |--packageA/ |--index.ts |--package.json |--foo/ |--index.ts |--packageB/ |--index.ts |--package.json |--bar/ |--spam.ts به طور معمول، زمانی که شما در packageA/index.ts هستید و میخواهید packageB/index.ts را وارد کنید، شما از import index from '../packageB' استفاده میکنید.
و زمانی که شما در packageA/foo/index.ts هستید و میخواهید packageB/index.ts را وارد کنید، باید دو دایرکتوری به بالا بروید import index from '../../packageB'
سوال این است که آیا راهی وجود دارد برای وارد کردن مانند import index from 'packageB' و برای پوشههای تو در تو import spam from 'packageB/bar/spam'؟
ویرایش
من یک مخزن گیتهاب برای نمایش مشکل بارگذاری کردهام https://github.com/jaimesangcap/lerna-ts-monorepo
پاسخ شماره ۱
شما میتوانید این کار را با مشخص کردن URL پایه و (در موارد پیچیدهتر) با استفاده از نگاشت مسیر انجام دهید.
اگر یک tsconfig.json در project_root داشته باشید، میتوانید استراتژی وارد کردن مورد نظر را با تعریف کردن به دست آورید
"compilerOptions": {
"baseUrl": "."
}
این کار زمانی جواب میدهد که نام بسته همیشه با نام پوشه زیرپروژه مطابقت داشته باشد.
اگر اینطور نباشد، میتوانید از paths استفاده کنید:
"compilerOptions": {
"baseUrl": ".", // This must be specified if "paths" is.
"paths": {
"A": ["packageA"],
"B": ["packageB"],
"A/*": ["packageA/*"],
"B/*": ["packageB/*"]
}
}
این باعث میشود تا typescript نوعهای واردات را به درستی در هنگام کامپایل تشخیص دهد. با این حال، مسیرهای واردات در جاوااسکریپت کامپایلشده حل نشدهاند، که بدان معنی است که لازم است مرحله بعدی در خط لوله شما (معمولاً یک بستهبند مانند webpack) نحوه حل این وارداتها را نیز بداند. برای webpack به طور خاص، این کار میتواند با مشخص کردن یک نام مستعار در پیکربندی webpack انجام شود:
resolve: {
alias: {
A: path.resolve(__dirname, 'packageA/'),
B: path.resolve(__dirname, 'packageB/')
}
}
اگر میخواهید فایلهای تایپاسکریپت را بهطور مستقیم اجرا کنید، ts-node سادهترین روش برای این کار است، زیرا اگر از tsconfig-paths استفاده کنید، مسیرهای تغییر یافته از تنظیمات تایپاسکریپت را از قبل میشناسد - در این صورت فقط باید فایل را با استفاده از ts-node -r tsconfig-paths/register packageA/index.ts اجرا کنید (ts-node و tsconfig-paths باید از طریق npm نصب شوند)
