Bỏ qua để đến nội dung

Dự án TypeScript

Generator dự án TypeScript có thể được sử dụng để tạo một thư viện hoặc ứng dụng TypeScript hiện đại được cấu hình với các phương pháp hay nhất như ECMAScript Modules (ESM), project references của TypeScript, Vitest để chạy tests và Biome để linting và định dạng.

Bạn có thể tạo một dự án TypeScript mới theo hai cách:

  1. Cài đặt Nx Console VSCode Plugin nếu bạn chưa cài đặt
  2. Mở Nx Console trong VSCode
  3. Nhấp Generate (UI) trong phần "Common Nx Commands"
  4. Tìm kiếm @aws/nx-plugin - ts#project
  5. Điền các tham số bắt buộc
    • Nhấp Generate
    Tham sốKiểuMặc địnhMô tả
    name Bắt buộcstring-Tên dự án TypeScript
    directory stringpackagesThư mục cha nơi thư viện được đặt.
    subDirectory string-Thư mục con nơi thư viện được đặt. Mặc định đây là tên thư viện.
    preferInstallDependencies booleantrueCó nên ưu tiên cài đặt các dependencies sau khi generator chạy hay không. Đặt thành false để hoãn việc cài đặt khi chạy nhiều generator liên tiếp (việc cài đặt vẫn sẽ chạy nếu cần thiết để các generator tiếp theo có thể tính toán Nx project graph); cài đặt một lần vào cuối.

    Generator sẽ tạo cấu trúc dự án sau trong thư mục <directory>/<name>:

    • Thư mụcsrc Mã nguồn TypeScript
      • index.ts
    • project.json Cấu hình dự án và các build targets
    • tsconfig.json Cấu hình TypeScript cơ bản cho dự án này (kế thừa từ tsconfig.base.json ở workspace root)
    • tsconfig.lib.json Cấu hình TypeScript cho thư viện của bạn (mã nguồn runtime hoặc đóng gói)
    • tsconfig.spec.json Cấu hình TypeScript cho các tests
    • vitest.config.mts Cấu hình cho Vitest

    Bạn cũng sẽ nhận thấy một số thay đổi đối với các file sau trong workspace root của bạn:

    • nx.json Cấu hình Nx được cập nhật để cấu hình @nx/js/typescript plugin cho dự án của bạn
    • tsconfig.base.json một alias TypeScript được thiết lập cho dự án của bạn để nó có thể được import bởi các dự án khác trong workspace
    • tsconfig.json một project reference TypeScript được thêm vào cho dự án của bạn

    Thêm mã TypeScript của bạn vào thư mục src.

    Vì dự án TypeScript của bạn là một ES Module, hãy chắc chắn viết các câu lệnh import với cú pháp ESM chính xác, tham chiếu rõ ràng đến phần mở rộng file:

    index.ts
    import { sayHello } from './hello.js';

    Entry point cho dự án TypeScript của bạn là src/index.ts. Bạn có thể thêm exports ở đây cho bất cứ thứ gì bạn muốn các dự án khác có thể import:

    src/index.ts
    export { sayHello } from './hello.js';
    export * from './algorithms/index.js';

    Import Mã Thư Viện của Bạn trong Các Dự Án Khác

    Phần tiêu đề “Import Mã Thư Viện của Bạn trong Các Dự Án Khác”

    TypeScript aliases cho dự án của bạn được cấu hình trong tsconfig.base.json của workspace, cho phép bạn tham chiếu dự án TypeScript của mình từ các dự án TypeScript khác:

    packages/my-other-project/src/index.ts
    import { sayHello } from ':my-scope/my-library';

    Khi bạn thêm một câu lệnh import cho một dự án mới trong workspace lần đầu tiên, bạn có thể sẽ thấy lỗi trong IDE tương tự như bên dưới:

    Lỗi import
    Terminal window
    File '/path/to/my/workspace/packages/my-library/src/index.ts' is not under 'rootDir' '/path/to/my/workspace/packages/my-consumer'. 'rootDir' is expected to contain all source files.
    File is ECMAScript module because '/path/to/my/workspace/package.json' has field "type" with value "module" ts(6059)
    File '/path/to/my/workspace/packages/my-library/src/index.ts' is not listed within the file list of project '/path/to/my/workspace/packages/my-consumer/tsconfig.lib.json'. Projects must list all files or use an 'include' pattern.
    File is ECMAScript module because '/path/to/my/workspace/package.json' has field "type" with value "module" ts(6307)

    Điều này là do một project reference chưa được thiết lập.

    Các dự án TypeScript được cấu hình với Nx TypeScript Sync generator ngay từ đầu, giúp bạn không cần phải cấu hình project reference thủ công. Chỉ cần chạy lệnh sau và Nx sẽ thêm cấu hình cần thiết:

    Terminal window
    pnpm nx sync

    Sau đó, lỗi trong IDE của bạn sẽ biến mất và bạn đã sẵn sàng sử dụng thư viện của mình.

    Nếu bạn thêm các entries compilerOptions.paths tùy chỉnh trong tsconfig.json của một dự án, TypeScript sẽ ngừng kế thừa các aliases workspace được định nghĩa trong tsconfig.base.json. Generator ẩn ts#sync chạy trước compile target (được cấu hình trong nx.json) để sao chép bất kỳ base aliases còn thiếu nào vào các files tsconfig.json, tsconfig.lib.jsontsconfig.app.json đã khai báo paths. Để tắt tính năng này, hãy xóa @aws/nx-plugin:ts#sync khỏi targetDefaults.compile.syncGenerators trong nx.json.

    Bạn sẽ nhận thấy rằng dự án TypeScript của bạn không có file package.json, điều này có thể bất ngờ nếu bạn quen với các monorepos TypeScript truyền thống.

    Để thêm một dependency cho bất kỳ package TypeScript nào trong monorepo của bạn, chỉ cần thêm dependency vào package.json ở root của workspace. Bạn có thể thực hiện điều này qua command line cho package manager của bạn:

    Terminal window
    pnpm add -w some-npm-package

    Dependency sau đó có sẵn cho bất kỳ dự án TypeScript nào trong workspace của bạn sử dụng.

    Khi bạn sử dụng dự án TypeScript của mình làm mã runtime (ví dụ như handler cho một AWS Lambda function), được khuyến nghị là bạn sử dụng một công cụ như Rolldown để bundle dự án của bạn, vì điều này có thể tree-shake để đảm bảo rằng chỉ các dependencies mà dự án của bạn thực sự tham chiếu được bao gồm.

    Bạn có thể đạt được điều này bằng cách thêm một target như sau vào file project.json của bạn:

    {
    ...
    "targets": {
    ...
    "bundle": {
    "cache": true,
    "executor": "nx:run-commands",
    "outputs": ["{workspaceRoot}/dist/packages/my-library/bundle"],
    "options": {
    "command": "rolldown -c rolldown.config.ts"
    }
    },
    },
    }

    Và thêm file rolldown.config.ts như sau:

    rolldown.config.ts
    import { defineConfig } from 'rolldown';
    export default defineConfig([
    {
    input: 'src/index.ts',
    output: {
    file: '../../dist/packages/my-library/bundle/index.js',
    format: 'cjs',
    inlineDynamicImports: true,
    },
    },
    ]);

    Nếu bạn đang publish dự án TypeScript của mình lên NPM, bạn phải tạo một file package.json cho nó.

    File này phải khai báo các dependencies mà dự án của bạn tham chiếu. Vì tại thời điểm build, dự án của bạn sẽ resolve các dependencies được cài đặt qua package.json ở workspace root, quy tắc noUndeclaredDependencies của Biome sẽ cảnh báo nếu dự án của bạn import một package không được liệt kê trong package.json của nó.

    Dự án TypeScript của bạn được cấu hình với một build target (được định nghĩa trong project.json), bạn có thể chạy qua:

    Terminal window
    pnpm nx build <project-name>

    Trong đó <project-name> là tên đầy đủ của dự án của bạn.

    build target sẽ compile, lint và test dự án của bạn.

    Kết quả build có thể được tìm thấy trong thư mục dist root trong workspace của bạn, bên trong một thư mục cho package và target của bạn, ví dụ dist/packages/<my-library>/tsc

    Để build tất cả các dự án trong workspace của bạn, chạy:

    Terminal window
    pnpm nx run-many --target build

    Hoặc sử dụng lệnh rút gọn:

    Terminal window
    pnpm build

    Vitest được cấu hình để test dự án của bạn.

    Tests nên được viết trong các file .spec.ts hoặc .test.ts, đặt cùng vị trí trong thư mục src của dự án.

    Ví dụ:

    • Thư mụcsrc
      • hello.ts Mã nguồn thư viện
      • hello.spec.ts Tests cho hello.ts

    Vitest cung cấp cú pháp giống Jest để định nghĩa tests, với các tiện ích như describe, it, testexpect.

    hello.spec.ts
    import { sayHello } from './hello.js';
    describe('sayHello', () => {
    it('should greet the caller', () => {
    expect(sayHello('Darth Vader')).toBe('Hello, Darth Vader!');
    });
    });

    Để biết thêm chi tiết về cách viết tests và các tính năng như mocking dependencies, tham khảo tài liệu Vitest

    Tests sẽ chạy như một phần của build target cho dự án của bạn, nhưng bạn cũng có thể chạy chúng riêng biệt bằng cách chạy test target:

    Terminal window
    pnpm nx test <project-name>

    Bạn có thể chạy một test riêng lẻ hoặc một suite tests bằng cách sử dụng flag -t của Vitest. Truyền nó sau dấu phân cách -- để Nx chuyển tiếp nó cho Vitest thay vì sử dụng nó như tùy chọn --target của chính nó:

    Terminal window
    pnpm nx test <project-name> -- -t 'sayHello'

    Các dự án TypeScript sử dụng Biome để linting và định dạng. Biome được cấu hình trong file biome.json ở workspace root — các thay đổi tại đây áp dụng cho tất cả các dự án TypeScript trong workspace của bạn và đảm bảo tính nhất quán.

    Để gọi linter kiểm tra dự án của bạn, bạn có thể chạy lint target.

    Terminal window
    pnpm nx lint <project-name>

    Phần lớn các vấn đề linting hoặc formatting có thể được sửa tự động bằng cách chạy với argument --configuration=fix.

    Terminal window
    pnpm nx lint <project-name> --configuration=fix

    Tương tự, nếu bạn muốn sửa tất cả các vấn đề lint trong tất cả các packages trong workspace của bạn, bạn có thể chạy:

    Terminal window
    pnpm nx run-many --target lint --all --configuration=fix

    Để tránh các vấn đề linting làm chậm bạn trong quá trình phát triển (đặc biệt nếu bạn có các vấn đề không thể tự động sửa trong dự án của mình), bạn có thể chạy một build với cấu hình skip-lint:

    Terminal window
    pnpm nx run-many --target build --configuration=skip-lint

    Điều này bỏ qua hoàn toàn lint target trong quá trình build.