【问题标题】:Writing npm modules in TypeScript在 TypeScript 中编写 npm 模块
【发布时间】:2015-09-04 20:28:18
【问题描述】:

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

但是,我找不到任何有关执行此操作的最佳方法的信息。我发现了这个相关的问题“Can I write npm package in CoffeeScript?”,人们建议只发布 JavaScript 文件。但与 CoffeeScript 文件相比,TypeScript 文件在 TypeScript 应用程序中使用时可能实际上很有用。

我应该在发布 npm 模块时包含 TypeScript 文件,还是应该只发布 JavaScript 文件并将生成的 .d.ts 文件提供给DefinitelyTyped?

【问题讨论】:

  • 帮助说明:我编写了项目 copeeblog post 来指导您设置一个 TS 项目,以便在发布到 npm 之前发出类型定义以及 CJS 和 ESM 目标。这将最大限度地提高 node.js 和浏览器的使用率。

标签: javascript node.js npm typescript


【解决方案1】:

对于 TypeScript 4.x、TypeScript 3.x 或 TypeScript 2.x,以下步骤描述了使用 TypeScript 创建库(npm 包)时必须执行的操作:

  • 像往常一样创建项目(包括测试和所有内容)
  • declaration: true 添加到tsconfig.json 以生成分型。
  • 通过index.ts 导出API
  • package.json 中,指向您生成的类型。例如,如果您的 outDirdist,则将 "types": "dist/index.d.ts" 添加到您的包 json 中。
  • package.json 中,指向您的主入口文件。比如你的outDirdist,主入口文件是index.js,那么在你的package.json中添加"main": "dist/index.js"
  • package.json 中,将您要发送到 npm 的文件列入白名单:files: ["/dist"]。另一种方法是使用.npmignore 将其列入黑名单,但更难保持最新状态。
  • 使用npm publish 发布到 npm。使用 semver 规范进行更新(补丁/错误修复 npm version patch,非破坏性添加 npm version minor,破坏性 api 更改 npm version major

由于我花了一些时间来筛选互联网上有关此主题的所有过时资源(例如此页面上的资源...),因此我决定将其包含在 how-to-write-a-typescript-library 中,并提供最新的工作最小的例子。

【讨论】:

  • 我必须将 js 签入源代码管理吗?还是 npm 保留自己的代码版本?
  • @Olian04 你告诉创建一个.npmignore文件来告诉npm发布时忽略哪些文件(.ts文件)和一个.gitignore告诉git忽略哪些文件(dist/ )
  • @Olian04 不,您不需要(而且 IMO 也不应该)提交生成的 JS 文件。这些不是项目源代码的一部分。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我主要听从Varun Chatterji的建议

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

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

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

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

    【讨论】:

    • 这是一个非常有用的例子,感谢分享!我目前也在尝试以这种方式创建包。
    • 截至 2017 年 7 月,这是我遇到的最好的项目结构。感谢 Tim 和 Varun Chatterji
    【解决方案4】:

    您应该发布原始打字稿源而不是类型定义。在package.json 中让'types' 属性指向*.ts 文件。

    *.d.ts 可以很好地注释现有的 JS 库,但作为消费者,我宁愿阅读 typescript 代码,也不愿在类型定义和下级生成的 JS 代码之间切换。

    【讨论】:

    【解决方案5】:

    这是使用 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

    安装成功。

    现在我在我刚刚安装 npm 的项目中创建了一个文件 index.ts import Project = require("project");

    输入 Project. 会给我 Intellisense 选项,这是整个练习的重点。

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

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

    由于我花了相当多的时间才弄清楚这一点,所以我已经发布了它以防有人被困在这里。

    我还在以下位置发布了一个已关闭的错误: https://github.com/npm/npm/issues/11546


    这个例子已经上传到 Github:vchatterji/tsc-seed

    【讨论】:

    • 你能在github上上传一个例子吗?那会有很大帮助! :)
    • 示例已上传到 Github:github.com/vchatterji/tsc-seed
    • 如何在非打字稿项目中也能使用?
    【解决方案6】:

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

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

    基本上你需要:

    • commonjsdeclaration:true 编译
    • 生成.d.ts 文件

    然后

    • 让您的 ide 读取生成的 .d.ts

    Atom-TypeScript 只是提供了一个很好的工作流程:https://github.com/TypeStrong/atom-typescript#packagejson-support

    【讨论】:

    • Atom-TypeScript 锚链接需要更新(锚不再有效)。
    • @basarat,在 ts-npm-module 中,您使用的是“版本”:“1.5.0-alpha”。我假设这是您正在编译的 Typescript 版本。把它排除在外有关系吗? (它不是由 Atom 插件自动完成的)。如果使用一个版本,这是否需要其他用户使用确切的版本来转换(或只使用较新的版本)? (或者可能是 tsconfig.json 的版本?)
    • 你有依赖于其他库的模块用例吗?为避免重复定义问题,您需要配置tsconfig.json,但我认为这似乎过于手动。
    • 您还会在 2016 年第四季度提倡这种方法吗?
    【解决方案7】:

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

    autodts generate 会将你自己的所有.d.ts 文件捆绑在一起以在 npm 上发布,autodts link 处理对其他已安装包的引用,在一个更大的项目中,这些包可能并不总是直接位于node_modules 下,拆分为几个子包.

    两个命令都以“约定优于配置”的方式从package.jsontsconfig.json 读取它们的设置。

    stackoverflow 上有 another answerblog post 有更多详细信息。

    【讨论】:

      猜你喜欢
      • 2016-07-18
      • 2018-10-13
      • 2018-08-01
      • 2016-02-01
      • 2016-12-19
      • 1970-01-01
      • 2016-07-29
      • 2020-01-06
      • 1970-01-01
      相关资源
      最近更新 更多