導航:首頁 > 源碼編譯 > vue3源碼解析書

vue3源碼解析書

發布時間:2022-06-29 14:28:53

『壹』 vue的hook能將同一功能的代碼單獨抽成1個方法嗎

作者 | 零一 責編 | 張紅月
rex的作者是誰?Dan,他的全稱叫做Dan Abramov,同時他也是React的核心成員之一
為什麼我標題說Dan位元組一面掛了呢?
因為昨天晚上位元組的web infra團隊連線了遠在國外的Dan,並且提前收集了200多個網友的問題,從中精選了20幾個,讓Dan來給一一解答,在其中一個問題的回答中,Dan說他從來沒用過Vue,hhhhh,所以有小夥伴就說搞了個段子
Q1: 如何看待rex
我不會推薦任何一個庫,要看使用場景吧。比如針對數據和緩存的庫,就該用對應的庫
Q2: 很多開發者認為react的入門很難,有沒有什麼快速上手的方法
我認為這取決於大家為什麼認為React難,可能難點不同,因為你剛學javascript,這是你的入門,那就會覺得React很難。對於其它庫例如Vue,你可以運用一些已經封裝好的方法,慢慢的使用中你可以學會一些東西。而react你一上手就要編程,這就是難點所在。如果有人覺得入門很難的話,可能就意味著他們不知道怎麼去做一個單頁的應用程序,可能不是react本身的問題,但他們會認為是react難以理解的問題。可以先把javascript熟悉了,再來用React就很容易了。
Q3: 對於已經開始用react的人,給一些建議避坑
很重要的一點就是你要用Hook的話,我們推薦使用正確的方法把它們引入你的項目當中。對於react來說有兩點,一點是可模仿性,新手可以去學別人的庫,參考著去學習。另一點就是對於react渲染來說,你可以把它想成是一個計算,你不需要做很多工作,你只需要返回你需要的react UI即可,這很重要
Q4: 現在react更多關注的是函數編程,js卻不是這樣的
我認為react的確比其它工具更加偏向於函數,但真正喜歡函數編程的開發者會認為react並不是一個函數編程的工具。我們也不會把組件分解成一個個很小很小的函數。React其實是借用了一些函數的理念,並且基於函數,但不完完全全是一個函數編程工具
Q5: 現在前端發展迅速,你是怎麼跟上技術發展速度的
我不是這樣想的,但有可能是我沒有跟緊潮流,可能是每隔幾年就有這樣的趨勢,但很多像現在的新技術跟以前的技術概念其實很相似,這種情況下,我不會被這種新興的技術驚到,因為他們對我來說沒有什麼太大的不同,所以這其實就是對老事物一種新的理解,我們圍繞一些基本概念做一些開發而已。
Q6: react在未來如何進步呢?
你認為現在存在哪些重大的問題呢?對我來說我會注意到很多問題都是不同的,不同的問題用不同的手段去解決,其中一個問題比如說, 動畫領域我們還沒有涉足,很多ui框架會針對一些不同的問題提供一些解決方案, 我的感覺是這些領域看起來不一樣,但其實都類似,我們可以互相結合。 以後我們可能會有一個組件工具,或者提供更多的功能,這些功能是緊密結合的,這是我們希望的。
Q7: Concurrent mode,從18版本開始最新被放出來的模式,設計時面臨的挑戰有哪些?
我想說當前還沒有被發行出來,所以我們可以去官網看一下blog,上面有關於版本18更多的信息,關於他有什麼內容,信息等等。我們現在有相關的工作小組,並且每天從社區邀請50個人左右幫我們一起合作去發行18版本,保證整個生態系統和他發行的版本是一致的,我們在這方面已經有了很多的討論,大家都可以閱讀,評論,獲取更多的信息。我們所做出來的一個大的改變就是我們沒有mode了,它不叫concurrent mode,而負責的是render的一種機制,他不會有一個延長等待的時間,比如你如果有輸入,他也可以同步的處理,其實他是一種同步多線的處理,這也是我們一直想攻克的難關。這才有了我們現在的18 Alpha版本。
Q8: 很多人會將react跟vue做對比,你是怎麼看待這兩個框架的?
我自己沒用過vue的(what???React核心成員之一竟然沒有用過Vue,此處@尤大),所以沒法做很細節和全面的對比,從設計方法上來說,我們存在一些區別,比如vue直接改變狀態,這有一些好處,你可以隨心所欲的想寫代碼就寫代碼,很多人都很喜歡這樣的方式,但對於我們來說,我們會做一些transition,我們方式不一樣,所以從技術來說我們有很大的差異,是兩種完全不同的方向。vue可能是基於50年的編程的沉澱,對於我們來說基於我們自己的做法,當然他們的做法在技術上來說也是很棒的,vue更多會用一些實用的技術解決實用的問題,比如提供更加便利的動畫的解決方案,更便利的模板,但對於react來說,我們不想去做一些我們沒有辦法充分相信的解決方案,所以我們給出的東西可能沒有那麼直接便利,比如我們想做動畫功能的話,我們並不會去標准化一些存在的東西,我們會有自己對於動畫的想法,這跟現在很多框架都是不一樣的,vue可以更快的拿到你所想要的,但react我們有更豐富的庫,你就可以學會怎麼去做這些事,這就像安卓和ios一樣,ios其實很多功能都不包括的,但是它可以幫助你可以更好的完成一些事情。
Q9: vue3停止用flow了,react還用flow?
我並不認為這是一個很關鍵的問題,我認為這主要取決於庫本身是怎麼寫的。他更多的是關注框架本身如何建立的,跟用戶沒啥關系,它並不會影響用戶使用react的過程,我們並不在意這個點,我們並不是不能改變,只是不太值得
Q10: 你對一些新框架有什麼看法,他們都沒有使用vdom
我並沒有多麼細致的使用過這些工具,沒有什麼深度的見解,的確有很多的設計他們是很棒的,而且大家都走的不同的路,可能是完全相反,對於vdom這個詞我不太喜歡,大家理解都不太一樣,我認為這個跟性能沒什麼關系,我不太使用這個稱呼,因為這使人很困惑,他指的是UI的內存,我們想讓他保留下來,因為他能給我們更多的選擇。對於一些復雜的功能,我們的解決方式可能會使用UI的不同版本,比如最左邊是0%,右邊是100%,中間會有一個滾動條,在調整滾動條只需要調整幀就好了,我們如何產生這種幀,就需要很多的ui進行協助,這就需要vdom的協助,這和性能的關系不大。假設我們要看整個app的性能,需要看你每個組件的功能是什麼,它可以做什麼,看看app背後的代碼是什麼,而不是單純對幾行的代碼做分析和解讀。
Q11: 目前用的大多是vue和react,你對於前端來說如何看待五年後的前端領域
我對這個問題的理解是,ui代碼有很多不同的方式,比如放在伺服器上還是客戶端上,如何去整理它,那我覺得在這方面 框架也可以解決所有的問題,我覺得next.js是可以把react相關的觀念去簡化,所以他有可能會取代目前的功能,如果大家對Server Component 感興趣的話,你的思考模式是圍繞組件進行的,這是可控的,那你也可以做出自主的決定,吧什麼樣的組件在伺服器去運轉,不會佔用你太長的時間,代碼也是一樣的,他們會更加的清晰,你就不需要去思考你是在做渲染還是做別的事情,這是一種很不錯的優化。
Q12: 對於找工作的同學來說,什麼樣的科技公司更吸引人?
我覺得你身邊的人比較厲害,你能學到很多東西,這是良性的工作環境,可以學習新的知識,而且還需要你的自主性會比較強,不能命令式的工作(其實當時彈幕里全是一個字:錢!)
Q13: 說說你的個人經歷,你剛加入Facebook,如何學習react的相關知識的
react代碼其實比較復雜,在最開始需要研究代碼,去熟悉,主要還是去了解整個的架構,把它了解透徹了沒問題了,就Ok了。還會給一些人提供幫助,我會在一些公開的平台上幫助別人解決問題,回答他們的問題,在那段時間閱讀了各種人提出的問題,幾千條,這是一個非常好的方法幫我熟悉自己所做的東西,幫他們解決問題,也對自己有幫助。
Q14: react核心團隊或社區如何維護這么大的code
我們遇到很多有趣的挑戰,我並不認為我們的code很大,我們也是在慢慢的學習如何運行這樣的項目,我們有超過5000次的測試。react用戶只會用來rendering,不會深入到我們庫里。如果你去看我們的代碼,我們可能會有一個老js和新Js(即源碼文件中以.old.js或.new.js為結尾的文件),它們基本上是相同的,我們這么做是為了應對一些有風險的改變,我們沒有看到回歸,我們就會把新的改變復制到舊的當中,這聽起來很奇怪,但效果還不錯。
我認為Facebook就像一個測試機器一樣,我們會在工作中驗證,我們看到了百分之一的回歸,評論下降了1%,我們就花了一個月對各個組件做實驗區檢測,發現了一個bug並解決了。即使當時下降了1%,但是對於Facebook來說是一個很大的損失。
Q15: 作為react用戶,我們去看源碼,是不是一個好的做法
我並不認為很有必要,因為很難去理解我們的源碼,如果你直接去讀,你可能會很困惑,因為你不了解底層的框架,有人跟你解釋一下可能更好一些。我經常做的一件事,就是用一個debugger去看這些代碼不同的去向,比如在chrome performance里看到函數代碼的棧,你可以看到每一個函數發生的不同的事情,比如你在升級的時候就可以看到一些新的事件和功能,所以可以從性能這個方面看到這些基本的功能的目的是什麼
Q16: 你是如何保持對react的熱情的
我本身就很喜歡,react理念跟我對ui代碼的想法很一致,我在facebook之前,在初創公司,當時直接用了react,當時不流行,但給我們工作帶來了很大的便利,我們還可以清楚地看到各個功能的狀態,我們經常問自己想在屏幕上看到的功能是什麼,react就能解決當下這個問題
Q17: 如何像你一樣優秀,前端好的學習資源分享
我並不確定我有多麼優秀,如果你認為優秀可以做一個非常好看的app,那我並不是,所以說我並不是很確定大家想聽到什麼樣的建議。
建議的話,我覺得你可以不用vue或react這樣的框架去寫一些ui框架,或者做一些小游戲,比如貪吃蛇,這樣去促使你去做,即使它有一些復雜度,但能從中吸取一些經驗。
Q18: 休閑時間會做什麼呢?
偶爾玩玩堡壘之夜,但是也很久沒玩游戲了,平時就聽聽歌、散散步
Q19: 對於中國開發者的建議
我覺得我不太確定一些事,我不知道react在中國多少人在用,在這個社區里,大家可以有不同的選擇,非常感謝他們在翻譯上做出的工作(此處@印記中文),我不太確定react在未來能否風靡中國,希望大家去多推薦一下react,讓更多人了解到,我們將來做出更多的改變。
Q20: 未來是否願意會在中國的react社區更多得活躍一下
必須滴!
最後辛苦Dan啦,全程一個半小時一直在解答大家的問題,一口水都沒喝。而且他回答問題都回答得非常詳細,都盡可能地多說一些,所以遠不止我記錄的那麼點文字,真的是很有愛了~ 期待下一次Dan與國內程序員的互動!!!也感謝 Web infra 團隊提供的這次機

『貳』 vue emit 有多個參數該如何寫

詳細步驟如下:

一、$emit傳遞一個參數時

子組件:

this.$emit('closeChange',false)。

父組件:

<posilCom @closeChange="closeCom($event)"></posilCom>closeCom(msg) { this.msg = msg;}。

二、$emit傳遞多個參數時

子組件:

this.$emit('closeChange',false,true)。

父組件:

<posilCom @closeChange="closeCom(arguments)"></posilCom>closeCom(msg)this.msg1 = msg[0]; this.msg2 = msg[1]。




(2)vue3源碼解析書擴展閱讀:


一、vue emit 3個參數詳細描述:

1、子組件的JS

**/define(function(require, exports, mole){var $ = require("lib_cmd/zepto-cmd"),

Vue = require('lib_cmd/vue-cmd'),

main = require("js_cmd/main-cmd"),

var vm= Vue.component('myaddress', {

template: ' <div data-role="data-widget" data-widget="address-editor"

class="address_mask" id="address-editor"></div>' props:["address","ids"],

methods: {created: function () mole.export= vm;/*注冊名為「myaddress」的組件 ,從父組件傳遞過來兩個數據"address","ids"*/

2、父組件EJS頁面

<%- include ../../header %>

<link href="/css/vd/activity/myAward.css?v=<%= config.version %>" rel="stylesheet" />

<div data-role="container"

class="body <%= pageName %>" id="myAward"><myaddress :address="editAddr"

:ids="ids"></myaddress>

</div><script> seajs.use('js_cmd/vd/activity/myAward-cmd');</script>

<%- include ../../footer %>

/*在定義的組件 「myaddress」中綁定兩個父組件的數據 "editAddr" "ids"*/

3、父組件的JS頁面

* Created by youchen.ma on 2017/6/21.

*/define(function (require, exports, mole)

var $ = require("lib_cmd/zepto-cmd"),

Vue = require("lib_cmd/vue-cmd"),

main = require("js_cmd/main-cmd"),

Address = require('js_cmd/vd/venue/widget/venueEditAddress-cmd') //引入子組件的JS文件

二、vue emit定義:

主要內容包括數據綁定、指令、表單控制綁定、過濾器、組件、表單驗證、服務通信、路由和視圖、vue cli、測試開發和調試、源代碼分析以及主流的打包和構建工具。內容全面,講解詳細,示例豐富,適合各級開發人員。


『叄』 vue前端面試題有哪些呢

文章中給你列舉了部分的面試題,這些都是公司面試常遇到的,還有需要的還可以自己去查閱一下資料
1、active-class是哪個組件的屬性?嵌套路由怎麼定義?
答:vue-router模塊的router-link組件。
2、怎麼定義vue-router的動態路由?怎麼獲取傳過來的動態參數?
答:在router目錄下的index.js文件中,對path屬性加上/:id。 使用router對象的params.id
3、vue-router有哪幾種導航鉤子?
答:三種,一種是全局導航鉤子:router.beforeEach(to,from,next),作用:跳轉前進行判斷攔截。第二種:組件內的鉤子;第三種:單獨路由獨享組件
4、scss是什麼?安裝使用的步驟是?有哪幾大特性?
答:預處理css,把css當前函數編寫,定義變數,嵌套。 先裝css-loader、node-loader、sass-loader等載入器模塊,在webpack-base.config.js配置文件中加多一個拓展:extenstion,再加多一個模塊:mole裡面test、loader
4.1、scss是什麼?在vue.cli中的安裝使用步驟是?有哪幾大特性?
答:css的預編譯
使用步驟:
第一步:用npm 下三個loader(sass-loader、css-loader、node-sass)
第二步:在build目錄找到webpack.base.config.js,在那個extends屬性中加一個拓展.scss
第三步:還是在同一個文件,配置一個mole屬性
第四步:然後在組件的style標簽加上lang屬性 ,例如:lang=」scss」
有哪幾大特性:
1、可以用變數,例如($變數名稱=值);
2、可以用混合器,例如()
3、可以嵌套
5、mint-ui是什麼?怎麼使用?說出至少三個組件使用方法?
答:基於vue的前端組件庫。npm安裝,然後import樣式和js,vue.use(mintUi)全局引入。在單個組件局部引入:import {Toast} from 『mint-ui』。組件一:Toast(『登錄成功』);組件二:mint-header;組件三:mint-swiper
6、v-model是什麼?怎麼使用? vue中標簽怎麼綁定事件?
答:可以實現雙向綁定,指令(v-class、v-for、v-if、v-show、v-on)。vue的model層的data屬性。綁定事件:<input @click=doLog() />
7、axios是什麼?怎麼使用?描述使用它實現登錄功能的流程?
答:請求後台資源的模塊。npm install axios -S裝好,然後發送的是跨域,需在配置文件中config/index.js進行設置。後台如果是Tp5則定義一個資源路由。js中使用import進來,然後.get或.post。返回在.then函數中如果成功,失敗則是在.catch函數中
8、axios+tp5進階中,調用axios.post(『api/user』)是進行的什麼操作?axios.put(『api/user/8′)呢?
答:跨域,添加用戶操作,更新操作。
9、什麼是RESTful API?怎麼使用?
答:是一個api的標准,無狀態請求。請求的路由地址是固定的,如果是tp5則先路由配置中把資源路由配置好。標准有:.post .put .delete
10、vuex是什麼?怎麼使用?哪種功能場景使用它?
答:vue框架中狀態管理。在main.js引入store,注入。新建了一個目錄store,….. export 。場景有:單頁應用中,組件之間的狀態。音樂播放、登錄狀態、加入購物車
11、mvvm框架是什麼?它和其它框架(jquery)的區別是什麼?哪些場景適合?
答:一個model+view+viewModel框架,數據模型model,viewModel連接兩個
區別:vue數據驅動,通過數據來顯示視圖層而不是節點操作。
場景:數據操作比較多的場景,更加便捷
12、自定義指令(v-check、v-focus)的方法有哪些?它有哪些鉤子函數?還有哪些鉤子函數參數?
答:全局定義指令:在vue對象的directive方法裡面有兩個參數,一個是指令名稱,另外一個是函數。組件內定義指令:directives
鉤子函數:bind(綁定事件觸發)、inserted(節點插入的時候觸發)、update(組件內相關更新)
鉤子函數參數:el、binding
13、說出至少4種vue當中的指令和它的用法?
答:v-if:判斷是否隱藏;v-for:數據循環出來;v-bind:class:綁定一個屬性;v-model:實現雙向綁定
14、vue-router是什麼?它有哪些組件?
答:vue用來寫路由一個插件。router-link、router-view
15、導航鉤子有哪些?它們有哪些參數?
答:導航鉤子有:a/全局鉤子和組件內獨享的鉤子。b/beforeRouteEnter、afterEnter、beforeRouterUpdate、beforeRouteLeave
參數:有to(去的那個路由)、from(離開的路由)、next(一定要用這個函數才能去到下一個路由,如果不用就攔截)最常用就這幾種
16、Vue的雙向數據綁定原理是什麼?
答:vue.js 是採用數據劫持結合發布者-訂閱者模式的方式,通過Object.defineProperty()來劫持各個屬性的setter,getter,在數據變動時發布消息給訂閱者,觸發相應的監聽回調。
具體步驟:
第一步:需要observe的數據對象進行遞歸遍歷,包括子屬性對象的屬性,都加上 setter和getter
這樣的話,給這個對象的某個值賦值,就會觸發setter,那麼就能監聽到了數據變化
第二步:compile解析模板指令,將模板中的變數替換成數據,然後初始化渲染頁面視圖,並將每個指令對應的節點綁定更新函數,添加監聽數據的訂閱者,一旦數據有變動,收到通知,更新視圖
第三步:Watcher訂閱者是Observer和Compile之間通信的橋梁,主要做的事情是:
1、在自身實例化時往屬性訂閱器(dep)裡面添加自己
2、自身必須有一個update()方法
3、待屬性變動dep.notice()通知時,能調用自身的update()方法,並觸發Compile中綁定的回調,則功成身退。
第四步:MVVM作為數據綁定的入口,整合Observer、Compile和Watcher三者,通過Observer來監聽自己的model數據變化,通過Compile來解析編譯模板指令,最終利用Watcher搭起Observer和Compile之間的通信橋梁,達到數據變化 -> 視圖更新;視圖交互變化(input) -> 數據model變更的雙向綁定效果。
ps:16題答案同樣適合」vue data是怎麼實現的?」此面試題。
17、請詳細說下你對vue生命周期的理解?
答:總共分為8個階段創建前/後,載入前/後,更新前/後,銷毀前/後。
創建前/後: 在beforeCreated階段,vue實例的掛載元素$el和數據對象data都為undefined,還未初始化。在created階段,vue實例的數據對象data有了,$el還沒有。
載入前/後:在beforeMount階段,vue實例的$el和data都初始化了,但還是掛載之前為虛擬的dom節點,data.message還未替換。在mounted階段,vue實例掛載完成,data.message成功渲染。
更新前/後:當data變化時,會觸發beforeUpdate和updated方法。
銷毀前/後:在執行destroy方法後,對data的改變不會再觸發周期函數,說明此時vue實例已經解除了事件監聽以及和dom的綁定,但是dom結構依然存在
18、請說下封裝 vue 組件的過程?
答:首先,組件可以提升整個項目的開發效率。能夠把頁面抽象成多個相對獨立的模塊,解決了我們傳統項目開發:效率低、難維護、復用性等問題。
然後,使用Vue.extend方法創建一個組件,然後使用Vue.component方法注冊組件。子組件需要數據,可以在props中接受定義。而子組件修改好數據後,想把數據傳遞給父組件。可以採用emit方法。
19、你是怎麼認識vuex的?
答:vuex可以理解為一種開發模式或框架。比如php有thinkphp,java有spring等。
通過狀態(數據源)集中管理驅動組件的變化(好比spring的IOC容器對bean進行集中管理)。
應用級的狀態集中放在store中; 改變狀態的方式是提交mutations,這是個同步的事物; 非同步邏輯應該封裝在action中。
20、vue-loader是什麼?使用它的用途有哪些?
答:解析.vue文件的一個載入器,跟template/js/style轉換成js模塊。
用途:js可以寫es6、style樣式可以scss或less、template可以加jade等
21、請說出vue.cli項目中src目錄每個文件夾和文件的用法?
答:assets文件夾是放靜態資源;components是放組件;router是定義路由相關的配置;view視圖;app.vue是一個應用主組件;main.js是入口文件
22、vue.cli中怎樣使用自定義的組件?有遇到過哪些問題嗎?
答:第一步:在components目錄新建你的組件文件(smithButton.vue),script一定要export default {
第二步:在需要用的頁面(組件)中導入:import smithButton from 『../components/smithButton.vue』
第三步:注入到vue的子組件的components屬性上面,components:{smithButton}
第四步:在template視圖view中使用,<smith-button> </smith-button>
問題有:smithButton命名,使用的時候則smith-button。
23、聊聊你對Vue.js的template編譯的理解?
答:簡而言之,就是先轉化成AST樹,再得到的render函數返回VNode(Vue的虛擬DOM節點)
詳情步驟:
首先,通過compile編譯器把template編譯成AST語法樹(abstract syntax tree 即 源代碼的抽象語法結構的樹狀表現形式),compile是createCompiler的返回值,createCompiler是用以創建編譯器的。另外compile還負責合並option。
然後,AST會經過generate(將AST語法樹轉化成render funtion字元串的過程)得到render函數,render的返回值是VNode,VNode是Vue的虛擬DOM節點,裡面有(標簽名、子節點、文本等等)

閱讀全文

與vue3源碼解析書相關的資料

熱點內容
命令行截圖軟體 瀏覽:732
程序員加班多 瀏覽:123
android設置view的背景 瀏覽:684
u盤加密工具哪個好 瀏覽:571
php生成html模板引擎 瀏覽:26
如何設置app封殺 瀏覽:823
手機將照片弄成壓縮包 瀏覽:221
卡聯購卡盟官網源碼 瀏覽:867
網頁弄成pdf 瀏覽:223
dos的刪除命令 瀏覽:309
區塊鏈的加密物聯網傳輸 瀏覽:570
如何卸載桌面布局已定的app 瀏覽:677
vs重置命令 瀏覽:613
如何學會學習python 瀏覽:227
程序員釘釘 瀏覽:758
gcc編譯器生成目標文件 瀏覽:156
怎麼改伺服器ip地址嗎 瀏覽:56
cmd輸入命令斷開連接 瀏覽:911
二線大廠程序員員工年薪 瀏覽:988
程序員能從事導彈行業嗎 瀏覽:938