콘텐츠로 이동

TypeScript 프로젝트

TypeScript 프로젝트 생성기는 최신 TypeScript 라이브러리나 애플리케이션을 생성하는 데 사용할 수 있으며, ECMAScript Modules (ESM), TypeScript 프로젝트 참조, 테스트 실행을 위한 Vitest, 린팅 및 포맷팅을 위한 Biome 등 모범 사례가 구성된 상태로 설정됩니다.

새 TypeScript 프로젝트를 두 가지 방법으로 생성할 수 있습니다:

  1. 설치 Nx Console VSCode Plugin 아직 설치하지 않았다면
  2. VSCode에서 Nx 콘솔 열기
  3. 클릭 Generate (UI) "Common Nx Commands" 섹션에서
  4. 검색 @aws/nx-plugin - ts#project
  5. 필수 매개변수 입력
    • 클릭 Generate
    매개변수타입기본값설명
    name 필수string-TypeScript 프로젝트 이름
    directory stringpackages라이브러리가 배치될 상위 디렉토리입니다.
    subDirectory string-라이브러리가 배치될 하위 디렉토리입니다. 기본값은 라이브러리 이름입니다.
    preferInstallDependencies booleantrue생성기 실행 후 의존성 설치를 선호할지 여부입니다. 여러 생성기를 일괄 처리할 때 설치를 연기하려면 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 코드는 src 디렉토리에 추가하세요.

    TypeScript 프로젝트가 ES 모듈이므로, 파일 확장자를 명시적으로 참조하는 ESM 문법으로 임포트 문을 작성해야 합니다:

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

    다른 TypeScript 프로젝트를 위한 내보내기

    섹션 제목: “다른 TypeScript 프로젝트를 위한 내보내기”

    TypeScript 프로젝트의 진입점은 src/index.ts입니다. 다른 프로젝트에서 임포트할 수 있도록 여기에 내보내기를 추가할 수 있습니다:

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

    다른 프로젝트에서 라이브러리 코드 임포트하기

    섹션 제목: “다른 프로젝트에서 라이브러리 코드 임포트하기”

    워크스페이스 tsconfig.base.json에 구성된 TypeScript 별칭을 통해 다른 TypeScript 프로젝트에서 이 프로젝트를 참조할 수 있습니다:

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

    워크스페이스에서 새 프로젝트에 대한 임포트 문을 처음 추가하면 아래와 같은 IDE 오류가 표시될 수 있습니다:

    임포트 오류
    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)

    이는 프로젝트 참조가 아직 설정되지 않았고, 임포트된 프로젝트가 아직 프로젝트의 package.json에 워크스페이스 의존성으로 선언되지 않았기 때문입니다.

    워크스페이스는 두 가지를 모두 관리하는 동기화 생성기로 구성되어 있으므로 수동으로 구성할 필요가 없습니다. 다음 명령어를 실행하면 Nx가 필요한 구성을 추가합니다:

    Terminal window
    pnpm nx sync
    Terminal window
    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.jsontargetDefaults.compile.syncGenerators에서 @aws/nx-plugin:ts#sync를 제거하세요.

    각 TypeScript 프로젝트는 서드파티 런타임 의존성을 자체 package.json에 선언합니다. 프로젝트 간 공유되는 빌드 및 테스트 도구는 루트 package.json에 정의됩니다.

    프로젝트에 런타임 의존성을 추가하려면 해당 프로젝트에 설치하세요:

    Terminal window
    pnpm add some-npm-package --filter my-library

    프로젝트 디렉토리 내에서 패키지 관리자의 일반 add/install 명령어를 실행할 수도 있습니다.

    공유 개발 도구를 추가하려면 워크스페이스 루트에 설치하세요:

    Terminal window
    pnpm add -Dw some-dev-tool

    카탈로그를 지원하는 패키지 관리자(pnpm, yarn, bun)의 경우, 생성기는 각 버전을 카탈로그에 기록하고 catalog: 프로토콜로 참조하므로(예: "zod": "catalog:"), 어떤 프로젝트가 의존성을 선언하든 카탈로그가 버전에 대한 단일 진실 공급원이 됩니다. 이는 단일 버전 정책을 따르는 데 도움이 되며, 타입 충돌과 배포 번들의 중복 패키지를 방지합니다.

    직접 새 의존성을 추가할 때도 카탈로그에 유지하세요:

    워크스페이스가 catalogMode: strict를 설정하므로 pnpm add가 버전을 카탈로그에 기록하고 자동으로 참조합니다 — 추가 단계가 필요 없습니다.

    Terminal window
    pnpm add some-npm-package --filter my-library

    카탈로그는 기본적으로 활성화되어 있습니다. 비활성화하려면 --catalog false 옵션으로 워크스페이스를 생성하세요:

    Terminal window
    pnpm create @aws/nx-workspace my-project --catalog false

    또는 언제든지 aws-nx-plugin.config.mts에서 설정할 수 있습니다:

    aws-nx-plugin.config.mts
    export default {
    packageManager: {
    catalogs: false,
    },
    } satisfies AwsNxPluginConfig;

    카탈로그가 비활성화되면 생성기는 각 프로젝트의 package.json에 의존성 버전을 직접 작성하며, 프로젝트 간 버전 일치는 사용자의 책임입니다.

    루트 package.json에만 모든 의존성을 선언하는 것을 선호하는 경우(프로젝트별 의존성 선언 없음), 워크스페이스 biome.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 파일을 다음과 같이 추가합니다:

    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에 정의됨), 다음 명령어로 실행할 수 있습니다:

    Terminal window
    pnpm nx build <project-name>

    여기서 <project-name>은 프로젝트의 전체 이름입니다.

    build 대상은 프로젝트를 컴파일, 린트 및 테스트합니다.

    빌드 출력 결과는 워크스페이스 루트 dist 폴더 내 패키지 및 대상 디렉토리(예: dist/packages/<my-library>/tsc)에서 확인할 수 있습니다.

    워크스페이스의 모든 프로젝트를 빌드하려면 다음 명령어를 실행하세요:

    Terminal window
    pnpm nx run-many --target build

    또는 단축 명령어를 사용할 수 있습니다:

    Terminal window
    pnpm build

    프로젝트 테스트를 위해 Vitest가 구성되어 있습니다.

    테스트는 프로젝트의 src 폴더에 위치한 .spec.ts 또는 .test.ts 파일에 작성해야 합니다.

    예시:

    • 디렉터리src
      • hello.ts 라이브러리 소스 코드
      • hello.spec.ts hello.ts 테스트

    Vitest는 describe, it, test, expect 등의 유틸리티를 제공하여 Jest와 유사한 문법으로 테스트를 정의할 수 있습니다.

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

    테스트 작성 방법 및 의존성 모킹과 같은 기능에 대한 자세한 내용은 Vitest 문서를 참조하세요.

    테스트는 프로젝트의 build 대상 실행 시 함께 실행되지만, test 대상으로 별도로 실행할 수도 있습니다:

    Terminal window
    pnpm nx test <project-name>

    Vitest의 -t 플래그를 사용하여 개별 테스트 또는 테스트 스위트를 실행할 수 있습니다. Nx가 자체 --target 옵션으로 소비하지 않고 Vitest로 전달하도록 -- 구분자 뒤에 전달하세요:

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

    TypeScript 프로젝트는 린팅 및 포맷팅을 위해 Biome을 사용합니다. Biome은 워크스페이스 루트 biome.json 파일에서 구성되며, 이 파일의 변경 사항은 워크스페이스의 모든 TypeScript 프로젝트에 적용되어 일관성을 유지합니다.

    프로젝트 린트를 확인하려면 lint 대상을 실행하세요:

    Terminal window
    pnpm nx lint <project-name>

    대부분의 린트 또는 포맷팅 문제는 --configuration=fix 인자를 사용하여 자동으로 수정할 수 있습니다:

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

    워크스페이스의 모든 패키지에서 린트 문제를 수정하려면 다음 명령어를 실행하세요:

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

    개발 중 린트 문제로 인한 지연을 방지하려면(특히 자동 수정이 불가능한 문제가 있는 경우) skip-lint 구성으로 빌드를 실행할 수 있습니다:

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

    이렇게 하면 빌드 중에 lint 대상이 완전히 건너뛰어집니다.