首先关于VsCode插件通信,如果不明白的可以参考我的这篇博客VsCode插件开发之插件初步通信

如果需要详细例子的话,可以参考VsCode插件开发

现在又有一个新的需求是,VsCode插件可以通过jQuery的方式/或者引入某种前端通信框架实现与后台交互。但是针对之前某个需求,需求描述:用户登录后在本地某盘创建特定的文件夹。通常像创建特定文件夹的话,一般都是后端语言实现。而我当时编写的这个插件是用JavaScript,JavaScript是不能读写文件的,当然了,有些朋友可能会说可以使用ActiveXObject,但是这个ActiveXObject有局限性,它仅仅只能支持IE浏览器,而不能支持像Google Chrome和火狐这样的通用性广的浏览器。

为了解决这个需求,我决定结合node.js解决这个问题。

首先明确一点,vscode插件开发,不管是使用JavaScript还是TypeScript,通常由于本地调试的需求,都需要安装对应库,而管理这个库,通常使用npm或yarn。由此我们便可知,我们直接可以在该插件中编写node.js相关的代码。

实现需求的步骤如下:

引入vscode相关的库(因为要调用消息传递命令)

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() * );
callbacks[cbid] = cb;
data.cbid = cbid;
}
vscode.postMessage(data);
}

消息传到node.js

vscode.postMessage({
command: 'login',
text: nickName
});

那么有朋友会问,那么node.js是如何接收它的?

module.exports = function (context) {

    var interval = null;
var i = ;
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的通信。

Node.js如何响应JavaScript的通信(相当于打电话,我打电话给你,不能仅仅是我在说,也需要你的响应(回答))

Node.js响应JavaScript通信代码如下(发送消息给window.addEventListener与前端JavaScript发送消息给Node.js本质上是一样的)

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在此相当于监听全局。

通过message.text我们可以获取node.js响应给前端JavaScript的文本消息或者是json数据。

上述说的两点用官方的话语表示如下:
(1)JavaScript与Node.js通信;
(2)Node.js与JavaScript通信;

VsCode插件与Node.js交互通信的更多相关文章

  1. Vue和Node.js交互之token

    博主最近工作的时候,公司后台使用的JAVA,在做登陆时总会传来一个token然后我存在了本地存储中或Vuex中,之后每一次请求把它带在请求头上,然后就好奇想要自己做一个后台服务器然后做一个完整的登陆的 ...

  2. iOS之与JS交互通信

    随着苹果SDK的不断升级,越来越多的新特性增加了进来,本文主要讲述从iOS6至今,Native与JavaScript的交互方法 一.UIWebview && iframe && ...

  3. Node.js 笔记01

    一.Node.js 前言 1.node.js 之父 Ryan Dahl(瑞安达尔) ,技术好,颜值高! 数学系博士, 中途退学, 为了生活, 学习了Ruby On Rails接Web项目, 经过两年成 ...

  4. c#两种方式调用google地球,调用COM API以及调用GEPLUGIN 与js交互,加载kml文件,dae文件。将二维高德地图覆盖到到三维谷歌地球表面。

    网络上资源很多不全面,自己在开发的时候走了不少弯路,在这里整理了最全面的google全套开发,COM交互,web端交互.封装好了各种模块功能. 直接就可以调用. 第一种方式:调用COMAPI实现调用g ...

  5. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

  6. node.js + webstorm :配置开发环境

    一.配置开发环境: 1.先安装node (1).访问http://nodejs.org打开安装包,正常安装,点击next即可. 为了测试是否安装成功,打开命令提示符,输入node,则进入node.js ...

  7. 移动端自动化环境搭建-node.js的安装

    安装node.js A.安装依赖 Appium是使用nodejs实现的,所以node是解释器,首先需要确认安装好 B.安装过程

  8. 《Node.js+MongoDB+AngularJS Web开发》读书笔记及联想

    总体介绍 <Node.js+MongoDB+AngularJS Web开发>,于2015年6月出版,是一本翻译过来的书,原书名为<Node.js,MongoDB and Angula ...

  9. node.js安装和启动

    在Windows上安装 Node.js十分方便,我们只需要访问node.js官网http://www.nodejs.org/,点击Download链接,然后选择Windows Installer(32 ...

随机推荐

  1. PHP 常用数据库操作

    1.建立与数据库服务器的连接(前提数据库服务器必须打开) 第一个参数:本地地址 第二个参数:数据库账户 第三个参数:数据库密码 第四个参数:数据库名称 $connection = mysqli_con ...

  2. sql server 处理特殊字符问题

    对于中文版的SQL SERVER,默认安装后使用的默认排序规则为Chinese_PRC_CI_AS,在此排序规则下,使用varchar类型来可以“正常存取”存放中文字符以及一些东南亚国家的字符, 同时 ...

  3. Solr+ik分词支持特殊符号分词

    在工具类(CharacterUtil.java)里,找到方法 identifyCharType,加入以下代码: } else if (ub == Character.UnicodeBlock.GREE ...

  4. Navicat中文破解版(windows10)

    1.下载安装包 链接:https://pan.baidu.com/s/1hP3cD9aTv8nvJfNwjXPdrQ 提取码:xmsu 2.解压安装包  选择.exe 文件然后 安装 选择自己要安装的 ...

  5. 【JUC】7.CountDownLatch

    Latch:门闩.一种线程通信的方式:当程序不涉及同步,仅仅需要线程通信的时候,使用synchronize或者lock的线程通信等待唤醒机制,就显得太重了: 这时候,可以考虑使用信号量类:CountD ...

  6. NFS启动文件系统

    NFS启动文件系统 一.软硬件平台 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.UBOOT版本:U-Boot-2016.05,采用FDT和DM. 3.交换芯片MARVELL的88E ...

  7. Windows下学习C语言有哪些集成开发软件?

    前言 初学者学习C语言遇到的最大困难想必就是搭建环境了,相当多的初学者就是被搭建环境导致放弃了学习编程,就我自己的经验而言,初学编程不应该受限于环境,使用成熟好用的环境就可以了,之后熟悉一些可以在慢慢 ...

  8. Please provide compiled classes of your project with sonar.java.binaries property

    是因为一个jar包版本的原因,sonar-java-plugin-5.1.0.13090.jar 需要降级 https://repo.maven.apache.org/maven2/org/sonar ...

  9. 初识python多线程

    目录 GIL锁 Thread类构造方法 Lock类.Rlock类 参考: python3多线程--官方教程中文版 python多线程-1 python多线程-2.1 python多线程-2.2 pyt ...

  10. istio-1.1.6镜像列表

    istio-1.1.6镜像列表 istio-1.1.6/install/kubernetes/istio-demo.yaml文件里提取出来的镜像,方便作harbor部署. ============== ...