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.json
的 main
属性 中指定的文件(因此在构建包时,它可以在该文件中看到提示 - 显然不利于开发! )
以下示例配置的一些假设:
- 您有一个包含所有包的
packages/
目录
- 每个包都有一个
src/
包含代码的目录
- 您的包有一个命名空间
@foo
(例如,包名为 @foo/API
或类似名称)
将以下内容添加到 jsconfig.json
:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@foo/*": ["packages/*/src"]
}
}
}
重新启动后 VSCode/重新打开文件夹,IntelliSense 提示应该会正确显示。如果您没有为您的包使用命名空间,您可以向 paths
添加多行,明确指向正确的 src/
目录或使用 include
语法 from the documentation.
希望对您有所帮助!
编辑:
每个包也需要一个 jsconfig.json
,以便它知道如何正确解析兄弟包,例如,
{
...
"paths": {
"@foo/*": ["../*/src"]
}
...
}
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.json
的 main
属性 中指定的文件(因此在构建包时,它可以在该文件中看到提示 - 显然不利于开发! )
以下示例配置的一些假设:
- 您有一个包含所有包的
packages/
目录 - 每个包都有一个
src/
包含代码的目录 - 您的包有一个命名空间
@foo
(例如,包名为@foo/API
或类似名称)
将以下内容添加到 jsconfig.json
:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@foo/*": ["packages/*/src"]
}
}
}
重新启动后 VSCode/重新打开文件夹,IntelliSense 提示应该会正确显示。如果您没有为您的包使用命名空间,您可以向 paths
添加多行,明确指向正确的 src/
目录或使用 include
语法 from the documentation.
希望对您有所帮助!
编辑:
每个包也需要一个 jsconfig.json
,以便它知道如何正确解析兄弟包,例如,
{
...
"paths": {
"@foo/*": ["../*/src"]
}
...
}