在npm上创建一个可用的库…使用纱线工作区

我正在寻找对我在修补时编码的模式的反馈

语境

我正在为我的公司创建一个包,该包将公开发布。DX(开发者体验)对我们来说是最重要的,为此我选择了开发的最新趋势:Typescript、esm 等......我想提出多个模块并使导入易于使用,类似到(例如)nextjs 的next/Router.

[编辑]我发现了这个线程并交叉引用以供曝光。

第一步

我从一个简单的单个包开始我的第一次尝试,tsconfig 和 src/、tests/ 和 dist/ 文件夹。那里没有什么令人难以置信的异国情调,但如果你一直这样做,你就会知道发布它会导致你的导入路径dist稍后包含。

可以使用 package.json 的main字段解决此问题,但这仅适用于顶级模块;您可以使用exports,但它不适用于 Typescript。最简单的解决方法是cp package.json dist/ && npm publish dist/,到此,问题就解决了。

然后我想为了测试这个,我将成为npm link我的 dist/ 文件夹,虚拟地创建“一个包中的包”,几乎没有问题:

  • 这部cp package.json dist/分会增长*.md,谁知道还有什么/它会如何增长(我不想有构建脚本文件)
  • 我仍然需要构建一个测试应用程序来在 DX 级别测试我的库,以及在哪里托管它?

所以我想:为什么不把它全部提升为一个 monorepo 呢?

转折点

树结构将从:

myLib/
  package.json ? build + test + publish script
  tsconfig.json
  jest.config.json
  .npmignore ? managing what to distribute
  ...lots of config files
  src/
  dist/
  tests/

到:

myLib/
  package.json ? workspaces
  src-pkg/
    package.json ? build script
    tsconfig.json ? localized conf for build
  dist-pkg/
    package.json ? publish script
  test-pkg/
    package.json ? test script
    jest.config.json ? localized conf for test

要将构建的文件从src-pkgto传递dist-pkg,我只需要指向 tsc ( tsc --project . --outDir ../dist-pkg) 中的文件夹

甚至可以通过在顶级 npm 脚本中编排工作空间命令来恢复与单个包中相同的流程,例如:

{
  "workspaces": ["src-pkg", "test-pkg", "dist-pkg"],
  "scripts": {
    "build": "yarn workspace src-pkg run build",
    "test": "yarn workspace test-pkg run test",
    "publish": "yarn workspace dist-pkg run publish"
  }
}

退一步

这种结构的好处主要在 test-pkg 中。它可以轻松地随意测试 src-pkg 或 dist-pkg,因为这两种结构都应该是扁平的和相似的。这样,工作流可以在构建之前或之后进行测试。

另外(这是我感兴趣的主要领域),由于在 src-pkg 之外,test-pkg 具有我的库(Typescript 上下文和所有)的使用者的PoV - 特别是如果使用 dist-pkg 作为依赖项 -这样我就可以像我是我未来的客户一样高效地处理开发人员体验。

还有其他一些小的事情,特别是使用 monorepo 扩展的稳定性,或者我可以在 dist-pkg 中提供一个单独的“公共友好”自述文件,同时在 src-pkg 清单中有更多的内部/私有细节。

缺点主要是semver的管理(src-pkg和dist-pkg分开),而且它是我以前从未见过的结构......感觉有点像对monorepo结构的误用。


所以,我已经构建了它并且它可以工作......但即使可以构建也不意味着它应该是。

人们构建库和 SDK,你们怎么看?

感谢您的反馈意见。

以上是在npm上创建一个可用的库…使用纱线工作区的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>