Language-tools: 对大文件启用语义标记功能会导致语言服务器速度慢得无法使用

创建于 2021-01-18  ·  4评论  ·  资料来源: sveltejs/language-tools

描述错误

VS Code Svelte 插件 v104.0.0 引入了对语义令牌的支持。 默认情况下,这是启用的:

// The default
"svelte.plugin.typescript.semanticTokens.enable": true

...然而,这会导致.svelte文件显着放缓,其中<script lang="ts">元素包含大量 TypeScript(在我的例子中为 2,600 行)。 语言服务器实际上变得没有响应,类型检查需要超过一分钟,工具提示在“加载...”上无限期地冻结。

再现

安装 VS Code Svelte 插件 v104.0.0 并应用"svelte.plugin.typescript.semanticTokens.enable": true的默认选项后,创建一个.svelte文件,例如 2,600 行 TypeScript 代码。 故意创建编译时错误并观察所有类型检查都需要很长时间才能响应。

您可以将设置更新为"svelte.plugin.typescript.semanticTokens.enable": false并立即再次响应。 无需重启Language Server,也无需重启VS Code,即可观察变化。

预期行为

无论脚本有多大,包含 TypeScript 脚本的.svelte文件都应该保持响应,并且不需要开发人员进行额外的配置来保持可用的性能。

系统(请填写以下信息):

  • 操作系统:macOS 10.15.7
  • IDE:VS 代码 1.52.1
  • 插件/包:“Svelte for VSCode”

附加上下文

正如在#language-tools的 Svelte Discord 上与@dummdidumm所讨论的那样。 为了@jasonlyu123 的注意。

来自Discord上的

dummdidumm:是的,语义令牌在大文件上可能很慢,特别是因为我们需要做很多源映射映射
dummdidumm: @jasonlyu09也许我们应该为大文件/范围添加一些限制,如果要分析的请求范围变得太大,基本上不会发出请求。 我认为 VS Code 做了类似的事情。

Fixed bug

所有4条评论

是的,VSCode 的 typescript 扩展将其上限设置为 100000。但我发现它对我们来说仍然很慢,可能是因为源映射的原因,我想我将其上限设置为 50000;

是的,VSCode 的 typescript 扩展将其上限设置为 100000。但我发现它对我们来说仍然很慢,可能是因为源映射的原因,我想我将其上限设置为 50000;

@jasonlyu123 100,000 什么? 我的 2,600 行文件有 128,292 个字符,所以如果它应该为超过 100,000 个字符的文件禁用语义标记,它似乎根本没有这样做。

虽然如果它是关于某个生成文件的长度(您的 PR 提到 TSX,所以也许是),而不是源本身,我不知道我生成的文件的长度是多少。

字符,如果 js/ts 文件超过该字符,则打字稿扩展将不会处理完整的文件语义标记。 我在调试模式下尝试了 svelte 扩展上的数字,但它似乎仍然太慢。

语言服务器可以实现多种类型的语义令牌请求。 我们目前实现了类似打字稿扩展的范围和完整文件。 根据我的理解,当完整文件不可用时,vscode 似乎只会尝试获取范围结果。 范围一就是向下滚动文档时您会看到突然颜色变化的原因。

现在已经封顶了。 现在让我们看看它在打开语义标记时是否可以再次使用。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

brunnerh picture brunnerh  ·  18评论

orta picture orta  ·  15评论

limitlessloop picture limitlessloop  ·  16评论

limitlessloop picture limitlessloop  ·  22评论

fnune picture fnune  ·  16评论