在打字稿中书写NPM模块
我正在开发我的第一个NPM模块。 之前我曾经使用过打字稿,而且很多问题是很多模块没有可用的定义文件。 所以我认为在打字稿中写我的模块是一个好主意。
但是,我找不到任何有关如何做到这一点的最佳方法。 我发现这个相关的问题“ 我可以用coffeescript编写npm包吗? ”,其中人们build议只发布javascript文件。 但是与coffeescript文件相反,打字稿文件在打字稿应用程序中使用时可能会非常有用。
我应该在发布NPM模块时包含Typescript文件,还是应该只发布JavaScript文件并将生成的.d.ts文件提供给DefinitelyTyped?
以下是使用TypeScript编写的示例Node模块: https : //github.com/basarat/ts-npm-module
以下是使用此示例模块的示例TypeScript项目https://github.com/basarat/ts-npm-module-consume
基本上你需要:
- 用
commonjs
和declaration:true
编译declaration:true
- 生成一个
.d.ts
文件
接着
- 让你的ide读取生成的
.d.ts
。
Atom-TypeScript只是提供了一个很好的工作stream程: https : //github.com/TypeStrong/atom-typescript#packagejson-support
这是使用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
现在我转到我想用作库的项目,input: npm install ./project-1.0.0.tgz
它成功安装。
现在我在我刚刚安装了npm import Project = require("project");
项目中创build了一个index.ts
文件import Project = require("project");
打字Project.
给我的Intellisense选项,这是整个演习的重点。
希望这可以帮助其他人在他们更大的项目中使用他们的TypeScript npm项目作为内部库。
PS:我相信这种将项目编译成可以在其他项目中使用的npm模块的方法让人想起.NET
世界中的.dll
。 我可以很好地想象项目被组织在VS中的解决scheme中,每个项目生成一个npm包,然后可以在解决scheme的另一个项目中用作依赖项。
由于我花了相当长的时间才弄明白这一点,所以我贴出来,以防有人被困在这里。
我也发布了一个封闭的错误: https : //github.com/npm/npm/issues/11546
这个例子已经上传到Github: vchatterji / tsc-seed
2017 / Typescript 2.x中的推荐方式:
- 像平常一样创build你的项目(包括testing和一切)
- 添加
declaration: true
到tsconfig.json
产生tsconfig.json
。 - 通过
index.ts
导出API - 在
package.json
,指向你生成的types。 例如,如果您的outDir
是dist
,那么将"types": "dist/index.d.ts"
到您的包json中。 - 创build一个
.npmignore
忽略不必要的文件(例如源文件)。 - 用
npm publish
发布到npm。 使用semvar规格进行更新(修补程序/错误修复npm version patch
,非破坏补充npm version minor
,打破api更改npm version major
)
因为它让我花了一段时间来筛选掉所有关于这个主题的过时的资源(比如这个页面上的那个…),我决定把它包装在一个如何编写一个打字稿库中 ,最新的工作最小的例子。
您可以使用autodt来处理从npm分发和使用.d.ts
文件,而不需要Atom IDE的支持。
autodts generate
会将所有你自己的.d.ts
文件捆绑在一起,以便在npm上发布, autodts link
处理对其他已安装软件包的引用,这些软件包可能并不总是直接位于一个较大的项目的node_modules
。
两个命令tsconfig.json
以“convention over configuration”风格从package.json
和tsconfig.json
中读取它们的设置。
在stackoverflow上还有另外一个答案 ,还有一个更详细的博客文章 。
我主要遵循Varun Chatterji的build议
但是,我想展示一个完整的unit testing和代码覆盖范例,并将其发布到npm
,并使用javascript
或inputtypescript
这个模块是使用typescript 2.2
编写的,重要的是configurationprepublish
钩子来使用tsc
编译代码,然后发布到npm
您应该发布原始打字稿来源而不是types定义。 在package.json
让'types'属性指向* .ts文件。
*.d.ts
是很好的注释现有的JS库,但作为一个消费者,我宁愿阅读打字稿代码,而不是在types定义和生成的JS代码之间切换。
在Lossless中,我们为npm包创build了一站式TypeScript开发工具: https ://gitzone.gitlab.io/npmts/