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à ESLint để phân tích tĩnh.
Cách Sử Dụng
Phần tiêu đề “Cách Sử Dụng”Tạo một Dự Án TypeScript
Phần tiêu đề “Tạo một Dự Án TypeScript”Bạn có thể tạo một dự án TypeScript mới theo hai cách:
- Install the Nx Console VSCode Plugin if you haven't already
- Open the Nx Console in VSCode
- Click
Generate (UI)in the "Common Nx Commands" section - Search for
@aws/nx-plugin - ts#project - Fill in the required parameters
- Click
Generate
pnpm nx g @aws/nx-plugin:ts#projectyarn nx g @aws/nx-plugin:ts#projectnpx nx g @aws/nx-plugin:ts#projectbunx nx g @aws/nx-plugin:ts#projectYou can also perform a dry-run to see what files would be changed
pnpm nx g @aws/nx-plugin:ts#project --dry-runyarn nx g @aws/nx-plugin:ts#project --dry-runnpx nx g @aws/nx-plugin:ts#project --dry-runbunx nx g @aws/nx-plugin:ts#project --dry-runTùy Chọn
Phần tiêu đề “Tùy Chọn”| Parameter | Type | Default | Description |
|---|---|---|---|
| name Required | string | - | TypeScript project name |
| directory | string | packages | Parent directory where the library is placed. |
| subDirectory | string | - | The sub directory the lib is placed in. By default this is the library name. |
Kết Quả từ Generator
Phần tiêu đề “Kết Quả từ Generator”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
- vite.config.ts Cấu hình cho Vitest
- eslint.config.mjs Cấu hình cho ESLint
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
Viết Mã Nguồn TypeScript
Phần tiêu đề “Viết Mã Nguồn TypeScript”Thêm mã TypeScript của bạn vào thư mục src.
Cú Pháp Import ESM
Phần tiêu đề “Cú Pháp Import ESM”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:
import { sayHello } from './hello.js';Export cho Các Dự Án TypeScript Khác
Phần tiêu đề “Export cho Các Dự Án TypeScript Khác”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:
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:
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
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:
pnpm nx syncyarn nx syncnpx nx syncbunx nx syncSau đó, 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.
Dependencies
Phần tiêu đề “Dependencies”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:
pnpm add -w some-npm-packageyarn add some-npm-packagenpm install --legacy-peer-deps some-npm-packagebun install some-npm-packageDependency sau đó có sẵn cho bất kỳ dự án TypeScript nào trong workspace của bạn sử dụng.
Mã Runtime
Phần tiêu đề “Mã Runtime”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:
import { defineConfig } from 'rolldown';
export default defineConfig([ { input: 'src/index.ts', output: { file: '../../dist/packages/my-library/bundle/index.js', format: 'cjs', inlineDynamicImports: true, }, },]);Publish lên NPM
Phần tiêu đề “Publish lên NPM”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, được khuyến nghị là cấu hình Nx Dependency Checks ESLint Plugin để đảm bảo rằng package.json của dự án được publish bao gồm tất cả các dependencies bạn sử dụng trong dự án.
Building
Phần tiêu đề “Building”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:
pnpm nx run <project-name>:buildyarn nx run <project-name>:buildnpx nx run <project-name>:buildbunx nx run <project-name>:buildTrong đó <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
Testing
Phần tiêu đề “Testing”Vitest được cấu hình để test dự án của bạn.
Viết Tests
Phần tiêu đề “Viết Tests”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, test và expect.
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
Chạy Tests
Phần tiêu đề “Chạy Tests”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:
pnpm nx run <project-name>:testyarn nx run <project-name>:testnpx nx run <project-name>:testbunx nx run <project-name>:testBạ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:
pnpm nx run <project-name>:test -t 'sayHello'yarn nx run <project-name>:test -t 'sayHello'npx nx run <project-name>:test -t 'sayHello'bunx nx run <project-name>:test -t 'sayHello'Linting
Phần tiêu đề “Linting”Các dự án TypeScript sử dụng ESLint để linting, cùng với Prettier để formatting.
Chúng tôi khuyên bạn nên cấu hình ESLint trong file eslint.config.mjs ở workspace root, vì các thay đổi đối với file này sẽ á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.
Tương tự, bạn có thể cấu hình Prettier trong file .prettierrc ở root.
Chạy Linter
Phần tiêu đề “Chạy Linter”Để gọi linter kiểm tra dự án của bạn, bạn có thể chạy lint target.
pnpm nx run <project-name>:lintyarn nx run <project-name>:lintnpx nx run <project-name>:lintbunx nx run <project-name>:lintSửa Các Vấn Đề Lint
Phần tiêu đề “Sửa Các Vấn Đề Lint”Phần lớn các vấn đề linting hoặc formatting có thể được sửa tự động. Bạn có thể yêu cầu ESLint sửa các vấn đề lint bằng cách chạy với argument --configuration=fix.
pnpm nx run <project-name>:lint --configuration=fixyarn nx run <project-name>:lint --configuration=fixnpx nx run <project-name>:lint --configuration=fixbunx nx run <project-name>:lint --configuration=fixTươ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:
pnpm nx run-many --target lint --all --configuration=fixyarn nx run-many --target lint --all --configuration=fixnpx nx run-many --target lint --all --configuration=fixbunx nx run-many --target lint --all --configuration=fix