Làm thế nào để tránh nhập với đường dẫn tương đối rất dài trong Angular 2?


Câu trả lời:


138

TypeScript 2.0+

Trong TypeScript 2.0, bạn có thể thêm một baseUrlthuộc tính trong tsconfig.json:

{
    "compilerOptions": {
        "baseUrl": "."
        // etc...
    },
    // etc...
}

Sau đó, bạn có thể nhập mọi thứ như thể bạn đang ở trong thư mục cơ sở:

import {XyService} from "services/validation/xy.service";

Trên hết, bạn có thể thêm một thuộc pathstính, cho phép bạn khớp một mẫu sau đó vạch ra nó. Ví dụ:

{
    "compilerOptions": {
        "baseUrl": ".",
        "paths": {
            "services/*": [
                "services/validation/*"
            ]
        }
        // etc...
    },
    // etc...
}

Điều này sẽ cho phép bạn nhập nó từ bất cứ đâu như vậy:

import {XyService} from "services/xy.service";

Từ đó, bạn sẽ cần phải định cấu hình bất kỳ trình tải mô-đun nào bạn đang sử dụng để hỗ trợ các tên nhập này. Ngay bây giờ, trình biên dịch TypeScript dường như không tự động vạch ra những thứ này.

Bạn có thể đọc thêm về điều này trong vấn đề github . Ngoài ra còn có một thuộc rootDirstính hữu ích khi sử dụng nhiều dự án.

Pre TypeScript 2.0 (Vẫn áp dụng trong TS 2.0+)

Tôi thấy nó có thể được thực hiện dễ dàng hơn bằng cách sử dụng "thùng" .

  1. Trong mỗi thư mục, hãy tạo một index.tstệp.
  2. Trong các tệp này, hãy xuất lại từng tệp trong thư mục.

Thí dụ

Trong trường hợp của bạn, trước tiên hãy tạo một tệp có tên my-app-name/services/validation/index.ts. Trong tệp này, có mã:

export * from "./xy.service";

Sau đó, tạo một tệp có tên my-app-name/services/index.tsvà có mã này:

export * from "./validation";

Bây giờ bạn có thể sử dụng dịch vụ của mình như vậy ( indexngụ ý):

import {XyService} from "../../../services";

Và khi bạn có nhiều tệp trong đó, việc này thậm chí còn dễ dàng hơn:

import {XyService, MyOtherService, MyOtherSerivce2} from "../../../services";

Việc phải duy trì các tệp bổ sung này sẽ tốn nhiều công sức hơn một chút (công việc có thể được loại bỏ bằng cách sử dụng người bảo trì thùng ), nhưng tôi thấy rằng cuối cùng nó cũng được đền đáp với ít công việc hơn. Việc thay đổi cấu trúc thư mục chính dễ dàng hơn nhiều và nó cắt giảm số lần nhập mà bạn phải thực hiện.

Thận trọng

Khi làm điều này, có một số điều bạn phải chú ý và không thể làm:

  1. Bạn phải theo dõi các lần tái xuất theo vòng tròn. Vì vậy, nếu các tệp trong hai thư mục con tham chiếu lẫn nhau, thì bạn sẽ cần sử dụng đường dẫn đầy đủ.
  2. Bạn không nên quay lại một thư mục từ cùng một thư mục gốc (ví dụ: đang ở trong một tệp trong thư mục xác thực và thực hiện import {XyService} from "../validation";). Tôi đã tìm thấy điều này và điểm đầu tiên có thể dẫn đến lỗi nhập không được xác định.
  3. Cuối cùng, bạn không thể có hai bản xuất trong một thư mục con có cùng tên. Thường thì đó không phải là một vấn đề.

2
@ ThomasZuberbühler Tôi nghĩ trong TypeScript 1.8 sẽ có sẵn ( xem tại đây ).
David Sherret

3
Làm cách nào để tải xuống Typecript 2.0+ với npm?
maximedupre

4
Một mẹo nhỏ - sau khi đọc tài liệu, hóa ra nó baseUrlcó liên quan đến vị trí của 'tsconfig.json'. Vì vậy, trong trường hợp của chúng tôi (ứng dụng góc cạnh), giá trị phải là "baseUrl": "./app",, trong đó "ứng dụng" là gốc của ứng dụng.
Pawel Gorczynski

10
Chỉ người dùng angle-cli : nếu bạn đang sử dụng angle-cli 2+, họ đã chuyển sang webpack và hộp đen webpack.config.js (bên trong node_modules). "Từ đó, bạn sẽ cần phải định cấu hình bất kỳ trình nạp mô-đun nào bạn đang sử dụng để hỗ trợ các tên nhập này." Vì webpack.config.js là hộp đen, bạn không thể thực hiện phần này. May mắn thay, tôi thấy vấn đề đã được báo cáo ở đây và giải quyết bằng PR này . TL; DR cấu hình webpack hộp đen đủ thông minh để xem tsconfig.json ngay bây giờ.
Kevin

1
đối với người dùng angle-cli, bạn có thể tạo webpack.config với "ng eject". Lưu ý rằng bạn sẽ cần xóa dự án ejected: true khỏi .angular-cli.json -> để có thể phục vụ dự án.
Drusantia

14

Tốt hơn nên sử dụng cấu hình bên dưới trong tsconfig.json

{
  "compilerOptions": {
    "...": "reduced for brevity",

    "baseUrl": "src",
    "paths": {
      "@app/*": ["app/*"]
    }
  }
}

Cách truyền thống trước Angular 6:

`import {XyService} from '../../../services/validation/xy.service';`

nên được cấu trúc lại thành:

import {XyService} from '@app/services/validation/xy.service

Ngắn và ngọt!


thay đổi này không hoạt động trong sản xuất @shivangGupta
ẩn danh

1

Tôi vừa xem qua câu hỏi này. Tôi biết bây giờ đã trở lại nhưng đối với bất kỳ ai xem qua nó thì có một câu trả lời đơn giản hơn.

Tôi xem qua chỉ vì điều gì đó tôi đã làm trong một thời gian dài ngừng hoạt động và tôi đang tự hỏi liệu có gì đó đã thay đổi trong Angular 7. Không, đó chỉ là mã của riêng tôi.

Bất kể tôi chỉ phải thay đổi một dòng tsconfig.jsonđể tránh các đường dẫn nhập dài.

{
  "compilerOptions": {
  "...": "simplified for brevity",

   "baseUrl": "src"
  }
}

Thí dụ:

// before:
import {XyService} from '../../../services/validation/xy.service';

// after:
import { XyService } from 'app/services/validation/xy.service';

Điều này đã làm việc cho tôi khá nhiều kể từ khi Angular-CLI xuất hiện.


Cảm ơn vì nỗ lực của Chris, nhưng bạn nên cung cấp các ví dụ sử dụng trong câu trả lời của mình!
George43g
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.