JSDoc 在使用 webpack 开发服务器的 Lerna monorepo 项目中的本地包中不起作用,但在发布到包注册表时起作用

JSDoc does not work in local package in a Lerna monorepo project using webpack dev server but works when released to package registry

Github 项目回购: https://github.com/Fralleee/lerna-intellisense-jsdoc-vscode

我有一个包含两个包的 monorepo 项目(Web 和 Api),它们使用 lerna 链接。 Web 项目导入 Api-包,Api-请求使用 JSDoc 记录。

如果 Api-package 从 NPM 发布并导入,文档将完美加载。

然而,如果它是 运行 本地通过 lerna 和 webpack devserver 文档丢失并且只能在本地代码中使用(在 Api- 文件夹中)。

我尝试使用模块、命名空间编写文档并搜索不同类型的解决方案,但 none 似乎有效。

JSDoc 和函数:

/**
 * Get comments from jsonplaceholder API
 * @namespace API
 * @module
 * @param {GetCommentsRequestExample} input PostId
 * @returns {Promise.<GetCommentsResponseExample>} Array of comments
 */
export const getComments = input => apiGet('https://jsonplaceholder.typicode.com/comments', input, GetCommentsRequest, GetCommentsResponse)

我不明白为什么 JSDoc 在包发布时有效,但在 运行 本地时却无效。


经过 2 小时的额外测试后编辑

我使用 Api 包中的索引文件导出所有内容。此索引文件从包中导入所有内容,然后将其导出,有点像单个入口点。

如果我直接在该索引文件中定义函数和 JSDoc,则 JSDoc 可用于其他包,即使 运行 在本地也是如此。

所以这似乎是导出 -> 导入 -> 再次导出导致 JSDoc 混乱的问题。这显然不是一个解决方案,因为 Api-package 有太多代码无法放入单个文件。

我在使用 VSCode 和 Lerna 时遇到了这个问题。解决方案是将 jsconfig.json 添加到 monorepo 的根目录(或 lerna.json 所在的任何位置)。

这是因为 VSCode 需要被告知它应该在每个包的 src/ 目录中寻找提示。我认为它默认查找 package.jsonmain 属性 中指定的文件(因此在构建包时,它可以在该文件中看到提示 - 显然不利于开发! )

以下示例配置的一些假设:

  1. 您有一个包含所有包的 packages/ 目录
  2. 每个包都有一个 src/ 包含代码的目录
  3. 您的包有一个命名空间 @foo(例如,包名为 @foo/API 或类似名称)

将以下内容添加到 jsconfig.json

{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@foo/*": ["packages/*/src"]
    }
  }
}

重新启动后 VSCode/重新打开文件夹,IntelliSense 提示应该会正确显示。如果您没有为您的包使用命名空间,您可以向 paths 添加多行,明确指向正确的 src/ 目录或使用 include 语法 from the documentation.

希望对您有所帮助!

编辑:

每个包也需要一个 jsconfig.json,以便它知道如何正确解析兄弟包,例如,

{
  ...
  "paths": {
    "@foo/*": ["../*/src"]
  }
  ...
}