تایپاسکریپت - مسیرهای نسبی برای واردات SystemJS و ماژول ES


من در وارد کردن کامپوننتهای Angular2 هنگام استفاده از SystemJS و سینتکس import در ES مشکل دارم.

ساختار پروژه:

ROOT
|_src
  |_client
    |_app
      |_frameworks
        |_il8n
        |_analytics
      |_main
        |_components
        |_pages
        |_utility

فرض کنیم من یک فایل دارم: ROOT/src/client/app/frameworks/il8n/language-service.ts و یک فایل دیگر: ROOT/src/client/app/main/pages/login/login.ts. در login.ts میخواهم language.ts را وارد کنم، بنابراین یک روش برای این کار به این صورت است:

//login.ts وارد کردن { LanguageService } از '../../../../frameworks/il8n/language-service';

راه دیگر انجام این کار، با استفاده از بشکهها، به این صورت است:

//login.ts وارد کردن { LanguageService } از '../../../../frameworks/index';

جایی که frameworks/index.ts در حال انجام export * from './il8n/language-service'; است

من نمیخواهم هر بار که نیاز به وارد کردن چیزی دارم، ../../../ و غیره را تایپ کنم؛ خوب است اگر بتوانم فقط این کار را انجام دهم: import { LanguageService } from 'frameworks';

تا کنون، توانستهام فرآیند ساخت خود را با استفاده از گزینه «map» در SystemJS به این صورت راهاندازی کنم:

map: {
      frameworks: 'src/client/app/frameworks/index',
      components: 'src/client/app/main/components/index',
      pages: 'src/client/app/main/pages/index'
    }

با این حال، IDE من شکایت میکند (تمام قابلیتهای IntelliSense کاملاً خراب شدهاند) هر زمان که کاری مانند این انجام میدهم:

`import { LanguageService } from 'frameworks';`

این فایل tsconfig.json من است:

{
    "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "declaration": false,
        "removeComments": true,
        "noLib": false,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "sourceMap": true,
        "pretty": true,
        "allowUnreachableCode": false,
        "allowUnusedLabels": false,
        "noImplicitAny": true,
        "noImplicitReturns": true,
        "noImplicitUseStrict": false,
        "noFallthroughCasesInSwitch": true,
        "baseUrl": "./src",
        "paths": {
            "frameworks": ["client/app/frameworks"],
            "components": ["client/app/main/components"],
            "pages": ["client/app/main/pages"],
            "utility": ["client/app/main/utility"]
        }
    },
    "compileOnSave": false
}

آیا راهی وجود دارد که هم IDE من و هم پیکربندی ساخت SystemJS راضی شوند تا بتوانم واردات «ساده» انجام دهم؟

پاسخ شماره ۱

پس، این سوال بر اساس مخزن Angular2 Seed (Advanced) که در اینجا یافت میشود، بود. من همچنین یک مسئله آنجا ارسال کردم (که میتوانید اصلاح دقیق را ببینید). داستان کوتاه:

برای استفاده از گزینههای paths و baseUrl در فایل tsconfig خود، به TypeScript 2.0 نیاز دارید. سپس در فایل پیکربندی SystemJS خود، باید مقداری پیکربندی به گزینههای paths و packages به صورت زیر اضافه کنید:

packages: {
  ...
  frameworks: { defaultExtension: js, main: index.js }
  ...
},
paths: {
  ...
  frameworks: 'relative/path/to/frameworks/folder'
  ...
}

index.ts یک فایل درون پوشه frameworks شما است که ماژولهای آن دایرکتوری را صادر میکند. به عنوان مثال، اگر یک فایل language.component.ts در جایی از دایرکتوری frameworks خود داشتید، در فایل frameworks/index.ts شما این کار را انجام میدهید:

export * از 'path/to/language.component'؛.

این به شما اجازه میدهد تا import {LanguageComponent} from 'frameworks'; را در پروژه خود انجام دهید (تا زمانی که خارج از دایرکتوری frameworks باشید).

امیدوارم این کمک کند!