网易首页 > 网易号 > 正文 申请入驻

解锁 VS Code 更多可能性,轻松入门 WebView

0
分享至

作者:HelloGitHub-小夏

说起 VS Code 大家普遍印象应该都差不多是这样:不就是个编辑器嘛,最主要的还是 coding 的快感咯。

里面很多功能都应该是围绕如何提高 coding 效率、减少 coding 出错率、解放 coder 小哥哥小姐姐的劳动力等等,至于代码以外的东西比如预览什么的,就交给浏览器咯。

所以可能很少有人会把 VS Code 和 WebView 联想到一起。

一、随处可见的 WebView

但是我相信,你一定在很多“有名”的 VS Code 插件中接触过它(WebView)的身影。比如可以在 VS Code 中画流程图的 vscode-drawio:

上班摸鱼的同时还要继续提升自我来刷题的 vscode-leetcode:

还有上班摸鱼的同时还要关心能否从一颗“小韭菜”实现财富自由的「韭菜盒子」 leek-fund:

所以你可以看到,有了 WebView 来拓展能力,插件市场才会变得“百花齐放”,能满足各类人各类摸鱼的需求。但是上面项目的成功,也不仅仅靠的是我们本文介绍的简单的 WebView 的能力,如果你对上面几个项目有深挖的兴趣,可以直接clone 代码,一瞅到底,说不定下一个厉害的插件就是出自你手啦。

二、WebView 到底是什么

前面有提过 VS Code 允许我们在它给的规则之下可以自定义很多功能,但是视图这一块,其实我们自定义的范围非常小,这就限制了程序员们天马行空的创造力。但是自由的灵魂不会被眼前的困难打败,同行之间的心心相惜所以有了 WebView 的诞生。

当然这都是小编自己内心 OS 的,不过可以确定的是 WebView API 的存在允许在 VS Code 中扩展创建完全可自定义的视图。例如:内置的 Markdown 扩展使用 webviews 来呈现 Markdown 预览。Webviews 还可用于构建超出 VS Code 的本机 API 支持的复杂用户界面。

你也可以简单的把 WebView 理解为VS Code 内部的 iframe。WebView 可以在这个框架中渲染几乎所有的 HTML 内容,还可以使用消息传递与扩展进行通信。这种自由使得 webviews 非常强大,而且也拥有了一个全新的扩展范围。

三、创建一个简单的 WebView

从第一点的例子你就应该可以体会到 WebView 的功能拓展有多强大,它不仅可以作为自定义编辑器的视图来扩展提供自定义 UI 以编辑工作区中的任何文件。还允许在侧边栏或面板区域的 WebView 中继续呈现 WebView 视图等等。

如果你感兴趣,可以去官网继续学习。今天我们下文谈的主要还是最简单的一种方式:在编辑器中创建一个简单的 WebView 面板。

1、配置命令

第一步首先肯定是配置命令啦,我们再次打开package.json文件,新配置一个command:

配置完之后看一眼效果,让我们运行起来我们的插件:

你可以看到这个标题就是我们上面在package.json 上配置的“HelloGitHub webview”,或许有同学会对ViewColumn 这个配置疑惑。

那我们来看一下这里到底都有些什么值:

看不懂?没关系,我们实操一下,修改上面在extension.js 里的配置如下:

效果如下:

这里多了一个js 的文件其实没有什么意义,因为如果没有这个文件占编辑器的第一个ViewColumn 的话,其实效果和上面的配置是一样的,有了这个文件之后,我们的 WebView 才会在第二栏打开。这些单词是不是非常简单易懂?

2、初始化内容

现在我们就要切入最重要的部分啦,如何丰富 WebView 的内容呢?其实也很简单啦,把它看作一个 iframe 就好啦,那无非就是 HTML 的那些东西呗?so easy!

首先我们要有一个包含整个 HTML 内容的独立文件,为了好区分,我把它放在了这里:

配置了一个非常简单的网页内容,里面只有一个图片:

看一下效果:

这里要提醒大家的是,你配置的应该是一个完整的 HTML 文档。HTML 片段或格式错误的 HTML 可能会导致运行不成功,所以在进行复杂操作的时候一定要小心调试,多看控制栏哦。

3、更新内容

是的,我们现在要从编辑器对这个 WebView 做更新操作了!比如我们给这个 WebView 加一行文字,然后在编辑器里面加一个定时器,动态的去修改它。首先,修改我们的html 文件,它不再是一个静态的文本了,他要动起来就得接收一个变量,所以改成函数咯:

看一下我们的效果,是不是就变成一个动感十足的网页啦:

但是效果是实现了,你有没有发现我们实现的方法非常的“暴力”,是直接替换了整个html 的内容,类似于重新加载 iframe。所以要是换到复杂的页面,性能肯定是个非常严重的问题,就会导致非常多令人头大的性能问题。而且当用户关闭 WebView 面板时,WebView 本身是会被销毁的。如果尝试使用销毁的 WebView 会引发异常,比如我们上面的setInterval 会继续触发并更新panel.webview.html。

所以我们要避免这种情况出现:

4、消息传递

前面说过,你可以简单的把 WebView 理解成 iframe,那这也意味着它们都可以运行脚本。不过默认情况下 WebView 中禁用 JavaScript,你可以通过传入enableScripts: true 来启用。不过官网建议 WebView 应始终使用内容安全策略禁用内联脚本,所以我们这里就不做展开。但是这一点也不影响我们发挥 WebView 的巨大作用——消息传递。

WebView 调试

在消息传递内容之前,我觉得有必要说一下这个调试工具命令Developer: Toggle Developer Tools。你可以通过comand+p(MacOS)唤起这个开发者调试命令,可以帮你在调试 WebView 的时候“如鱼得水”,轻松捕获异常并 fix

当然你还可以在Elements 里面查看dom 的结构,简直就是太熟悉了~

首先我们先来了解一下如何从我们的插件应用向我们的 webview 传递消息。聪明的你一定猜到了对不对?没错就是postMessage!

修改我们的注册命令如下:

  1. 把createWebviewPanel 的变量存到一个新的变量上去
  2. 新增了一个用于消息传递的命令webview.doRefactor
  3. 同时因为在 HTML 内部需要监听message 的传递,所以我们必须确保开启脚本,也就是上文说的enableScripts:true
  4. 为了确保我们不眼花缭乱,这里也去掉了之前的定时器setInterval

为了防止有人在跟着敲的时候漏掉这一步,我决定还是再提醒一下~要在package.json 里面加上新注册的这个命令哦:

上面的够简单吧,我们来看一下效果,记得打开开发者调试工具,首先是用webview.start 命令打开 WebView:

运行webview.doRefactor 之后,我们就把我们的值传到了 WebView 里去啦:

WebView 还可以将消息传递回我们的扩展程序。

这主要是通过使用 WebView 的postMessage 内特殊的 VS Code API 对象上的函数来完成的。要访问 VS Code API 对象,需要在 WebView 内部调用acquireVsCodeApi 这个函数每个会话只能调用一次。

而且必须保留此方法返回的 VS Code API 实例,并将其分发给任何其他需要使用它的函数。

我们可以使用 VS Code API 的postMessage 方法在我们的插件中显示来自 WebView 的消息:

同时也需要在我们的插件代码里接收来自 WebView 的消息:

完整的代码如下,在打开 WebView 的时候就要将事件绑定都搞定:

接下来我们先看一下点击按钮前的样式:

来看一下我们点击按钮会发生什么“神奇”的事情呢?

那快乐的时光总是短暂的,又到了文章结束的时候啦。总的来说 WebView 就像是在 VS Code 里的 iframe,虽然可能在性能上有那么点弊端,但是却能够帮助我们实现很多丰富而又有趣的事情。

因此我们更要好好的利用这个功能,把它的力量发挥到极致。根据官网的描述,我们也要在使用的时候多注意以下几点:

  1. WebView 应该具有它所需的最少功能集。例如:如果不需要运行脚本,则不要设置enableScripts: true
  2. WebView 严格遵从 内容安全策略,所以在 WebView 中可加载和执行的内容都有一定的限制。例如:内容安全策略可以确保仅允许在 WebView 中运行的脚本列表,甚至告诉 WebView 只能加载https 图像。
  3. 出于安全考虑 WebView 默认无法直接访问本地资源,它在一个孤立的上下文中运行,想要加载本地图片、js、css 等必须通过特殊的vscode-resource: 协议,网页里面所有的静态资源都要转换成这种格式,否则无法被正常加载。
  4. 就像普通网页都要求的那样,在为 WebView 构建 HTML 时,必须清理所有用户输入。未能正确清理输入可能会导致内容注入,这可能会使你的用户面临安全风险。比如:文件内容、文件和文件夹路径、用户和工作区设置
  5. WebView 有自己的生命周期,如果在有极致体验的场景下发挥它的最大作用,建议去官网更加深入的学习一下

最后的最后,预告一下下一篇「VS Code」系列文章,也就是本入门系列最后一篇文章将会带大家体验更综合性的东西,给小编多一点点时间努力研究一下,期待我们下次再见咯!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
西南地区最大的家居卖场董事长被留置,三部客服电话两部“呼叫失败”

西南地区最大的家居卖场董事长被留置,三部客服电话两部“呼叫失败”

扬子晚报
2025-07-26 20:04:06
张碧晨与汪苏泷的争执,揭示了华晨宇的真实想法。

张碧晨与汪苏泷的争执,揭示了华晨宇的真实想法。

金牌舆情官
2025-07-26 20:47:28
因吃了继母瓜子被父亲毒打3年,老年求和时,儿子:你我生死无关

因吃了继母瓜子被父亲毒打3年,老年求和时,儿子:你我生死无关

浩舞默画
2025-07-26 09:22:18
暴雨黄色预警:北京、河北、云南等地局地有大暴雨

暴雨黄色预警:北京、河北、云南等地局地有大暴雨

界面新闻
2025-07-27 07:10:43
中南大学谭教授大战失足女,三战三败,学者的脸都让你丢尽了!

中南大学谭教授大战失足女,三战三败,学者的脸都让你丢尽了!

闲侃闲侃
2025-07-25 08:50:55
路都走不稳,全程开原音假唱,还想去鸟巢开演唱会,谁给的自信?

路都走不稳,全程开原音假唱,还想去鸟巢开演唱会,谁给的自信?

蒂蒂茱家
2025-07-26 11:01:31
心碎!溺亡学生赔偿金约590万,6名母亲眼泪哭干,前往东北大学!

心碎!溺亡学生赔偿金约590万,6名母亲眼泪哭干,前往东北大学!

壹月情感
2025-07-26 20:42:07
黑龙江一考生被新疆塔里木大学录取,路程将近5000公里,女孩崩溃

黑龙江一考生被新疆塔里木大学录取,路程将近5000公里,女孩崩溃

探源历史
2025-07-26 23:21:33
演唱会CEO出轨的最大赢家出现了,网友借出轨视频还清57万元学生贷款

演唱会CEO出轨的最大赢家出现了,网友借出轨视频还清57万元学生贷款

极目新闻
2025-07-26 19:33:37
少林寺方丈释永信被曝带走接受调查,少林寺回应:近日没看到他,等官方消息

少林寺方丈释永信被曝带走接受调查,少林寺回应:近日没看到他,等官方消息

FM93浙江交通之声
2025-07-26 23:55:50
吴晓波犀利点评宗庆后,施幼珍罕见生活照曝光,比杜建英幸福多了

吴晓波犀利点评宗庆后,施幼珍罕见生活照曝光,比杜建英幸福多了

壹月情感
2025-07-26 20:51:12
博主吐槽涠洲岛乱收费,除了呼吸都要钱,岛上民宿老板炸锅了

博主吐槽涠洲岛乱收费,除了呼吸都要钱,岛上民宿老板炸锅了

凡知
2025-07-25 12:13:22
日本一出租车司机驾驶时,抓起后座女乘客的脚狂舔!网友:可能是女方自愿的

日本一出租车司机驾驶时,抓起后座女乘客的脚狂舔!网友:可能是女方自愿的

西游日记
2025-07-26 14:23:57
千万粉丝网红旺仔小乔道歉

千万粉丝网红旺仔小乔道歉

扬子晚报
2025-07-26 21:25:20
起薪53万和月薪1.3万:港大医科生薪资碾压清北毕业生的残酷对比

起薪53万和月薪1.3万:港大医科生薪资碾压清北毕业生的残酷对比

李砍柴
2025-07-26 11:37:58
警方调查“上千万元金饰被洪水冲走”,金店:有人带探测仪找“黄金”,店方愿向归还者付酬金

警方调查“上千万元金饰被洪水冲走”,金店:有人带探测仪找“黄金”,店方愿向归还者付酬金

极目新闻
2025-07-27 02:16:51
史记:三上悠亚传

史记:三上悠亚传

一代文嚎
2025-07-26 14:54:35
释永信被调查风波:袈裟下的商业帝国

释永信被调查风波:袈裟下的商业帝国

无忌财谈
2025-07-26 21:38:54
网传少林方丈释永信被带走调查!知情者:或跟经济无关!

网传少林方丈释永信被带走调查!知情者:或跟经济无关!

兵叔评说
2025-07-26 19:25:12
脸都不要了,但还是低估了他们的无耻

脸都不要了,但还是低估了他们的无耻

胖胖说他不胖
2025-07-26 16:25:01
2025-07-27 07:47:00
HelloGitHub
HelloGitHub
带你玩GitHub开源社区
190文章数 5243关注度
往期回顾 全部

科技要闻

AI教父辛顿现身上海:人类如何不被AI杀掉

头条要闻

佩通坦再发声:虽无法履行总理职责 但一直在听取汇报

体育要闻

杨瀚森效力NBA期间 青岛男篮将暂存球队15号球衣

娱乐要闻

董璇首谈保释前夫细节!高云翔突然不回消息

财经要闻

刘煜辉:当下重要不是找确定性而是转折点

汽车要闻

"得房率"超90% 全新岚图知音空间信息曝光

态度原创

手机
时尚
本地
旅游
军事航空

手机要闻

REDMI 15渲染图曝光,三款配色 144Hz直屏

金童玉女离婚20年,怎么不算圆满大结局呢?

本地新闻

换个城市过夏天|风拂盐湖,躲进格尔木的盛夏清凉

旅游要闻

热闻|清明假期将至,热门目的地有哪些?

军事要闻

泰军方向26国发函:柬埔寨率先开火