问题
使用 React 的工具,你可以像这样评论一个组件:
/** Documentation that will appear on hover in other places where this is imported */
function MyComponent() { return null }
但是,在 Svelte 中,我还没有找到一种方法来做到这一点。
解决方案
我想知道我可以在哪里放置评论,这些评论将被 VSCode 和 Vim/Neovim(使用 coc.nvim)等编辑器的悬停文档接收。
为了说明这一点,我在这里悬停MyComponent
但我只看到import MyComponent
:
我希望我的文档字符串Documentation that will appear on hover in other places where this is imported
包含在工具提示中。
我已经搜索了一段时间并尝试使用 TypeScript 进行本地设置,但找不到方法。 我发现了一个关于 Svelte 组件元数据的有趣相关讨论,但讨论更多是关于 prop 类型。
编辑:由于我们正在讨论这是否更好地添加到编译器中,我在这里创建了一个类似的问题https://github.com/sveltejs/svelte/issues/5102
由于这对于没有脚本标记的组件也很有价值,我建议为此使用 HTML 注释。 svelte2tsx
然后会查找以特殊标签(如@doc
)开头的 HTML 注释,并将内容作为 jsdoc 放在默认导出之上。
意见? 其他想法?
我真的很想尝试实现这一点。 但是我认为它需要仔细设计,因为它是一些开发人员_非常经常_每天使用的功能。
想到的事情是:
/**
* <strong i="6">@file</strong> Here is my documentation for this component
*/
在文件的开头。 但我认为只有 HTML 注释可以在那里工作,对吗?
此外,也许为了使其与其他标签更相似,我觉得类似于<svelte:head>
的<svelte:documentation>
标签可能很好,但这需要在编译器中实现。
也许甚至<svelte:options documentation="blabla" />
?
这还需要在编译器中进行一些工作并获得主存储库的批准。 选项得到了编译器的验证。
我在主 repo 上创建了一个类似的问题,让我们看看我们是否可以得出一些结论:+1:
一旦https://github.com/sveltejs/language-tools/pull/282合并,一半就完成了。 LSP 没有在悬停时显示文档字符串。
现在我需要做的是从@doc
HTML 注释中获取文档字符串并将其添加到 svelte2tsx 中的addComponentExport
。
@dummdidumm目前无法将文档字符串添加到默认导出中,因为它们没有命名:
export default class {
$$prop_def = __sveltets_partial(render().props)
$$slot_def = render().slots
}
我想,既然可以在每个文件的根范围内进行的唯一事情是render
和默认导出,那么给它一个像Component
这样的通用名称是无害的? 或者也许从文件名中选择?
是的,这应该没问题。
是否有任何代码最终成为应用程序运行时的一部分,还是仅用于工具支持?
只是为了工具。
关于默认导出:我们需要检查它如何影响导入自动完成。
对的嗯。 我不明白它目前是如何工作的。 如果我尝试在仅 TS 的环境中模拟它,如下所示:
// Component.ts
export default class {}
我没有在其他文件上获得Component
自动补全,但在 Svelte 上它以某种方式工作。 我可能应该阅读 LSP 中的相关代码。
无论如何,如果我这样做:
// Component.ts
export default class Component {}
然后我会在其他文件上将默认导出自动完成为Component
。 所以我支持安全的赌注是将默认导出命名为与文件相同的名称,现在,然后对其进行实时测试。
好的,所以我尝试了两个选项,但是对于我们的 LSP,唯一适用于组件导入自动完成的方法是:
export default class {
// etc
}
我尝试过的事情:
export default class Name
行中添加名称。~它们都不起作用。 我现在正在查看完成提供程序(https://github.com/sveltejs/language-tools/blob/master/packages/language-server/src/plugins/typescript/features/CompletionProvider.ts)以查看在哪里罪魁祸首是,因为在仅 TS 的环境中,我会根据类的名称完成命名类的默认导出。~
更新:只要导出的名称与文件名相同,就可以声明一个类,然后在不同的行中将其导出为默认值。 我要去这个选项。
是的,svelte 组件的导入完成有一些额外的代码,基本上是构建导入建议。 如果 svelte2tsx 具有与文件名相同的命名默认导出,则该代码可能会被丢弃。