Viết mô-đun NPM trong Typecript


103

Tôi đang làm việc trên mô-đun NPM đầu tiên của mình. Trước đây, tôi đã làm việc với bảng chữ và một vấn đề lớn là đối với nhiều mô-đun, không có sẵn tệp định nghĩa. Vì vậy, tôi nghĩ rằng sẽ là một ý tưởng hay nếu viết mô-đun của tôi trong bảng chữ.

Tuy nhiên, tôi không thể tìm thấy bất kỳ thông tin nào về cách tốt nhất để làm điều đó. Tôi đã tìm thấy câu hỏi liên quan này " Tôi có thể viết gói npm trong coffeescript không? ", Nơi mọi người đề xuất chỉ xuất bản các tệp javascript. Nhưng trái ngược với các tệp coffeescript, các tệp typecript có thể thực sự hữu ích nếu chúng được sử dụng trong ứng dụng sắp chữ.

Tôi có nên bao gồm các tệp Typecript khi xuất bản mô-đun NPM hay tôi chỉ nên xuất bản các tệp javascript và cung cấp các tệp .d.ts đã tạo cho chắc chắnTyped?


2
Ghi chú hữu ích: Tôi đã viết dự án, copee , cùng với một bài viết trên blog để hướng dẫn bạn thông qua việc thiết lập một dự án TS để định nghĩa kiểu Emit cùng với mục tiêu CJS và ESM trước khi xuất bản để NPM. Điều này sẽ tối đa hóa việc sử dụng với node.js và các trình duyệt trong tương lai.
súng trường vào

Câu trả lời:


84

Đây là mô-đun Node mẫu được viết bằng TypeScript: https://github.com/basarat/ts-npm-module

Đây là một dự án TypeScript mẫu sử dụng mô-đun mẫu này https://github.com/basarat/ts-npm-module-consume

Về cơ bản bạn cần:

  • biên dịch với commonjsdeclaration:true
  • tạo một .d.tstập tin

Và sau đó

  • Yêu cầu lý tưởng của bạn đọc được tạo ra .d.ts.

Atom-TypeScript chỉ cung cấp một quy trình làm việc tốt về vấn đề này: https://github.com/TypeStrong/atom-typescript#packagejson-support


Liên kết neo Atom-TypeScript cần được cập nhật (liên kết neo không còn hợp lệ nữa).
Fidan Hakaj

@basarat, trong ts-npm-module bạn đang sử dụng "phiên bản": "1.5.0-alpha". Tôi cho rằng đây là phiên bản của Typecript mà bạn đang chuyển ngữ. Có vấn đề gì khi bỏ cái này ra không? (nó không được thực hiện tự động bởi plugin Atom). Nếu một phiên bản được sử dụng, điều này có yêu cầu người dùng khác sử dụng phiên bản chính xác để chuyển tải (hoặc chỉ những phiên bản mới hơn) không? (hoặc có thể đó là phiên bản của tsconfig.json?)
Justin

Bạn có bất kỳ trường hợp sử dụng nào với các mô-đun phụ thuộc vào các thư viện khác không? Để tránh vấn đề định nghĩa trùng lặp, bạn cần phải cấu hình tsconfig.json, nhưng điều này có vẻ quá thủ công theo quan điểm của tôi.
Sérgio Michels

1
bạn có còn ủng hộ cách tiếp cận này trong quý 4 năm 2016 không?
SuperUberDuper

7
Đây là một cách thực hiện hay - tsmean.com/articles/how-to-write-a-typescript-library
chrismarx

78

Với TypeScript 3.x hoặc TypeScript 2.x, các bước sau mô tả những gì bạn phải làm để tạo một thư viện (gói npm) với TypeScript:

  • Tạo dự án của bạn như bình thường (với các thử nghiệm và mọi thứ)
  • Thêm declaration: truevào tsconfig.jsonđể tạo kiểu chữ.
  • Xuất API thông qua một index.ts
  • Trong phần package.json, hãy trỏ đến các kiểu chữ đã tạo của bạn. Ví dụ nếu bạn outDirdist , sau đó thêm "types": "dist/index.d.ts"vào gói json của bạn.
  • Trong package.json, trỏ đến tệp mục nhập chính của bạn. Ví dụ: nếu outDirlà của bạn distvà tệp mục nhập chính là index.js, thì hãy thêm "main": "dist/index.js"vào package.json của bạn.
  • Tạo một .npmignoređể bỏ qua các tệp không cần thiết (ví dụ: nguồn).
  • Xuất bản lên npm với npm publish. Sử dụng thông số kỹ thuật của semver cho các bản cập nhật (bản vá / sửa lỗi npm version patch, bổ sung không vi phạm npm version minor, thay đổi api vi phạm npm version major)

Vì tôi đã phải mất một thời gian để sàng lọc tất cả các tài nguyên lỗi thời về chủ đề này trên internet (như tài nguyên trên trang này ...), tôi quyết định gói gọn nó trong thư viện how-to-write-a-typecript-library với một cập nhật ví dụ làm việc tối thiểu.


Tôi sẽ phải kiểm tra js trong kiểm soát nguồn? Hay npm có giữ phiên bản mã của riêng nó không?
Olian04 14/09/17

1
@ Olian04 Bạn nói tạo ra một .npmignoretập tin để nói NPM những file nào để bỏ qua khi xuất bản (các .tsfile) và .gitignorenói với git những file nào để bỏ qua ( dist/)
Purag

@ Olian04 không, bạn không cần (và IMO không nên) cam kết / s tệp JS đã tạo. Đó không phải là một phần của nguồn dự án.
Josh M.

59

Đây là câu trả lời gần đây hơn bằng cách sử dụng TypeScript 1.8.10:

Cấu trúc dự án của tôi là:

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

Tôi đã thêm những thứ sau vào .npmignoređể tránh bao gồm các tệp không liên quan và giữ mức tối thiểu để gói được nhập và hoạt động:

node_modules/
*.log
*.tgz

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

Của tôi .gitignorecó:

typings

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

Của tôi package.jsoncó:

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

Bây giờ tôi chạy: npm pack

Tệp kết quả (khi được giải nén) có cấu trúc như sau:

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

Bây giờ tôi đi đến dự án nơi tôi muốn sử dụng nó làm thư viện và nhập: npm install ./project-1.0.0.tgz

Nó cài đặt thành công.

Bây giờ tôi tạo một tệp index.tstrong dự án của mình, nơi tôi vừa cài đặt npm import Project = require("project");

Đánh máy Project. cung cấp cho tôi các tùy chọn Intellisense, đó là điểm của toàn bộ bài tập này.

Hy vọng điều này sẽ giúp ai đó sử dụng các dự án TypeScript npm của họ làm thư viện nội bộ trong các dự án lớn hơn của họ.

PS: Tôi tin rằng phương pháp này biên soạn dự án module NPM có thể được sử dụng trong các dự án khác là gợi nhớ của .dlltrong.NET thế giới. Tôi cũng có thể tưởng tượng các dự án được tổ chức trong Giải pháp trong VS Code nơi mỗi dự án tạo ra một gói npm sau đó có thể được sử dụng trong một dự án khác trong giải pháp như một phần phụ thuộc.

Vì phải mất một khoảng thời gian kha khá để tôi tìm ra điều này, tôi đã đăng nó để phòng trường hợp ai đó bị mắc kẹt ở đây.

Tôi cũng đã đăng nó cho một lỗi đóng cửa tại: https://github.com/npm/npm/issues/11546


Ví dụ này đã được tải lên Github: vchatterji / tsc-seed


bạn có thể tải lên một ví dụ trên github không? Điều đó sẽ giúp ích rất nhiều! :)
Han Che

3
Ví dụ đã được tải lên Github: github.com/vchatterji/tsc-seed
Varun Chatterji

Làm thế nào nó cũng có thể được sử dụng trong các dự án không đánh chữ?
SuperUberDuper

5

Bạn nên xuất bản các nguồn phiên bản gốc thay vì định nghĩa loại. Để package.jsonthuộc tính 'type' trỏ đến tệp * .ts.

*.d.ts rất tốt để chú thích các lib JS hiện có, nhưng với tư cách là người tiêu dùng, tôi muốn đọc mã sắp chữ hơn là chuyển đổi giữa các định nghĩa kiểu và mã JS được tạo ở mức thấp hơn.


1
Trình biên dịch TypeScript dường như không phù hợp với điều đó cho đến nay. Thấy vấn đề này github.com/Microsoft/TypeScript/issues/14479
Sven Efftinge

2
hiện tại bao gồm *.d.tslà cách được khuyến nghị để làm như vậy, mặc dù tôi đồng ý với bạn những lợi ích khi bao gồm *.tstệp, stylescriptlang.org/docs/handbook/decosystem-files/…
Tim

5

Tôi chủ yếu làm theo gợi ý của Varun Chatterji

Tuy nhiên, tôi muốn hiển thị một ví dụ hoàn chỉnh với kiểm tra đơn vị và phạm vi mã và xuất bản nó vào npmvà nhập chúng bằng cách sử dụng javascripthoặctypescript

Mô-đun này được viết bằng cách sử dụng typescript 2.2và điều quan trọng là phải định cấu hình prepublishhook để biên dịch mã bằng cách sử dụng tsctrước khi xuất bản nó lên npm

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

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


1
Đó là một ví dụ rất hữu ích, cảm ơn vì đã chia sẻ! Tôi hiện cũng đang cố gắng tạo ra các gói theo cách này.
Jeffrey Westerkamp

1
Tính đến tháng 7 năm 2017, đây là cấu trúc dự án tốt nhất mà tôi đã xem qua. Nhờ Tim và Varun Chatterji
adgang

3

Bạn cũng có thể sử dụng autodts để xử lý việc phân phối và sử dụng .d.tscác tệp từ npm mà không cần hỗ trợ từ Atom IDE.

autodts generatesẽ nhóm tất cả các .d.tstệp của riêng bạn lại với nhau để xuất bản trên npm và autodts linkxử lý các tham chiếu đến các gói đã cài đặt khác, có thể không phải lúc nào cũng nằm ngay node_modulestrong một dự án lớn hơn được chia thành nhiều gói con.

Cả hai lệnh đều đọc cài đặt của chúng từ package.jsontsconfig.jsontheo kiểu "quy ước trên cấu hình".

một câu trả lời khác về stackoverflow và một bài đăng trên blog với nhiều chi tiết hơn.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.