콘텐츠로 이동

TypeScript 프로젝트

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

새 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 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.

    생성기는 <directory>/<name> 디렉토리에 다음 프로젝트 구조를 생성합니다:

    • 디렉터리src TypeScript 소스 코드
      • index.ts
    • project.json 프로젝트 구성 및 빌드 대상
    • tsconfig.json 이 프로젝트의 기본 TypeScript 구성 (워크스페이스 루트 tsconfig.base.json 확장)
    • tsconfig.lib.json 라이브러리를 위한 TypeScript 구성 (런타임 또는 패키지된 소스)
    • tsconfig.spec.json 테스트를 위한 TypeScript 구성
    • vite.config.ts Vitest 구성
    • eslint.config.mjs ESLint 구성

    워크스페이스 루트의 다음 파일들에도 일부 변경 사항이 적용됩니다:

    • 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)

    이는 프로젝트 참조가 아직 설정되지 않았기 때문입니다.

    TypeScript 프로젝트는 Nx TypeSync 생성기를 통해 기본적으로 구성되므로 수동으로 프로젝트 참조를 구성할 필요가 없습니다. 다음 명령어를 실행하면 Nx가 필요한 구성을 추가합니다:

    Terminal window
    pnpm nx sync

    이후 IDE의 오류가 사라지고 라이브러리를 사용할 수 있게 됩니다.

    TypeScript 프로젝트에 package.json 파일이 없는 것이 일반적인 TypeScript 모노레포와 다를 수 있습니다.

    모노레포의 TypeScript 패키지에 의존성을 추가하려면 워크스페이스 루트의 package.json에 의존성을 추가하면 됩니다. 패키지 관리자 명령어를 통해 추가할 수 있습니다:

    Terminal window
    pnpm add -w some-npm-package

    이렇게 추가된 의존성은 워크스페이스의 모든 TypeScript 프로젝트에서 사용 가능합니다.

    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 프로젝트를 NPM에 배포하려면 package.json 파일을 생성해야 합니다.

    이 파일은 프로젝트가 참조하는 모든 의존성을 선언해야 합니다. 빌드 시 프로젝트가 워크스페이스 루트 package.json을 통해 설치된 의존성을 확인하므로, Nx Dependency Checks ESLint Plugin을 구성하여 배포된 프로젝트의 package.json에 사용 중인 모든 의존성이 포함되도록 하는 것이 좋습니다.

    TypeScript 프로젝트는 build 대상(target)으로 구성되어 있으며(project.json에 정의됨), 다음 명령어로 실행할 수 있습니다:

    Terminal window
    pnpm nx run <project-name>:build

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

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

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

    프로젝트 테스트를 위해 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 run <project-name>:test

    -t 플래그를 사용하여 개별 테스트 또는 테스트 스위트를 실행할 수 있습니다:

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

    TypeScript 프로젝트는 린팅을 위해 ESLint, 포맷팅을 위해 Prettier를 사용합니다.

    워크스페이스 루트 eslint.config.mjs 파일에서 ESLint를 구성하는 것을 권장합니다. 이 파일의 변경 사항은 워크스페이스의 모든 TypeScript 프로젝트에 적용되어 일관성을 유지합니다.

    마찬가지로 Prettier는 루트 .prettierrc 파일에서 구성할 수 있습니다.

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

    Terminal window
    pnpm nx run <project-name>:lint

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

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

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

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