记一次Vue.js开发VSCode插件所遇的问题

前段时间,公司学习小组起建了一个项目:开发VSCode的插件
前期研究方案发现VSCode是基于Electron开发的,所以首要研究的技术是Electron和VSCode Extension的相关API。本人之前没有任何使用VSCode的经验,前端开发目前更多接触Vue.js。基于学习交流的前提下,小组成员一致同意使用Electron+Vue.js的方案,学习目标也定在这两个前端框架上。(至于这两个框架是什么,大家可以自行Google)

技术思路

经研究发现,VSCode-Extension-API已经足够开发本次项目的需求,无需接入Electron API,项目的主要UI实现都是基于Vue.js(由于目前的项目是二次开发,可以使用许多原有的js文件,使用Electron重写不太显现实,所以考虑用Vue来写部分页面,然后接入其他部分已有的文件),当然你也可以考虑只是使用Electron去开发。
本项目中创建了两个工程,一个是VSCode插件工程,另一个是Vue项目工程,其中Vue工程嵌入在VSCode插件工程中,然后使用VSCode的webview加载Vue构建的js文件

踩坑一:VSCode Webview无法加载相对路径文件

VSCode Webview只支持加载遵循vscode-resource协议的文件,但Vue使用webpack打包出来index.html文件中,引入js或css文件的路径是相对路径,我们需要进行修改,当然你可以手动去修改,但是考虑到每次build之后都要手动去更改的话,效率是非常低的。所以我们在读取index.html文件的内容之后,进行路径替换,代码如下:

function getWebContent(context:vscode.ExtensionContext,uri:string){
    const rootPath = context.extensionPath;
    const abPath = path.join(rootPath,uri);
    const dirPath = path.dirname(abPath);
    var html = fs.readFileSync(abPath,'utf-8');
    // vscode不支持直接加载本地资源,需要替换成其专有路径格式,这里只是简单的将样式和JS的路径替换
    html = html.replace(/(href=\.|src=\.)/g, function(m, ops, orgin){
        //这里去除后缀. ,然后再合并绝对路径,记得使用vscode-resource scheme
        const path = m.substring(0,m.length-1) +vscode.Uri.file(dirPath).with({ scheme: 'vscode-resource' }).toString();
        return  path;
    });
    console.log(html);
    return html;
}

踩坑二:.CSS文件的样式无法正常加载

Vue打包出来的CSS文件在VSCode中的Webview中可能无法显示(低版本VSCode中有问题),在VSCode中调试网页(在插件命令中打开,不是F12),发现CSS文件是已经正确加载了的。当你遇到这个问题的时候,建议你直接把CSS代码拷贝过来,粘贴到index.html中。目前尚未查明原因。

踩坑三:不能使用acquireVsCodeApi()返回局部vscode实例

由于需要Vue的实例能与VSCode的webview通信,在VSCode Extension API中提供了专用的全局vscode实例,也就是通过js函数acquireVsCodeApi()返回。所以你需要在Vue将acquireVsCodeApi()返回的实例设为全局变量,避免重复生成而报错。

踩坑四:不能直接通过import方法将厚重的js文件引进到Vue中

项目由于需要引进一些之前的js文件,而这些js文件是由webpack打包出来的,假如在vue中直接通过import加载这些js文件,会提示js体积过大(大于500kb),构建过程失败。此时你需要使用webpack 的 extenals 扩展技术引入这些无需打包的文件,代码如下:
假设你有个a.js的文件,export为 export_xxx,你需要将这个文件拖到vue工程下的static路径中,然后webpack会在构建中在index.html中自动引入这个文件。你需要在webpack.dev.config.js和webpack.prod.config.js中加入

  output: {
    #浏览器中使用
    libraryTarget: "umd"
  },
  externals:{
    'vue_instance': 'export_xxxx'
  },

如果你想引用这个文件的内容,你需要在使用过的地方加入

import $ from vue_instance
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容

  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    柴东啊阅读 15,803评论 2 140
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    小姜先森o0O阅读 9,225评论 0 72
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    你猜_3214阅读 10,967评论 0 118
  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,122评论 0 1
  • 那是一天酷暑烈阳 那是一天激情昂扬 陌生却兴奋 紧张又期望 ...
    青竹僧阅读 148评论 1 2