記一次Vue.js開(kāi)發(fā)VSCode插件所遇的問(wèn)題

前段時(shí)間步藕,公司學(xué)習(xí)小組起建了一個(gè)項(xiàng)目:開(kāi)發(fā)VSCode的插件锐借。
前期研究方案發(fā)現(xiàn)VSCode是基于Electron開(kāi)發(fā)的火欧,所以首要研究的技術(shù)是Electron和VSCode Extension的相關(guān)API弛槐。本人之前沒(méi)有任何使用VSCode的經(jīng)驗(yàn),前端開(kāi)發(fā)目前更多接觸Vue.js署驻。基于學(xué)習(xí)交流的前提下健霹,小組成員一致同意使用Electron+Vue.js的方案旺上,學(xué)習(xí)目標(biāo)也定在這兩個(gè)前端框架上。(至于這兩個(gè)框架是什么糖埋,大家可以自行Google)

技術(shù)思路

經(jīng)研究發(fā)現(xiàn)宣吱,VSCode-Extension-API已經(jīng)足夠開(kāi)發(fā)本次項(xiàng)目的需求,無(wú)需接入Electron API瞳别,項(xiàng)目的主要UI實(shí)現(xiàn)都是基于Vue.js(由于目前的項(xiàng)目是二次開(kāi)發(fā)征候,可以使用許多原有的js文件钦听,使用Electron重寫(xiě)不太顯現(xiàn)實(shí),所以考慮用Vue來(lái)寫(xiě)部分頁(yè)面倍奢,然后接入其他部分已有的文件)朴上,當(dāng)然你也可以考慮只是使用Electron去開(kāi)發(fā)。
本項(xiàng)目中創(chuàng)建了兩個(gè)工程卒煞,一個(gè)是VSCode插件工程痪宰,另一個(gè)是Vue項(xiàng)目工程,其中Vue工程嵌入在VSCode插件工程中畔裕,然后使用VSCode的webview加載Vue構(gòu)建的js文件衣撬。

踩坑一:VSCode Webview無(wú)法加載相對(duì)路徑文件

VSCode Webview只支持加載遵循vscode-resource協(xié)議的文件,但Vue使用webpack打包出來(lái)index.html文件中扮饶,引入js或css文件的路徑是相對(duì)路徑具练,我們需要進(jìn)行修改,當(dāng)然你可以手動(dòng)去修改甜无,但是考慮到每次build之后都要手動(dòng)去更改的話扛点,效率是非常低的。所以我們?cè)谧x取index.html文件的內(nèi)容之后岂丘,進(jìn)行路徑替換陵究,代碼如下:

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不支持直接加載本地資源,需要替換成其專(zhuān)有路徑格式奥帘,這里只是簡(jiǎn)單的將樣式和JS的路徑替換
    html = html.replace(/(href=\.|src=\.)/g, function(m, ops, orgin){
        //這里去除后綴. 铜邮,然后再合并絕對(duì)路徑,記得使用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文件的樣式無(wú)法正常加載

Vue打包出來(lái)的CSS文件在VSCode中的Webview中可能無(wú)法顯示(低版本VSCode中有問(wèn)題)寨蹋,在VSCode中調(diào)試網(wǎng)頁(yè)(在插件命令中打開(kāi)松蒜,不是F12),發(fā)現(xiàn)CSS文件是已經(jīng)正確加載了的已旧。當(dāng)你遇到這個(gè)問(wèn)題的時(shí)候秸苗,建議你直接把CSS代碼拷貝過(guò)來(lái),粘貼到index.html中评姨。目前尚未查明原因难述。

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

由于需要Vue的實(shí)例能與VSCode的webview通信,在VSCode Extension API中提供了專(zhuān)用的全局vscode實(shí)例吐句,也就是通過(guò)js函數(shù)acquireVsCodeApi()返回胁后。所以你需要在Vue將acquireVsCodeApi()返回的實(shí)例設(shè)為全局變量,避免重復(fù)生成而報(bào)錯(cuò)嗦枢。

踩坑四:不能直接通過(guò)import方法將厚重的js文件引進(jìn)到Vue中

項(xiàng)目由于需要引進(jìn)一些之前的js文件攀芯,而這些js文件是由webpack打包出來(lái)的,假如在vue中直接通過(guò)import加載這些js文件文虏,會(huì)提示js體積過(guò)大(大于500kb)侣诺,構(gòu)建過(guò)程失敗殖演。此時(shí)你需要使用webpack 的 extenals 擴(kuò)展技術(shù)引入這些無(wú)需打包的文件,代碼如下:
假設(shè)你有個(gè)a.js的文件年鸳,export為 export_xxx趴久,你需要將這個(gè)文件拖到vue工程下的static路徑中,然后webpack會(huì)在構(gòu)建中在index.html中自動(dòng)引入這個(gè)文件搔确。你需要在webpack.dev.config.js和webpack.prod.config.js中加入

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

如果你想引用這個(gè)文件的內(nèi)容彼棍,你需要在使用過(guò)的地方加入

import $ from vue_instance
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市膳算,隨后出現(xiàn)的幾起案子座硕,更是在濱河造成了極大的恐慌,老刑警劉巖涕蜂,帶你破解...
    沈念sama閱讀 221,406評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件华匾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡机隙,警方通過(guò)查閱死者的電腦和手機(jī)蜘拉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)黍瞧,“玉大人诸尽,你說(shuō)我怎么就攤上這事原杂∮〔” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,815評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵穿肄,是天一觀的道長(zhǎng)年局。 經(jīng)常有香客問(wèn)我,道長(zhǎng)咸产,這世上最難降的妖魔是什么矢否? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,537評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮脑溢,結(jié)果婚禮上僵朗,老公的妹妹穿的比我還像新娘。我一直安慰自己屑彻,他們只是感情好验庙,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著社牲,像睡著了一般粪薛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搏恤,一...
    開(kāi)封第一講書(shū)人閱讀 52,184評(píng)論 1 308
  • 那天违寿,我揣著相機(jī)與錄音湃交,去河邊找鬼。 笑死藤巢,一個(gè)胖子當(dāng)著我的面吹牛搞莺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掂咒,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼腮敌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了俏扩?” 一聲冷哼從身側(cè)響起糜工,我...
    開(kāi)封第一講書(shū)人閱讀 39,668評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎录淡,沒(méi)想到半個(gè)月后捌木,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫉戚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評(píng)論 3 340
  • 正文 我和宋清朗相戀三年刨裆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彬檀。...
    茶點(diǎn)故事閱讀 40,438評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帆啃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窍帝,到底是詐尸還是另有隱情努潘,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評(píng)論 5 349
  • 正文 年R本政府宣布坤学,位于F島的核電站疯坤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏深浮。R本人自食惡果不足惜压怠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望飞苇。 院中可真熱鬧菌瘫,春花似錦、人聲如沸布卡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,279評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)羽利。三九已至宫患,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背娃闲。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,395評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工虚汛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人皇帮。 一個(gè)月前我還...
    沈念sama閱讀 48,827評(píng)論 3 376
  • 正文 我出身青樓卷哩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親属拾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子将谊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫(kù) m...
    柴東啊閱讀 15,860評(píng)論 2 140
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫(kù) m...
    小姜先森o0O閱讀 9,507評(píng)論 0 72
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫(kù) m...
    你猜_3214閱讀 11,074評(píng)論 0 118
  • 基于Vue的一些資料 內(nèi)容 UI組件 開(kāi)發(fā)框架 實(shí)用庫(kù) 服務(wù)端 輔助工具 應(yīng)用實(shí)例 Demo示例 element★...
    嘗了又嘗閱讀 1,154評(píng)論 0 1
  • 那是一天酷暑烈陽(yáng) 那是一天激情昂揚(yáng) 陌生卻興奮 緊張又期望 ...
    青竹僧閱讀 163評(píng)論 1 2