用Typescript编写NPM模块


103

我正在开发我的第一个NPM模块。之前,我曾短暂地使用过Typescript,但一个大问题是,对于许多模块,都没有可用的定义文件。所以我认为用TypeScript编写模块是一个好主意。

但是,我找不到有关最佳方法的任何信息。我发现了一个相关的问题“ 我可以在coffeescript中编写npm包吗? ”,人们建议只发布javascript文件。但是与coffeescript文件相比,如果在打字稿应用程序中使用打字稿文件,它们实际上可能会很有用。

发布NPM模块时应该包含Typescript文件,还是仅发布javascript文件并将生成的.d.ts文件提供给DefinitelyTyped?


2
有用的注释:我编写了项目copee,同时还写了一篇博客文章,引导您完成一个TS项目,以便在发布到npm之前发出类型定义以及CJS和ESM目标。这将最大程度地利用node.js和以后的浏览器。
styfle

Answers:


84

这是用TypeScript编写的示例Node模块:https : //github.com/basarat/ts-npm-module

这是一个使用此示例模块的示例TypeScript项目https://github.com/basarat/ts-npm-module-consume

基本上,您需要:

  • commonjs和编译declaration:true
  • 生成.d.ts文件

然后

  • 让您的助手阅读生成的.d.ts

Atom-TypeScript为此提供了一个不错的工作流程:https : //github.com/TypeStrong/atom-typescript#packagejson-support


Atom-TypeScript锚链接需要更新(锚不再有效)。
Fidan Hakaj '16

@basarat,在ts-npm-module中,您使用的是“ version”:“ 1.5.0-alpha”。我认为这是您正在使用的Typescript版本。忽略这个有关系吗?(Atom插件不会自动完成此操作)。如果使用了版本,这是否需要其他用户使用准确的版本进行转换(或仅更新版本)?(或者也许是tsconfig.json的版本?)
贾斯汀

您是否有依赖于其他库的模块用例?为了避免重复定义问题,您需要配置tsconfig.json,但是我认为这似乎太手工了。
塞尔吉奥米歇尔斯

1
您还会在2016年第四季度倡导这种方法吗?
SuperUberDuper '16


78

使用TypeScript 3.x或TypeScript 2.x,以下步骤描述了使用TypeScript创建库(npm软件包)所要做的事情:

  • 像往常一样创建项目(包含测试和所有内容)
  • 添加declaration: truetsconfig.json产生分型。
  • 通过 index.ts
  • 在中package.json,指向您生成的类型。例如,如果您outDirdist,则将其添加"types": "dist/index.d.ts"到包json中。
  • 在里面 package.json,指向您的主条目文件。例如,如果您outDirdist,而主入口文件是index.js,则将其添加"main": "dist/index.js"到package.json中。
  • 创建一个 .npmignore忽略不必要的文件(例如源文件)。
  • 使用发布到npm npm publish。使用semver规范进行更新(补丁/错误修复npm version patch,不间断的添加npm version minor,不连续的api更改npm version major

由于花了我一段时间才能在互联网上浏览有关该主题的所有过时资源(例如本页上的那个...),所以我决定将其包装在如何编写打字稿库中,并附带一个最新的最小工作示例。


我是否需要检查js到源代码管理中?还是npm保留自己的代码版本?
Olian04年

1
@ Olian04您告诉创建一个.npmignore文件以告诉npm发布时要忽略哪些文件(这些.ts文件),并.gitignore告诉git哪些文件要忽略(dist/
Purag

@ Olian04不,您不需要(并且IMO也不应该)提交生成的JS文件。这些都不是项目来源的一部分。
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.ts,我在刚刚安装了npm的项目中 创建了一个文件 import Project = require("project");

键入Project.为我提供了Intellisense选项,这是整个练习的重点。

希望这有助于其他人将他们的TypeScript npm项目用作更大项目中的内部库。

PS:我相信这种将项目编译为可以在其他项目中使用的npm模块的方法让人联想.dll.NET世界。我完全可以想象项目是在VS Code的解决方案中组织的,其中每个项目都会生成一个npm包,然后可以将其作为依赖项在解决方案中的另一个项目中使用。

由于花了我很多时间才能解决这个问题,因此我将其发布,以防有​​人卡在这里。

我还发布了一个封闭的bug,网址为:https : //github.com/npm/npm/issues/11546


该示例已上传到Github:vchatterji / tsc-seed


你可以在github上上传一个例子吗?那会很有帮助!:)
韩澈

3
示例已上传到Github:github.com/vchatterji/tsc-seed
Varun Chatterji

它也可以在非打字稿项目中使用吗?
SuperUberDuper '16

5

您应该发布原始的打字稿源,而不是类型定义。在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
Tim

5

我主要遵循Varun Chatterji的建议

但是,我想展示一个包含单元测试和代码覆盖率的完整示例,npm并使用javascript或将其发布并导入typescript

该模块是使用编写的typescript 2.2,配置prepublish挂钩以使用编译代码很重要tsc发布到npm之前,

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

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


1
这是一个非常有用的示例,感谢分享!我目前也在尝试以这种方式创建软件包。
杰弗里·韦斯特坎普

1
截至2017年7月,这是我遇到的最好的项目结构。感谢Tim和Varun Chatterji
adgang'7

3

您也可以使用autodts来处理.d.tsnpm中的分发和使用文件,而无需Atom IDE的支持。

autodts generate会将所有您自己的.d.ts文件捆绑在一起,以便在npm上发布,并autodts link处理对其他已安装软件包的引用,这些引用可能并不总是直接存在node_modules于分成多个子软件包的较大项目中。

这两个命令读取它们的设置package.json,并tsconfig.json在“约定优于配置”的风格。

关于stackoverflow 还有另一个答案,还有一篇博客文章,提供了更多详细信息。


0

在Lossless,我们为npm包创建了一个一站式TypeScript开发工具:https ://gitzone.gitlab.io/npmts/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.