如何连接VSCode内置tsserver?其端口号是多少?(面向TS插件开发新手)
嗨,作为搞过VSCode TypeScript插件开发的过来人,我完全懂你想搞清楚怎么连接内置tsserver、还得查到它端口号的需求——这可是插件和TS核心服务通信的基础,咱们一步步来捋明白:
一、连接VSCode内置tsserver的正确姿势
首先得明确:VSCode默认的tsserver是通过**进程间通信(IPC)**和插件交互的,不是走网络端口哦!所以你不用手动去建立TCP连接,VSCode已经给咱们封装好了现成的API可以直接用:
- 先通过VSCode的API获取当前工作区的TypeScript语言服务实例,这个实例已经帮你搞定了和tsserver的通信逻辑:
import * as vscode from 'vscode'; import * as ts from 'typescript'; // 获取当前激活文档对应的TS语言服务 function getTsLanguageService(): ts.LanguageService | undefined { const editor = vscode.window.activeTextEditor; if (!editor) return undefined; const doc = editor.document; // 只处理TS/JS文件 if (!['typescript', 'javascript'].includes(doc.languageId)) return undefined; // 获取封装好的TS语言服务 const tsService = vscode.typescript.getLanguageService(doc.uri); return tsService as unknown as ts.LanguageService; }
- 拿到这个实例后,直接调用它的方法(比如
getCompletionsAtPosition获取代码补全、getSemanticDiagnostics获取语法诊断)就能和tsserver交互,不用关心底层通信细节。
二、怎么查到tsserver的端口号(前提是启用了端口模式)
默认tsserver是没有端口的,只有当你手动开启了端口监听模式才会有端口号,操作步骤如下:
先开启tsserver端口模式
打开VSCode设置(快捷键Ctrl+,),搜索typescript.tsserver.port,可以设置一个固定端口(比如59123),或者设为-1让系统自动分配随机端口,设置后重启VSCode生效。查询端口号的三种方式
- 查看TS Server日志:打开命令面板(
Ctrl+Shift+P),输入TypeScript: Open TS Server Log,在日志开头就能看到类似这样的内容:Server is listening on port 59123
这串数字就是当前tsserver使用的端口号。 - 通过进程工具查询:找到VSCode的tsserver进程(Windows用任务管理器、macOS用活动监视器、Linux用
ps aux | grep tsserver),查看进程的命令行参数,里面会有--port XXXXX的标记,XXXXX就是端口号。 - 在插件中读取配置:如果是在自己的插件里要获取配置的端口值,可以用VSCode的配置API:
const tsserverPort = vscode.workspace.getConfiguration('typescript').get<number>('tsserver.port'); console.log('TSServer配置的端口:', tsserverPort);
注意:如果配置的是-1,这里返回的是-1,实际随机分配的端口还是得通过日志或进程信息查询。
三、如果非要手动通过端口连接tsserver(比如调试需求)
如果你因为调试或自定义通信的需求,要手动通过TCP连接tsserver,可以用Node.js的net模块,不过要遵循tsserver的JSON通信协议(每个请求/响应都是JSON字符串加换行):
import * as net from 'net'; const client = net.createConnection({ port: 59123 }, () => { console.log('已连接到tsserver'); // 发送符合tsserver协议的请求 const request = JSON.stringify({ seq: 1, type: 'request', command: 'open', arguments: { file: '/Users/xxx/test.ts', fileContent: 'const num = 123;' } }); client.write(`${request}\n`); }); // 监听tsserver的响应 client.on('data', (data) => { console.log('收到tsserver响应:', data.toString()); }); client.on('end', () => { console.log('与tsserver断开连接'); });
内容的提问来源于stack exchange,提问作者forestlightelf
相关产品推荐
相关产品推荐

