Typescript에서 NPM 모듈 작성


103

저는 첫 번째 NPM 모듈을 작업하고 있습니다. 이전에 typescript로 간단히 작업했는데 큰 문제는 많은 모듈에서 사용할 수있는 정의 파일이 없다는 것입니다. 그래서 제 모듈을 타이프 스크립트로 작성하는 것이 좋은 생각이라고 생각했습니다.

그러나이를 수행하는 가장 좋은 방법에 대한 정보를 찾을 수 없습니다. 나는 사람들이 자바 스크립트 파일을 게시하는 것을 제안하는 이 관련 질문 " 나는 커피 스크립트에 npm 패키지를 작성할 수 있습니까? "를 발견했습니다 . 그러나 coffeescript 파일과 달리 typescript 파일은 typescript 응용 프로그램 내에서 사용되는 경우 실제로 유용 할 수 있습니다.

NPM 모듈을 게시 할 때 Typescript 파일을 포함해야합니까? 아니면 javascript 파일 만 게시하고 생성 된 .d.ts 파일을 DefinitelyTyped에 제공해야합니까?


2
유용한 정보 : npm에 게시하기 전에 CJS 및 ESM 대상과 함께 유형 정의를 내보내 도록 TS 프로젝트를 설정하는 과정을 안내 하는 블로그 게시물 과 함께 프로젝트 copee를 작성했습니다 . 이렇게하면 node.js 및 브라우저 사용을 극대화 할 수 있습니다.
styfle 2017-10-20

답변:


84

다음은 TypeScript로 작성된 샘플 Node 모듈입니다. https://github.com/basarat/ts-npm-module

다음은이 샘플 모듈을 사용하는 샘플 TypeScript 프로젝트입니다. https://github.com/basarat/ts-npm-module-consume

기본적으로 다음이 필요합니다.

  • commonjsand로 컴파일declaration:true
  • .d.ts파일 생성

그리고

  • 귀하의 IDE가 생성 된 .d.ts.

Atom-TypeScript는 이에 대한 멋진 워크 플로우를 제공합니다 : https://github.com/TypeStrong/atom-typescript#packagejson-support


Atom-TypeScript 앵커 링크를 업데이트해야합니다 (앵커가 더 이상 유효하지 않음).
Fidan Hakaj

@basarat, ts-npm-module에서 "version": "1.5.0-alpha"를 사용하고 있습니다. 나는 이것이 당신이 트랜스 파일하는 Typescript의 버전이라고 가정합니다. 이것을 생략하는 것이 중요합니까? (Atom 플러그인에 의해 자동으로 수행되지 않습니다). 버전이 사용되는 경우 다른 사용자가 정확한 버전을 사용하여 트랜스 파일해야합니까 (또는 최신 버전 만)? (또는 어쩌면 tsconfig.json의 버전입니까?)
저스틴

다른 라이브러리에 의존하는 모듈에 대한 사용 사례가 있습니까? 중복 정의 문제를 방지하려면을 구성해야 tsconfig.json하지만 제 생각에는 너무 수동적 인 것 같습니다.
Sérgio Michels

1
2016 년 4 분기에도이 접근 방식을 옹호 하시겠습니까?
SuperUberDuper


78

TypeScript 3.x 또는 TypeScript 2.x에서 다음 단계는 TypeScript로 라이브러리 (npm 패키지)를 만들기 위해 수행해야하는 작업을 설명합니다.

  • 평소와 같이 프로젝트를 만듭니다 (테스트 및 모든 항목 포함).
  • 입력 을 생성 declaration: true하려면 tsconfig.json에 추가하십시오 .
  • API를 통해 index.ts
  • 에서 package.json생성 된 입력을 가리 킵니다. 귀하의 경우 예를 들어 outDirIS dist, 다음 추가 "types": "dist/index.d.ts"패키지를 JSON으로.
  • 에서 package.json기본 항목 파일을 가리 킵니다. 예를 들어 귀하의 경우 outDirIS dist및 주요 항목 파일은 index.js다음 추가 "main": "dist/index.js"하여 package.json에.
  • .npmignore불필요한 파일 (예 : 소스)을 무시하려면를 만듭니다 .
  • .NET을 사용하여 npm에 게시합니다 npm publish. 업데이트를 위해 semver 사양 사용 (패치 / 버그 수정 npm version patch, 비 중단 추가 npm version minor, API 변경 npm version major)

그것은 나에게 (이 페이지의 일 ... 등) 인터넷에서이 주제에 대한 모든 오래된 자원을 통해 선별하는 동안을 가지고 있기 때문에 나는 그것을 마무리하기로 결정 방법 - 투 - 쓰기 - 어 - 타이프 라이터 라이브러리 와 최신 작업 최소 예.


소스 제어에 js를 확인해야합니까? 아니면 npm이 자체 코드 버전을 유지합니까?
Olian04 2014 년

1
Olian04 당신이 만드는에게 @ .npmignore합니다 (게시 할 때 무시할 파일 NPM 말할 수 파일 .ts파일)과는 .gitignore무시 할 파일을 자식 (말 dist/)
Purag

@ Olian04 아니요, 생성 된 JS 파일을 커밋 할 필요가 없으며 IMO도 커밋해서는 안됩니다. 그것들은 프로젝트 소스의 일부가 아닙니다.
Josh M.

59

이것은 TypeScript 1.8.10을 사용하는 최신 답변입니다.

내 프로젝트 구조는 다음과 같습니다.

|
|--- src
|--- test
|--- dist     <= My gulp file compiles and places the js, sourcemaps and .d.ts files here
|      |--- src
|      |--- test
|--- typings
.gitignore
.npmignore
gulpfile.js
package.json
README.md
tsconfig.json
tslint.json
typings.json

.npmignore불필요한 파일을 포함하지 않고 패키지를 가져 와서 작동하도록 최소한으로 유지하기 위해 다음을 추가 했습니다.

node_modules/
*.log
*.tgz

src/
test/
gulpfile.js
tsconfig.json
tslint.json
typings.json
typings
dist/test

.gitignore보유 :

typings

# ignore .js.map files
*.js.map
*.js
dist

package.json보유 :

"main": "dist/src/index.js",
"typings":  "dist/src/index.d.ts",

이제 실행합니다. npm pack

결과 파일 (압축을 푼 경우)은 다음 구조를 갖습니다.

|
|--- dist
|       |--- src
|              |
|              index.js
|              index.js.map
|              index.d.ts
|
package.json
README.md

이제 이것을 라이브러리로 사용하려는 프로젝트로 이동하여 다음을 입력합니다. npm install ./project-1.0.0.tgz

성공적으로 설치됩니다.

이제 index.tsnpm을 설치 한 프로젝트에서 파일 을 만듭니다. import Project = require("project");

타이핑 Project.은이 전체 연습의 요점 인 Intellisense 옵션을 제공합니다.

이것이 다른 누군가가 더 큰 프로젝트의 내부 라이브러리로 TypeScript npm 프로젝트를 사용하는 데 도움이되기를 바랍니다.

추신 : 다른 프로젝트에서 사용할 수있는 npm 모듈로 프로젝트를 컴파일하는 이러한 접근 방식이 세계 의 것을 연상 시킨다고 생각 .dll합니다 .NET. 각 프로젝트가 npm 패키지를 생성하여 솔루션의 다른 프로젝트에서 종속성으로 사용할 수있는 VS Code의 솔루션으로 구성되는 프로젝트를 상상할 수 있습니다.

이것을 알아내는 데 상당한 시간이 걸렸기 때문에 누군가가 여기에 갇힐 경우를 대비하여 게시했습니다.

또한 닫힌 버그에 대해 https://github.com/npm/npm/issues/11546에 게시했습니다.


이 예제는 Github에 업로드되었습니다 : vchatterji / tsc-seed


github에 예제를 업로드 할 수 있습니까? 그것은 많은 도움이 될 것입니다! :)
Han Che

3
예는 Github에서 업로드되었습니다 github.com/vchatterji/tsc-seed
하기 Varun Chatterji을

타이프 스크립트가 아닌 프로젝트에서도 어떻게 사용할 수 있습니까?
SuperUberDuper

5

유형 정의 대신 원본 typescript 소스를 게시해야합니다. 에서 package.json* .TS 파일에 '유형'속성 포인트를 보자.

*.d.ts 기존 JS 라이브러리에 주석을 추가하는 것은 좋지만 소비자로서 저는 유형 정의와 하위 수준의 생성 된 JS 코드 사이를 전환하는 것보다 유형 스크립트 코드를 읽는 것이 좋습니다.


1
TypeScript 컴파일러는 지금까지 적합하지 않은 것 같습니다. 이 문제를 참조하십시오 github.com/Microsoft/TypeScript/issues/14479
Sven Efftinge

2
현재 포함 *.d.ts하는 것이 권장되는 방법이지만 *.ts파일 을 포함하는 이점에 동의하지만 typescriptlang.org/docs/handbook/declaration-files/…
Tim

5

나는 주로 Varun Chatterji 의 제안을 따릅니다.

그러나, 내가 단위 테스트 및 코드 검사 및로 게시와 완벽한 예를 보여 드리고자 npm및 사용하여 가져 오기 javascript또는typescript

이 모듈은 다음을 사용하여 작성 되었으며 npm에 게시하기 전에 코드를 컴파일 typescript 2.2하도록 prepublish후크를 구성하는 것이 중요합니다.tsc

https://github.com/sweetim/haversine-position

https://www.npmjs.com/package/haversine-position


1
매우 유용한 예입니다. 공유해 주셔서 감사합니다! 나는 현재 이러한 방식으로 패키지를 만드는 방법을 이해하려고 노력하고 있습니다.
Jeffrey Westerkamp

1
2017 년 7 월 현재, 이것이 제가 만난 최고의 프로젝트 구조입니다. Tim과 Varun Chatterji에게 감사합니다
adgang

3

autodts 를 사용 .d.ts하여 Atom IDE의 지원 없이도 npm의 파일 배포 및 사용을 처리 할 수 있습니다 .

autodts generate 당신의 모든 것을 묶을 것입니다 .d.tsnpm에 게시하기 위해 파일을 함께autodts link 설치된 다른 패키지에 대한 참조를 처리합니다. 이는 node_modules여러 하위 패키지로 분할 된 더 큰 프로젝트에서 항상 바로 아래 에 있지 않을 수 있습니다 .

두 명령 모두 설정을 읽습니다. package.jsontsconfig.json"규칙 구성을 통해"스타일.

거기에 다른 답변 유래에와 블로그 게시물 자세한 정보와 함께.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.