在VSCode中开发自定义TypeScript语言服务插件

时间:2019-05-14 21:37:42

标签: typescript visual-studio-code

我正在尝试用VSCode开发TSserver插件,但无法让服务器加载我的插件

我尝试将tsconfig.json中的路径设置为本地路径和node_modules的路径

这是一个非常小的项目,我认为应该运行插件 https://github.com/Spensaur-K/minimal-tsserver-plugin

服务器未加载插件。如果我在插件中输入错误,它不会在插件中记录消息或崩溃

2 个答案:

答案 0 :(得分:1)

我能够在从文件提供服务的同时在 TS Server 中加载自定义插件的唯一方法:

  1. 使用本地 TypeScript 启用工作区配置:

npm i typescript

package.json

{
  "dependencies": {
    "typescript": "^4.2.3"
  }
}

.vscode/settings.json

{
  "typescript.tsdk": "./node_modules/typescript/lib",
  // ~/.config/Code/logs/**/tsserver.log
  "typescript.tsserver.log": "verbose",
  "typescript.enablePromptUseWorkspaceTsdk": true
}

使用本地 TypeScript 很重要,因为 TypeScript 会在 TS Server 工作目录及以上的 node_modules 中按包名查找插件。如果尝试使用全局 TypeScript (/usr/local/lib/node_modules/typescript/lib),tsserver 的工作目录将在附近,而您的插件将远离该路径。

使用 verbose 似乎是可选的,因为 TS 服务器中所有与插件加载相关的消息似乎都是信息级别,但我启用它以确保我不会错过任何东西,因为调试这已经足够人为设计了: 要查看日志,请在 TS/JS 文件中按 Cmd+Shift+P 并选择 TypeScript: Show Open TS Server Log。

启用工作场所 TypeScript 版本的提示也是可选的,它有助于不要忘记手动执行此操作,否则您必须在 TS/JS 文件中使用 Cmd+Shift+P 并选择 TypeScript:选择 TypeScript版本并将其切换到 .vscode/settings.json 中配置的工作区版本。

  1. 在项目目录的 node_modules/plugin 中创建插件

这是次优部分,我讨厌在 node_modules 中有插件的源代码,但我还没有找到将其移出的方法,因为 TS Server 的工作目录现在在 {{1} } 的项目目录,下一个目录是项目目录的父目录的 node_modules,依此类推。我不知道怎么做才能让你的插件代码不需要在这个链中。

node_directory

node_modules/plugin/package.json

{ "name": "plugin" }

node_modules/plugin/index.js

我认为无需转译就可以直接在 TypeScript 中编写插件。

  1. 配置 TS Server 以使用您的插件并重新启动它

module.exports = function init(modules) { function create(info) { const service = info.languageService; info.project.projectService.logger.info( "Started custom plugin" ); return service; } return { create }; }

tsconfig.json

名称不能是文件路径 (https://github.com/microsoft/TypeScript/issues/18623),因此我们在这里通过 Node 包名称来引用插件,因此所有将插件源代码放在 { "compilerOptions": { "plugins": [ { "name": "plugin" } ] } } 链中的恶作剧到 TS Server 工作目录。

要重新启动 TS Server,请转到 TS/JS 文件并按 Cmd+Shift+P 并选择 TypeScript: Restart TS Server。然后再次按 Cmd+Shift+P 并选择 TypeScript: Open TS Server Log。

然后您应该会看到类似的内容(node_modules 代表您的项目目录):

如果有人知道如何直接从您的项目目录而不是从 Info 24 [09:59:19.919] Enabling plugin plugin from candidate paths: /…/node_modules/typescript/lib/tsserver.js/../../..,/Applications/Visual Studio Code.app/Contents/Resources/app/extensions/typescript-language-features Info 25 [09:59:19.919] Loading plugin from /…/node_modules/typescript/lib/tsserver.js/../../.. (resolved to /…/node_modules/node_modules) Info 26 [09:59:19.923] Started custom plugin Info 27 [09:59:19.923] Plugin validation succeded 加载插件,或者知道如何使用全局 TypeScript 安装而不是本地安装,我会全力以赴!

编辑:

可以进行的一项改进是将 node_modules 更改为:

node_modules/plugin/index.js

并将之前存在的代码移至项目目录中的 module.exports = require('../../plugin.js'); 。我更希望有一种方法可以在我的项目目录中没有任何 plugin.js 目录的情况下完成所有这些工作,但是唉。

我为此打开了一个 TypeScript 错误报告:https://github.com/microsoft/TypeScript/issues/43124

答案 1 :(得分:0)

仅当您使用workspace version of typescript并且在项目的node_modules中列出该插件时,才会加载tsconfig.json下的

TS Server插件。为插件may also not work使用相对路径。

运行示例:

  1. minimal-tsserver-plugin下安装node_modules
  2. 使用打字稿的工作区版本
  3. 在您的tsconfig中,具有:

    {
      "compilerOptions": {
        "plugins": [
          {
            "name": "minimal-tsserver-plugin"
          }
        ]
      }
    }