摘要:項目概述一個基于的插件庫,按照函數(shù)的寫法,直接將生成的渲染到中。支持常規(guī)的滾動操作和一些基礎(chǔ)的元素事件綁定。受益于立即模式允許直接發(fā)送繪圖命令到。渲染是一種保留模式,保留模式是一種聲明性,用于維護繪制到其中的對象的層次結(jié)構(gòu)。
項目概述
一個基于Vue的virtual dom插件庫,按照Vue render 函數(shù)的寫法,直接將Vue生成的Vnode渲染到canvas中。支持常規(guī)的滾動操作和一些基礎(chǔ)的元素事件綁定。
github 地址: github
demo實例:demo
背景從一個小的需求說起:某一天,產(chǎn)品提了一個這樣的需求,需要制作一個微信活動頁,活動頁可以分享包含用戶相關(guān)信息的圖片。這些信息是需要從接口取的,而且每個人都不一樣。第一次碰到這種需求的時候,基本上都會去手擼canvasAPI去做渲染功能,這種情況的步驟大致如下:
寫一大串 dom template 標簽
渲染template成dom標簽
開始捕捉dom元素,繪制canvas
canvas 渲染圖片
面臨的主要問題是復(fù)用性太差,其次是性能上也有問題,用戶看到的界面不一定和正式渲染出的界面一致,可能存在渲染差異。作為一個有追求的前端,當(dāng)然得想想看有沒有更好的法子。于是乎了解到了一個html2canvas 這樣一個庫。但是總是感覺還是要轉(zhuǎn)成dom再去繪制,而且感覺性能和穩(wěn)定性也不是很好。
我們知道vue通過vnode實現(xiàn)了對不同端的渲染工作,那有沒有可能通過vnode實現(xiàn)對canvas的渲染呢?也就是說,沒有vnode -> html -> canvas 而是直接vnode -> canvas。 同時利用vue的數(shù)據(jù)驅(qū)動,來達到繪制的數(shù)據(jù)驅(qū)動。想法有了,下面開始實施。
調(diào)研這篇文章對此有詳細的介紹:60 FPS on the mobile web 這里簡單的概括一下:
canvas是一種立即模式的渲染方式,不會存儲額外的渲染信息。Canvas 受益于立即模式,允許直接發(fā)送繪圖命令到 GPU。但若用它來構(gòu)建用戶界面,需要進行一個更高層次的抽象。例如一些簡單的處理,比如當(dāng)繪制一個異步加載的資源到一個元素上時會出現(xiàn)問題,如在圖片上繪制文本。在HTML中,由于元素存在順序,以及 CSS 中存在 z-index,因此是很容易實現(xiàn)的。
dom渲染是一種保留模式,保留模式是一種聲明性API,用于維護繪制到其中的對象的層次結(jié)構(gòu)。保留模式 API 的優(yōu)點是,對于你的應(yīng)用程序,他們通常更容易構(gòu)建復(fù)雜的場景,例如 DOM。通常這都會帶來性能成本,需要額外的內(nèi)存來保存場景和更新場景,這可能會很慢。
看來canvas繪制頁面的研究,很久之前就已經(jīng)有人付出過研究了。而且性能還是很不錯的。那我們更要試試看,到底我們的想法能不能實現(xiàn)了!越來越期待....
開始canvas 的渲染其實也是一種嘗試,既然前人以及做了充分的實踐,那么我們便站在巨人的肩膀上去基于vue來實現(xiàn)一個數(shù)據(jù)驅(qū)動的canvas渲染。說做就做!(我們這里只提供思路,不做具體實現(xiàn)細節(jié)的討論,因為實現(xiàn)起來有點復(fù)雜,如果有興趣可以參考我的項目實現(xiàn),或者一起交流探討 )
處理vnode熟悉Vue源碼的應(yīng)該都知道,Vue通過render函數(shù),傳入createElement方法來構(gòu)造出一個vnode,通過發(fā)布--訂閱模式來實現(xiàn)對數(shù)據(jù)的監(jiān)聽,重新生成vnode。我們要做的就是在vnode這一層開始。所以,我們基于Vue源碼的方式,實現(xiàn)一個監(jiān)聽函數(shù),并混入Vue實例中:
Vue.mixin({ // ... created() { if (this.$options.renderCanvas) { // ... // 監(jiān)聽vnode中引用的變化,重新渲染 this.$watch(this.updateCanvas, this.noop) // ... } }, methods: { updateCanvas() { // 模擬Vue render 函數(shù) // 尋找實例中定義的 renderCanvas 方法,并傳入createElement方法 let vnode = this.$options.renderCanvas.call(this._renderProxy, this.$createElement) } })
這樣我們就可以愉快的在組件內(nèi)部使用:
renderCanvas (h) { return h(...) }canvas 元素處理
render 的vnode我們需要做額外的一些約束,也就是說我們需要怎么樣的渲染標簽,來渲染對應(yīng)的canvas元素(舉個
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96222.html
摘要:下面我們從前端基礎(chǔ)和底層原理開始講起。對于和這三個對應(yīng)于矢量圖位圖和圖的渲染來說,給前端開發(fā)帶來了重武器,很多小游戲也因此蓬勃發(fā)展。這篇文章受眾之大,后來被人重新整理并發(fā)布為,其中還包括中文版。 showImg(https://segmentfault.com/img/bVbjM5r?w=1142&h=640); 想閱讀更多優(yōu)質(zhì)文章請猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 這...
摘要:提供的圖表的確可以滿足大部分的需求,遵循了數(shù)據(jù)可視化的一些經(jīng)典范式。數(shù)據(jù)可視化已然成為了新的風(fēng)向標。數(shù)據(jù)團隊的前端要做的就是用最科學(xué)的方法向用戶展示最形象的圖表,而這,也是我們前行的目標。 前言 也許很多人都會覺得奇怪,在這樣一個更多以后臺數(shù)據(jù)分析為主的公司,為什么需要一個專注于前端的團隊?今天這篇文章就來講述那些年我們錯過的前端數(shù)據(jù)可視化,以此來解答這個問題。 需求 那么,在我們的項...
摘要:值得一提的是,微信瀏覽器的內(nèi)核,也即是瀏覽器內(nèi)核已經(jīng)內(nèi)置了很多游戲引擎比如白鷺游戲引擎與,供開發(fā)者開發(fā)游戲,所以長時間來看,微信瀏覽器的畫布性能將會越來越強大。showImg(https://user-gold-cdn.xitu.io/2019/5/17/16ac3f6acd651e01); 1、什么是流暢的用戶體驗? 游戲的開發(fā)界有一個理論,就是當(dāng)動畫或者交互響應(yīng)達到60FPS(60幀每秒...
摘要:函數(shù)依次做了這幾件事調(diào)用函數(shù),對比新舊兩個,根據(jù)兩者的不同得到需要修改的補丁將補丁到真實上當(dāng)計數(shù)器小于等于的時候,將加,再繼續(xù)下一次當(dāng)計數(shù)器大于的時候,結(jié)束下面我們來實現(xiàn)函數(shù)和函數(shù)。 上集回顧 【React進階系列】從零開始手把手教你實現(xiàn)一個Virtual DOM(二) 上集我們實現(xiàn)了首次渲染從JSX=>Hyperscript=>VDOM=>DOM的過程,今天我們來看一下當(dāng)數(shù)據(jù)變動的時...
閱讀 3550·2023-04-26 00:16
閱讀 1367·2021-11-25 09:43
閱讀 3836·2021-11-23 09:51
閱讀 2975·2021-09-24 09:55
閱讀 726·2021-09-22 15:45
閱讀 1402·2021-07-30 15:30
閱讀 3072·2019-08-30 14:04
閱讀 2254·2019-08-26 13:46