首先关于VsCode插件通讯,若是不明白的能够参考个人这篇博客VsCode插件开发之插件初步通讯javascript
若是须要详细例子的话,能够参考VsCode插件开发html
如今又有一个新的需求是,VsCode插件能够经过jQuery的方式/或者引入某种前端通讯框架实现与后台交互。可是针对以前某个需求,需求描述:用户登陆后在本地某盘建立特定的文件夹。一般像建立特定文件夹的话,通常都是后端语言实现。而我当时编写的这个插件是用JavaScript,JavaScript是不能读写文件的,固然了,有些朋友可能会说可使用ActiveXObject,可是这个ActiveXObject有局限性,它仅仅只能支持IE浏览器,而不能支持像Google Chrome和火狐这样的通用性广的浏览器。前端
为了解决这个需求,我决定结合node.js解决这个问题。java
首先明确一点,vscode插件开发,无论是使用JavaScript仍是TypeScript,一般因为本地调试的需求,都须要安装对应库,而管理这个库,一般使用npm或yarn。由此咱们即可知,咱们直接能够在该插件中编写node.js相关的代码。node
实现需求的步骤以下:git
const testMode = false; // 为true时能够在浏览器打开不报错 // vscode webview 网页和普通网页的惟一区别:多了一个acquireVsCodeApi方法 const vscode = testMode ? {} : acquireVsCodeApi(); const callbacks = {}; /** * 调用vscode原生api * @param data 能够是相似 {cmd: 'xxx', param1: 'xxx'},也能够直接是 cmd 字符串 * @param cb 可选的回调函数 */ function callVscode(data, cb) { if (typeof data === 'string') { data = { cmd: data }; } if (cb) { // 时间戳加上5位随机数 const cbid = Date.now() + '' + Math.round(Math.random() * 100000); callbacks[cbid] = cb; data.cbid = cbid; } vscode.postMessage(data); }
vscode.postMessage({ command: 'login', text: nickName });
那么有朋友会问,那么node.js是如何接收它的?github
module.exports = function (context) { var interval = null; var i = 0; var flag = false; context.subscriptions.push(vscode.commands.registerCommand('extension.demo.showWelcome', function (uri) { if (flag) { return; } const panel = vscode.window.createWebviewPanel( 'testWelcome', // viewType "功能页", // 视图标题 vscode.ViewColumn.One, // 显示在编辑器的哪一个部位 { enableScripts: true, // 启用JS,默认禁用 } ); flag = true; panel.onDidDispose( () => { flag = false; }, null, context.subscriptions); let global = { panel }; panel.webview.html = getWebViewContent(context, 'src/view/custom-welcome.html'); //建立文件 panel.webview.onDidReceiveMessage(message => { switch (message.command) { case 'login': create(message.text, true); break; case 'time': start(); break; case 'showCourseList': vscode.commands.executeCommand('extension.demo.showCourseList', message.text); break; case 'closeTime': stop(); break; case 'themeColor': var name = getTheme(); panel.webview.postMessage({ command: 'refactor', text: name }); break; case 'readToken': var name = getToken(); console.log("-------------go go go go go go go ------------------------:" + name); panel.webview.postMessage({ command: 'checkToken', text: name }); break; case 'storeUserId': console.log("----------------store UserId-----------------:" + message.text); storeUserId(message.text); break; case 'getUserId': var userId = getUserID(); console.log("----------------Get UserId-----------------:" + userId); panel.webview.postMessage({ command: 'readUserId', text: userId }); break; case 'storageToken': storeToken(message.text); break; case 'deleteToken': deleteToken(message.text); break; case 'readUploadFilePath': console.log("------------------------ readUploadFilePath -----------:" + message.text); var content = readExtensionFile(message.text); panel.webview.postMessage({ command: 'uploadConfig', text: content }); break; case 'downloadExtensionFile': downloadExtensionFile(message.text); break; } }, undefined, context.subscriptions); }));
经过message.command咱们就能够获取对应的command,根据command对应的字符走对应的case。这就是前端JavaScript与Node.js的通讯。web
Node.js响应JavaScript通讯代码以下(发送消息给window.addEventListener与前端JavaScript发送消息给Node.js本质上是同样的)npm
switch (message.command) { case 'refactor': console.log("自定义背景颜色 custome background color:" + message.text); if (message.text == "light") { document.body.style.backgroundColor = "#FFFFFF"; } else { document.body.style.backgroundColor = "#333333"; } break; case 'checkToken': console.log("-------------------checkToken----------------------------:" + message.text); if (message.text == null || message.text == "") { Login() } else { $("#exit").show(); $("#settings-sync").show(); $("#upload_settings").show(); $("#token").val(message.text); readUploadFilePath("D://1024Workspace//extension//"); } break; case 'readUserId': console.log("=====================readUserID=========================:" + message.text); $("#userId").val(message.text); checkPermissions(message.text); break; case 'uploadConfig': console.log("========================Upload Config ======================:" + message.text); $("#uploadExtensionContent").val(message.text); break; } });
window.addEventListener在此至关于监听全局。json
经过message.text咱们能够获取node.js响应给前端JavaScript的文本消息或者是json数据。
上述说的两点用官方的话语表示以下:(1)JavaScript与Node.js通讯;(2)Node.js与JavaScript通讯;