TypeScript 프로젝트
TypeScript 프로젝트 생성기는 최신 TypeScript 라이브러리나 애플리케이션을 생성하는 데 사용할 수 있으며, ECMAScript Modules (ESM), TypeScript 프로젝트 참조, 테스트 실행을 위한 Vitest, 린팅 및 포맷팅을 위한 Biome 등 모범 사례가 구성된 상태로 설정됩니다.
사용 방법
섹션 제목: “사용 방법”TypeScript 프로젝트 생성
섹션 제목: “TypeScript 프로젝트 생성”새 TypeScript 프로젝트를 두 가지 방법으로 생성할 수 있습니다:
- 설치 Nx Console VSCode Plugin 아직 설치하지 않았다면
- VSCode에서 Nx 콘솔 열기
- 클릭
Generate (UI)"Common Nx Commands" 섹션에서 - 검색
@aws/nx-plugin - ts#project - 필수 매개변수 입력
- 클릭
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#project| 매개변수 | 타입 | 기본값 | 설명 |
|---|---|---|---|
| name 필수 | string | - | TypeScript 프로젝트 이름 |
| directory | string | packages | 라이브러리가 배치될 상위 디렉토리입니다. |
| subDirectory | string | - | 라이브러리가 배치될 하위 디렉토리입니다. 기본값은 라이브러리 이름입니다. |
| preferInstallDependencies | boolean | true | 생성기 실행 후 의존성 설치를 선호할지 여부입니다. 여러 생성기를 일괄 처리할 때 설치를 연기하려면 false로 설정하세요 (후속 생성기가 Nx 프로젝트 그래프를 계산할 수 있도록 필요한 경우 설치는 여전히 실행됩니다); 마지막에 한 번만 설치합니다. |
생성기 출력 결과
섹션 제목: “생성기 출력 결과”생성기는 <directory>/<name> 디렉토리에 다음 프로젝트 구조를 생성합니다:
디렉터리src TypeScript 소스 코드
- index.ts
- package.json 프로젝트의 패키지 이름과 의존성을 정의하는 프로젝트 매니페스트
- project.json 프로젝트 구성 및 빌드 대상
- tsconfig.json 이 프로젝트의 기본 TypeScript 구성 (워크스페이스 루트 tsconfig.base.json 확장)
- tsconfig.lib.json 라이브러리를 위한 TypeScript 구성 (런타임 또는 패키지된 소스)
- tsconfig.spec.json 테스트를 위한 TypeScript 구성
- vitest.config.mts Vitest 구성
워크스페이스 루트의 다음 파일들에도 일부 변경 사항이 적용됩니다:
- nx.json Nx 구성이 업데이트되어 프로젝트에 @nx/js/typescript 플러그인이 구성됨
- tsconfig.base.json 워크스페이스 내 다른 프로젝트에서 이 프로젝트를 임포트할 수 있도록 TypeScript 별칭이 설정됨
- tsconfig.json 프로젝트에 대한 TypeScript 프로젝트 참조가 추가됨
TypeScript 소스 코드 작성
섹션 제목: “TypeScript 소스 코드 작성”TypeScript 코드는 src 디렉토리에 추가하세요.
ESM 임포트 문법
섹션 제목: “ESM 임포트 문법”TypeScript 프로젝트가 ES 모듈이므로, 파일 확장자를 명시적으로 참조하는 ESM 문법으로 임포트 문을 작성해야 합니다:
import { sayHello } from './hello.js';다른 TypeScript 프로젝트를 위한 내보내기
섹션 제목: “다른 TypeScript 프로젝트를 위한 내보내기”TypeScript 프로젝트의 진입점은 src/index.ts입니다. 다른 프로젝트에서 임포트할 수 있도록 여기에 내보내기를 추가할 수 있습니다:
export { sayHello } from './hello.js';export * from './algorithms/index.js';다른 프로젝트에서 라이브러리 코드 임포트하기
섹션 제목: “다른 프로젝트에서 라이브러리 코드 임포트하기”워크스페이스 tsconfig.base.json에 구성된 TypeScript 별칭을 통해 다른 TypeScript 프로젝트에서 이 프로젝트를 참조할 수 있습니다:
import { sayHello } from '@my-scope/my-library';워크스페이스에서 새 프로젝트에 대한 임포트 문을 처음 추가하면 아래와 같은 IDE 오류가 표시될 수 있습니다:
임포트 오류
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)이는 프로젝트 참조가 아직 설정되지 않았고, 임포트된 프로젝트가 아직 프로젝트의 package.json에 워크스페이스 의존성으로 선언되지 않았기 때문입니다.
워크스페이스는 두 가지를 모두 관리하는 동기화 생성기로 구성되어 있으므로 수동으로 구성할 필요가 없습니다. 다음 명령어를 실행하면 Nx가 필요한 구성을 추가합니다:
pnpm nx syncyarn nx syncnpx nx syncbunx nx sync NX The workspace is out of sync
[@nx/js:typescript-sync]: Some TypeScript configuration files are missing project references to the projects they depend on, contain stale project references, or have duplicate project references.[@aws/nx-plugin:ts#sync]: Local project dependencies are out of sync. The following workspace dependencies will be declared:packages/my-other-project/package.json:- @my-scope/my-library: workspace:*
Syncing the workspace...The workspace was synced successfully!Nx의 TypeScript 동기화 생성기는 프로젝트 참조를 추가하고, 플러그인의 ts#sync 생성기는 임포트된 프로젝트를 프로젝트의 package.json에 선언합니다(패키지 관리자가 워크스페이스 프로토콜을 지원하는 경우 workspace:*, npm과 yarn classic에서는 *). 이렇게 하면 패키지 관리자가 설치 시 로컬 프로젝트를 링크합니다. 이후 IDE의 오류가 사라지고 라이브러리를 사용할 수 있게 됩니다.
경로 별칭 동기화 유지
섹션 제목: “경로 별칭 동기화 유지”프로젝트의 tsconfig.json에 사용자 정의 compilerOptions.paths 항목을 추가하면, TypeScript는 tsconfig.base.json에 정의된 워크스페이스 별칭 상속을 중단합니다. 숨겨진 ts#sync 생성기는 compile 대상 실행 전(nx.json에 구성됨)에 실행되어 이미 paths를 선언하고 있는 tsconfig.json, tsconfig.lib.json, tsconfig.app.json 파일에 누락된 기본 별칭을 복사합니다. 이를 비활성화하려면 nx.json의 targetDefaults.compile.syncGenerators에서 @aws/nx-plugin:ts#sync를 제거하세요.
의존성
섹션 제목: “의존성”각 TypeScript 프로젝트는 서드파티 런타임 의존성을 자체 package.json에 선언합니다. 프로젝트 간 공유되는 빌드 및 테스트 도구는 루트 package.json에 정의됩니다.
프로젝트에 런타임 의존성을 추가하려면 해당 프로젝트에 설치하세요:
pnpm add some-npm-package --filter my-libraryyarn workspace @my-scope/my-library add some-npm-packagenpm install --legacy-peer-deps some-npm-package -w packages/my-librarybun add some-npm-package --cwd packages/my-library프로젝트 디렉토리 내에서 패키지 관리자의 일반 add/install 명령어를 실행할 수도 있습니다.
공유 개발 도구를 추가하려면 워크스페이스 루트에 설치하세요:
pnpm add -Dw some-dev-toolyarn add -D some-dev-toolnpm install --legacy-peer-deps -D some-dev-toolbun add -D some-dev-tool카탈로그
섹션 제목: “카탈로그”카탈로그를 지원하는 패키지 관리자(pnpm, yarn, bun)의 경우, 생성기는 각 버전을 카탈로그에 기록하고 catalog: 프로토콜로 참조하므로(예: "zod": "catalog:"), 어떤 프로젝트가 의존성을 선언하든 카탈로그가 버전에 대한 단일 진실 공급원이 됩니다. 이는 단일 버전 정책을 따르는 데 도움이 되며, 타입 충돌과 배포 번들의 중복 패키지를 방지합니다.
직접 새 의존성을 추가할 때도 카탈로그에 유지하세요:
워크스페이스가 catalogMode: strict를 설정하므로 pnpm add가 버전을 카탈로그에 기록하고 자동으로 참조합니다 — 추가 단계가 필요 없습니다.
pnpm add some-npm-package --filter my-libraryyarn의 catalog: 프로토콜은 기존 카탈로그 항목만 참조할 수 있고 새로 생성할 수는 없으므로 먼저 버전을 기록하세요.
-
.yarnrc.yml의catalog아래에 버전을 추가합니다:.yarnrc.yml catalog:some-npm-package: ^1.0.0 -
프로젝트에서 참조합니다:
Terminal window yarn workspace @my-scope/my-library add some-npm-package@catalog:
bun의 catalog: 프로토콜은 기존 카탈로그 항목만 참조할 수 있고 새로 생성할 수는 없으므로 먼저 버전을 기록하세요.
-
루트
package.json의catalog아래에 버전을 추가합니다:package.json {"catalog": {"some-npm-package": "^1.0.0"}} -
프로젝트에서 참조합니다:
Terminal window bun add some-npm-package@catalog: --cwd packages/my-library
카탈로그 비활성화
섹션 제목: “카탈로그 비활성화”카탈로그는 기본적으로 활성화되어 있습니다. 비활성화하려면 --catalog false 옵션으로 워크스페이스를 생성하세요:
pnpm create @aws/nx-workspace my-project --catalog falseyarn create @aws/nx-workspace my-project --catalog falsenpm create @aws/nx-workspace -- my-project --catalog falsebun create @aws/nx-workspace my-project --catalog false또는 언제든지 aws-nx-plugin.config.mts에서 설정할 수 있습니다:
export default { packageManager: { catalogs: false, },} satisfies AwsNxPluginConfig;카탈로그가 비활성화되면 생성기는 각 프로젝트의 package.json에 의존성 버전을 직접 작성하며, 프로젝트 간 버전 일치는 사용자의 책임입니다.
루트에 모든 의존성 선언하기
섹션 제목: “루트에 모든 의존성 선언하기”루트 package.json에만 모든 의존성을 선언하는 것을 선호하는 경우(프로젝트별 의존성 선언 없음), 워크스페이스 biome.json에서 린트 규칙을 비활성화하세요:
{ "linter": { "rules": { "correctness": { "noUndeclaredDependencies": "off" } } }}프로젝트는 빌드 시 루트에 설치된 패키지를 해석하므로 모든 것이 여전히 빌드됩니다 — 각 프로젝트의 의존성에 대한 정확한 기록으로서의 프로젝트별 매니페스트를 포기하게 됩니다(나중에 프로젝트를 배포하거나 저장소를 분할하는 경우 중요합니다).
런타임 코드
섹션 제목: “런타임 코드”TypeScript 프로젝트를 런타임 코드(예: AWS Lambda 함수 핸들러)로 사용할 때는 Rolldown과 같은 도구를 사용하여 프로젝트를 번들링하는 것이 좋습니다. 이는 트리 셰이킹을 통해 실제로 참조되는 의존성만 포함되도록 보장합니다.
project.json 파일에 다음 대상(target)을 추가하여 이를 구현할 수 있습니다:
{ ... "targets": { ... "bundle": { "cache": true, "executor": "nx:run-commands", "outputs": ["{workspaceRoot}/dist/packages/my-library/bundle"], "options": { "command": "rolldown -c rolldown.config.ts" } }, },}그리고 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, }, },]);TypeScript 프로젝트는 build 대상(target)으로 구성되어 있으며(project.json에 정의됨), 다음 명령어로 실행할 수 있습니다:
pnpm nx build <project-name>yarn nx build <project-name>npx nx build <project-name>bunx nx build <project-name>여기서 <project-name>은 프로젝트의 전체 이름입니다.
build 대상은 프로젝트를 컴파일, 린트 및 테스트합니다.
빌드 출력 결과는 워크스페이스 루트 dist 폴더 내 패키지 및 대상 디렉토리(예: dist/packages/<my-library>/tsc)에서 확인할 수 있습니다.
워크스페이스의 모든 프로젝트를 빌드하려면 다음 명령어를 실행하세요:
pnpm nx run-many --target buildyarn nx run-many --target buildnpx nx run-many --target buildbunx nx run-many --target build또는 단축 명령어를 사용할 수 있습니다:
pnpm buildyarn buildnpm run buildbun build테스트
섹션 제목: “테스트”프로젝트 테스트를 위해 Vitest가 구성되어 있습니다.
테스트 작성
섹션 제목: “테스트 작성”테스트는 프로젝트의 src 폴더에 위치한 .spec.ts 또는 .test.ts 파일에 작성해야 합니다.
예시:
디렉터리src
- hello.ts 라이브러리 소스 코드
- hello.spec.ts hello.ts 테스트
Vitest는 describe, it, test, expect 등의 유틸리티를 제공하여 Jest와 유사한 문법으로 테스트를 정의할 수 있습니다.
import { sayHello } from './hello.js';
describe('sayHello', () => {
it('should greet the caller', () => { expect(sayHello('Darth Vader')).toBe('Hello, Darth Vader!'); });
});테스트 작성 방법 및 의존성 모킹과 같은 기능에 대한 자세한 내용은 Vitest 문서를 참조하세요.
테스트 실행
섹션 제목: “테스트 실행”테스트는 프로젝트의 build 대상 실행 시 함께 실행되지만, test 대상으로 별도로 실행할 수도 있습니다:
pnpm nx test <project-name>yarn nx test <project-name>npx nx test <project-name>bunx nx test <project-name>Vitest의 -t 플래그를 사용하여 개별 테스트 또는 테스트 스위트를 실행할 수 있습니다. Nx가 자체 --target 옵션으로 소비하지 않고 Vitest로 전달하도록 -- 구분자 뒤에 전달하세요:
pnpm nx test <project-name> -- -t 'sayHello'yarn nx test <project-name> -- -t 'sayHello'npx nx test <project-name> -- -t 'sayHello'bunx nx test <project-name> -- -t 'sayHello'TypeScript 프로젝트는 린팅 및 포맷팅을 위해 Biome을 사용합니다. Biome은 워크스페이스 루트 biome.json 파일에서 구성되며, 이 파일의 변경 사항은 워크스페이스의 모든 TypeScript 프로젝트에 적용되어 일관성을 유지합니다.
린터 실행
섹션 제목: “린터 실행”프로젝트 린트를 확인하려면 lint 대상을 실행하세요:
pnpm nx lint <project-name>yarn nx lint <project-name>npx nx lint <project-name>bunx nx lint <project-name>린트 문제 수정
섹션 제목: “린트 문제 수정”대부분의 린트 또는 포맷팅 문제는 --configuration=fix 인자를 사용하여 자동으로 수정할 수 있습니다:
pnpm nx lint <project-name> --configuration=fixyarn nx lint <project-name> --configuration=fixnpx nx lint <project-name> --configuration=fixbunx nx lint <project-name> --configuration=fix워크스페이스의 모든 패키지에서 린트 문제를 수정하려면 다음 명령어를 실행하세요:
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린트 문제 건너뛰기
섹션 제목: “린트 문제 건너뛰기”개발 중 린트 문제로 인한 지연을 방지하려면(특히 자동 수정이 불가능한 문제가 있는 경우) skip-lint 구성으로 빌드를 실행할 수 있습니다:
pnpm nx run-many --target build --configuration=skip-lintyarn nx run-many --target build --configuration=skip-lintnpx nx run-many --target build --configuration=skip-lintbunx nx run-many --target build --configuration=skip-lint이렇게 하면 빌드 중에 lint 대상이 완전히 건너뛰어집니다.