描述错误
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
文件都应该保持响应,并且不需要开发人员进行额外的配置来保持可用的性能。
系统(请填写以下信息):
附加上下文
正如在#language-tools
的 Svelte Discord 上与@dummdidumm所讨论的那样。 为了@jasonlyu123 的注意。
来自Discord上的
dummdidumm:是的,语义令牌在大文件上可能很慢,特别是因为我们需要做很多源映射映射
dummdidumm: @jasonlyu09也许我们应该为大文件/范围添加一些限制,如果要分析的请求范围变得太大,基本上不会发出请求。 我认为 VS Code 做了类似的事情。
是的,VSCode 的 typescript 扩展将其上限设置为 100000。但我发现它对我们来说仍然很慢,可能是因为源映射的原因,我想我将其上限设置为 50000;
是的,VSCode 的 typescript 扩展将其上限设置为 100000。但我发现它对我们来说仍然很慢,可能是因为源映射的原因,我想我将其上限设置为 50000;
@jasonlyu123 100,000 什么? 我的 2,600 行文件有 128,292 个字符,所以如果它应该为超过 100,000 个字符的文件禁用语义标记,它似乎根本没有这样做。
虽然如果它是关于某个生成文件的长度(您的 PR 提到 TSX,所以也许是),而不是源本身,我不知道我生成的文件的长度是多少。
字符,如果 js/ts 文件超过该字符,则打字稿扩展将不会处理完整的文件语义标记。 我在调试模式下尝试了 svelte 扩展上的数字,但它似乎仍然太慢。
语言服务器可以实现多种类型的语义令牌请求。 我们目前实现了类似打字稿扩展的范围和完整文件。 根据我的理解,当完整文件不可用时,vscode 似乎只会尝试获取范围结果。 范围一就是向下滚动文档时您会看到突然颜色变化的原因。
现在已经封顶了。 现在让我们看看它在打开语义标记时是否可以再次使用。