<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Vue組件庫設計 | Vue3組件在線交互解釋器

          共 2545字,需瀏覽 6分鐘

           ·

          2022-03-08 00:17

          作者:耗子君QAQ

          原文:https://juejin.cn/post/7064864648729722887


          大家好?。?,好久不見,過年還開心嗎?作者在這兒先給大家拜個晚年,祝大家晚年幸福QAQ。翻過這個年,發(fā)現(xiàn)Vue最新版本的官方文檔[1] 正式上線了,大家都去圍觀過了么?除了新的界面和暗黑主題之外,最大的亮點莫過于這個Vue Playground[2],它提供一個在線的可交互編輯環(huán)境,實現(xiàn)在線上直接調(diào)試文檔提供的案例代碼, 而且十分的輕量。

          image.png
          image.png

          什么是REPL(交互式解釋器)

          REPL(Read Eval Print Loop:交互式解釋器) 表示一個我們可以在其中輸入命令或者代碼,并且可以接收到解釋器響應的一個環(huán)境。主要有四大特征組成。

          • 讀取 Read - 讀取用戶輸入,解析輸入的數(shù)據(jù)結構并存儲在內(nèi)存中。
          • 執(zhí)行 Eval - 執(zhí)行輸入的數(shù)據(jù)結構
          • 打印 Print - 輸出結果
          • 循環(huán) Loop - 循環(huán)操作以上步驟直到用戶退出。

          也就是說我們現(xiàn)在所用的所有代碼編輯器其實都是一個REPL(交互式解釋器)

          什么是在線REPL(交互解釋器)

          我們?nèi)粘J褂玫拇a編輯器大多是通過軟件包下載到本地安裝的,因為在本地系統(tǒng)環(huán)境下可以得到更好更流暢的交互和編譯體驗。但是在某些場景下,網(wǎng)頁版的交互解釋器更具有優(yōu)勢,比如

          • 我有一段代碼,我想分享給別人看看,通過網(wǎng)頁URL的形式明顯比傳輸代碼包的形式更方便
          • 我寫了一個組件,需要有個預覽地址或者內(nèi)嵌一個iframe預覽鏈接放在我的文檔里面
          • 我想在最簡環(huán)境下復現(xiàn)一個bug,但是我又覺得重新開一個項目太麻煩,我希望有一個網(wǎng)頁,打開就能直接寫代碼,最好我常用的依賴都內(nèi)置在上面
          • 可以把在線編輯的代碼下載下來在本地運行

          很巧,上面這些場景Vue的Playground都比較好的解決了

          存在的問題

          雖然Vue的Playground具備了在線交互解釋器的所有特征,但是他只預置了Vue的運行環(huán)境,假設我想預置更多的模塊,比如我想讓他天然支持lodash,支持組件庫, 支持各種工具函數(shù),應該怎么做呢?

          作者自己是做開源組件庫的,作業(yè)已經(jīng)寫好了,有興趣抄作業(yè)并且沒興趣看實現(xiàn)的同學們可以直接看這里了,理論上你們也可以很輕易的抄出來一個屬于你自己的在線編輯器

          • Varlet UI Playground[3]
          • 源碼[4]
          image.png

          如何實現(xiàn)的

          首先打開Vue Playground的源碼可以發(fā)現(xiàn),整個交互解釋器的核心在@vue/repl這個依賴中,Vue Playground也只是對@vue/repl進行了集成。

          我們可以看到尤大把@vue/repl的生命周期抽象成了一個class,并包含在了@vue/repl中,我們再去看它的具體實現(xiàn), 只需要照葫蘆畫瓢的實現(xiàn)一下這個class,并且加入我們的預置的代碼,就可以了,有興趣的可以看看下面提供的修改前后,對比一下。

          Vue Playground源碼[5]

          修改前\@vue/repl提供的class[6]

          修改后的class[7]

          注入依賴列表

          如下圖所示,@vue/replclass只預置了vue,如果你需要預置更多的第三方模塊,可以在這里注入(合并對象即可)。需要特別注意的是,因為整個解釋器基于Vite,所以依賴的第三方模塊必須是一個esm模塊。

          image.png

          作者的版本注入列表大概是這樣的。key是模塊別名,value是模塊的cdn地址,因為作者這里直接將依賴放到了public目錄下一起打包了,所以使用了相對路徑。

          {
            '@varlet/ui''./varlet.esm.js',                        
            '@varlet/touch-emulator''./varlet-touch-emulator.js'
          }
          復制代碼

          注入預置文件

          在確定了依賴之后,就可以添加預置的文件和代碼了,預置的文件存儲在state.files中,我們可以推入自己需要追加的文件

          image.png

          作者是這樣追加的

          image.png

          然后...

          然后就可以在解釋器中正常訪問預置的文件了,文章只是方便大家理解其中的重點,推薦大家去看源碼,源碼很短,作者抄Vue官方的案例到上線也就花了一個多小時,但是帶來的收益確實非常巨大。

          作者很也推薦在企業(yè)內(nèi)部搭建這樣的在線編輯平臺,集成一些常用的模塊來做一些漏洞反饋,分享代碼,寫一些草案之類的事情,關鍵的關鍵,也花不了幾分種的時間。

          最后

          作者的團隊在積極的維護著我們的開源項目Varlet,它是一個基于 Vue3 開發(fā)的 Material 風格移動端組件庫,Varlet UI Playground也正式上線了,歡迎大家使用它來給我們做bug反饋,或者作為一個把玩我們組件庫的一個快捷途徑(畢竟很多人懶得去裝依賴),也同樣感謝社區(qū)對我們的支持和幫助,新的一年我們會再接再厲。

          支持我們或者覺得我們做的還不錯的話,下方有我們的倉庫地址,幫我們點一個小小的star,同學們的支持是我們開源的全部動力。

          Github倉庫地址[8] 文檔地址[9]

          最后



          如果你覺得這篇內(nèi)容對你挺有啟發(fā),我想邀請你幫我三個小忙:

          1. 點個「在看」,讓更多的人也能看到這篇內(nèi)容(喜歡不點在看,都是耍流氓 -_-)

          2. 歡迎加我微信「qianyu443033099」拉你進技術群,長期交流學習...

          3. 關注公眾號「前端下午茶」,持續(xù)為你推送精選好文,也可以加我為好友,隨時聊騷。


          點個在看支持我吧,轉(zhuǎn)發(fā)就更好了




          瀏覽 64
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线看a网站 | 狠狠色色 | 51啪啪| 经典三级先锋影音 | 婷婷五月天丁香网 |