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

在VSCode中开发自定义TypeScript语言服务插件,typescript,visual-studio-code,Typescript,Visual Studio Code,我试图在VSCode中开发一个TSserver插件,但我无法让服务器加载我的插件 我已经尝试将tsconfig.json中的路径设置为本地路径和节点_模块的路径 这是一个非常小的项目,我认为应该运行插件 服务器没有加载插件。它不会在插件中记录消息,如果我在插件中输入错误,它也不会崩溃。TS服务器插件位于node\u下。只有当您正在使用,并且插件在项目的tsconfig.json中列出时,才会加载模块。使用插件的相对路径 要运行该示例,请执行以下操作: 在node\u模块下安装minimal t

我试图在VSCode中开发一个TSserver插件,但我无法让服务器加载我的插件

我已经尝试将tsconfig.json中的路径设置为本地路径和节点_模块的路径

这是一个非常小的项目,我认为应该运行插件


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

TS服务器插件位于
node\u下。只有当您正在使用,并且插件在项目的
tsconfig.json
中列出时,才会加载模块。使用插件的相对路径

要运行该示例,请执行以下操作:

  • node\u模块下安装
    minimal tsserver插件
  • 使用工作区版本的typescript
  • 在您的tsconfig中,具有:

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

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

  • 使用本地TypeScript启用工作区配置:
  • npm i类型脚本

    package.json

    {
      "name": "plugin"
    }
    
    {
    “依赖项”:{
    “类型脚本”:“^4.2.3”
    }
    }
    
    .vscode/settings.json

    {
    “typescript.tsdk”:“/node_modules/typescript/lib”,
    //~/.config/Code/logs/**/tsserver.log
    “typescript.tsserver.log”:“详细”,
    “typescript.enablePromptUseWorkspaceTsdk”:真
    }
    
    使用本地TypeScript很重要,因为TypeScript将在TS服务器及其上的工作目录中的
    node_modules
    中按包名查找插件。如果试图使用全局TypeScript(
    /usr/local/lib/node\u modules/TypeScript/lib
    ),则
    tsserver
    的工作目录就在那里,而您的插件将不在该路径附近

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

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

  • 在项目目录中的
    节点\u模块/plugin
    中创建插件
  • 这是次优的部分,我讨厌在
    node_modules
    中有插件的源代码,但我还没有找到将其移出的方法,因为TS服务器的工作目录现在位于项目目录的
    node\u modules
    中,下一个目录是项目目录父目录的
    node\u目录
    ,依此类推。我不知道如何使你的插件代码不需要在这个链中

    node\u模块/plugin/package.json

    {
      "name": "plugin"
    }
    
    node\u模块/plugin/index.js

    module.exports=函数初始化(模块){
    函数创建(信息){
    const service=info.languageService;
    info.project.projectService.logger.info(
    “已启动自定义插件”
    );
    回程服务;
    }
    返回{create};
    }
    
    我不认为不需要传输就可以直接在TypeScript中编写插件

  • 配置TS服务器以使用插件并重新启动它
  • tsconfig.json

    {
      "name": "plugin"
    }
    
    {
    “编译器选项”:{
    “插件”:[
    {
    “名称”:“插件”
    }
    ]
    }
    }
    
    名称不能是文件路径(),因此我们在这里通过节点包名称引用插件,因此所有的把戏都是将插件源代码放在通向TS服务器工作目录的
    Node_modules
    链中

    要重新启动TS服务器,请转到TS/JS文件并按Cmd+Shift+p,然后选择TypeScript:restart TS Server。然后再次按Cmd+Shift+P并选择类型脚本:打开TS服务器日志

    您应该会看到这样的内容(
    代表您的项目目录):

    如果有人知道如何直接从您的项目目录而不是从
    node\u modules
    加载插件,或者如何使用全局TypeScript安装而不是本地安装,我洗耳恭听

    编辑:

    可以进行的一项改进是将
    node\u modules/plugin/index.js
    更改为:

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


    我已经为此打开了一个TypeScript错误报告:

    我已经尝试在工作区模式下运行TypeScript服务器,当插件链接到node_模块时,它没有work@SKillen看看我的答案,我已经想出了一个办法,使这项工作。当然不是一个好方法,也不是一个基于感觉的正确方法,但这是我找到的唯一方法。