最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入解析vue 源碼目錄及構(gòu)建過程分析

 更新時(shí)間:2019年04月24日 16:48:58   作者:wolfSoul  
這篇文章主要介紹了vue 源碼目錄及構(gòu)建過程分析,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下

​“ 本文主要梳理一下vue代碼的目錄,以及vue代碼構(gòu)建流程,旨在對(duì)vue源碼整體有一個(gè)認(rèn)知,有助于后續(xù)對(duì)源碼的閱讀?!?/p>

一、目錄結(jié)構(gòu)

上圖是對(duì)vue的代碼的所有目錄進(jìn)行的梳理,其中源碼位于src目錄下,下面對(duì)src下的目錄進(jìn)行介紹。

compiler

該目錄是編譯相關(guān)的代碼,即將 template 模板轉(zhuǎn)化成 render 函數(shù)的代碼。

vue 提供了 render 函數(shù),render 函數(shù)作用是用來創(chuàng)建 VNode,但在平時(shí)開發(fā)中,絕大多數(shù)情況下使用 template 來創(chuàng)建 HTML,所以需要將 template模板編譯成 render 函數(shù)。

編譯工作既可以在代碼構(gòu)建時(shí)做,也可以在客戶端運(yùn)行時(shí)做,但編譯十分消耗性能,所以在項(xiàng)目中建議使用 runtime 版本。

core

這部分代碼是 vue 的核心代碼,可以說是 vue 的靈魂所在,也是我們要重點(diǎn)學(xué)習(xí)的源碼。

core目錄又包含如下子目錄。

•components -- 內(nèi)置組件的代碼,即 keep-alive 代碼

•global-api -- 全局API代碼,mixin,extend 等 api 在這里實(shí)現(xiàn)

•instance -- vue實(shí)例化相關(guān)代碼,包括初始化,事件,生命周期,渲染等部分的代碼

•observer -- 響應(yīng)式數(shù)據(jù)相關(guān)代碼

•util -- 工具方法

•vdom -- 虛擬 dom 的代碼。

platforms

platforms下包含兩個(gè)子目錄,web 和 weex。

分別代表可以打包生成在web端使用的 vue 代碼和在native端使用的 weex 代碼。美團(tuán)開源的開發(fā)微信小程序的 mpvue 框架也是在這個(gè)目錄下進(jìn)行拓展的。

通過不同平臺(tái)的入口就可以打包出運(yùn)行在不同平臺(tái)的版本的 vue 文件,后面代碼構(gòu)建部分會(huì)介紹具體的構(gòu)建過程。

server

該目錄下是 SSR 相關(guān)的代碼。

Vue.js 是構(gòu)建客戶端應(yīng)用程序的框架。除了可以在瀏覽器中輸出 Vue 組件,也可以將同一個(gè)組件渲染為服務(wù)器端的 HTML 字符串,將它們直接發(fā)送到瀏覽器,最后將這些靜態(tài)標(biāo)記"激活"為客戶端上完全可交互的應(yīng)用程序。

sfc

我們平時(shí)開發(fā)時(shí),都是寫 .vue 文件。sfc 的代碼就是提供一個(gè)解析器,把.vue文件代碼解析成一個(gè) javascript 對(duì)象。

shared

該目錄下定義了一些公用的工具方法,提供給上面的幾個(gè)目錄內(nèi)代碼使用。

二、源碼編譯

vue的源碼按照功能拆分的十分清晰,每個(gè)功能都有單獨(dú)的目錄,那么項(xiàng)目中引用的vue文件是怎么編譯出來的呢?

首先,我們看一下編譯輸出的dist目錄。

可以看到,dist下有10幾種不同版本的vue文件,他們是根據(jù)不同規(guī)范(包括 CommonJS規(guī)范,ES Module,UMD)和 是否包含編譯器 構(gòu)建出的不同版本。

vue源碼選擇了rollup進(jìn)行構(gòu)建,rollup相比于webpack,更加輕量,編譯后的代碼更加干凈,更適合javascript庫(kù)的構(gòu)建,除了vue以外,像React,Ember,D3,Three.js 以及其他很多開源庫(kù)也選擇了Rollup 進(jìn)行構(gòu)建。

下面看一下vue具體構(gòu)建過程,首先到pakage.json中看下vue編譯執(zhí)行的命令。

從命令可以看出,構(gòu)建命令就是執(zhí)行 scripts 目錄下 build.js 文件。

下面是 scripts/build.js 核心代碼(下文中漢字注釋部分是為方便理解自己補(bǔ)充的)

從代碼可以看出,首先通過 script/config.js 文件的getAllBuilds方法獲取配置,然后根據(jù)構(gòu)建命令傳入的參數(shù)對(duì)配置進(jìn)行過濾,最后根據(jù)過濾后的配置執(zhí)行build函數(shù),編譯出對(duì)應(yīng)版本的vue文件。(這里介紹代碼構(gòu)建的過程,主要說明vue是怎么構(gòu)建出不同版本代碼的,build方法在此不做分析)

接下來我們?cè)诳匆幌屡渲梦募?script/config.js 中的 getAllBuilds 是怎么獲取具體配置的。

可以看出,getAllBuilds 方法首先通過 Object.keys 拿到 builds 對(duì)象所有key的組成的數(shù)組,并通過map遍歷執(zhí)行g(shù)enConfig方法。下面我們先看一下builds對(duì)象。

可以看出,builds對(duì)象是不同版本vue的編譯配置。具體配置項(xiàng)的作用,已經(jīng)用注釋在代碼中標(biāo)出。接下來我們看下genConfig函數(shù)做了什么。

genConfig 通過 key 拿到 builds 中每個(gè)key對(duì)應(yīng)的配置對(duì)象,然后根據(jù)這個(gè)對(duì)象重新定義一個(gè) config 對(duì)象,這個(gè) config 對(duì)象的結(jié)構(gòu)才是 rollup 配置真正需要的結(jié)構(gòu)。

看了 builds 對(duì)象和 genConfig 方法,我們就知道了 getAllBuilds 的目的,是通過映射把 builds 配置對(duì)象轉(zhuǎn)化成 rollup 所需要的配置數(shù)據(jù)。

到這里,我們就清楚是如何構(gòu)建出不同版本的vue代碼了。

三、心得

學(xué)習(xí)源碼時(shí),不建議按照源碼的順序一行一行的閱讀。首先要抓住主干,先梳理清楚主要的代碼邏輯,再去仔細(xì)閱讀具體的每行代碼。另外按照源碼順序閱讀可能很枯燥,很難堅(jiān)持下來,可以先選擇自己感興趣的部分進(jìn)行學(xué)習(xí),最后再串聯(lián)起來。

相關(guān)文章

  • vue3選項(xiàng)式api如何監(jiān)控?cái)?shù)組變化

    vue3選項(xiàng)式api如何監(jiān)控?cái)?shù)組變化

    這篇文章主要介紹了vue3選項(xiàng)式api如何監(jiān)控?cái)?shù)組變化問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Vue2路由動(dòng)畫效果的實(shí)現(xiàn)代碼

    Vue2路由動(dòng)畫效果的實(shí)現(xiàn)代碼

    本篇文章主要介紹了Vue2路由動(dòng)畫效果的實(shí)現(xiàn)代碼,可以根據(jù)不同的路徑去改變動(dòng)畫的效果,有興趣的可以了解一下
    2017-07-07
  • vant遇到van-sidebar數(shù)據(jù)超出不能滑動(dòng)的問題

    vant遇到van-sidebar數(shù)據(jù)超出不能滑動(dòng)的問題

    這篇文章主要介紹了vant遇到van-sidebar數(shù)據(jù)超出不能滑動(dòng)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 在Vue中實(shí)現(xiàn)深度監(jiān)聽的示例代碼

    在Vue中實(shí)現(xiàn)深度監(jiān)聽的示例代碼

    在 Vue 中,深度監(jiān)聽是指監(jiān)聽一個(gè)對(duì)象或數(shù)組的嵌套屬性(深層結(jié)構(gòu))的變化,而不僅僅是監(jiān)聽頂層屬性的引用變化,本文給大家介紹了如何在Vue中實(shí)現(xiàn)深度監(jiān)聽,并通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • vue3+electron12+dll開發(fā)客戶端配置詳解

    vue3+electron12+dll開發(fā)客戶端配置詳解

    本文將結(jié)合實(shí)例代碼,介紹vue3+electron12+dll客戶端配置,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • 基于vue.js中事件修飾符.self的用法(詳解)

    基于vue.js中事件修飾符.self的用法(詳解)

    下面小編就為大家分享一篇基于vue.js中事件修飾符.self的用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • vue中el-input綁定鍵盤按鍵(按鍵修飾符)

    vue中el-input綁定鍵盤按鍵(按鍵修飾符)

    這篇文章主要介紹了vue中el-input綁定鍵盤按鍵(按鍵修飾符),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • elementplus實(shí)現(xiàn)多級(jí)表格(最后一級(jí)展示圖片)

    elementplus實(shí)現(xiàn)多級(jí)表格(最后一級(jí)展示圖片)

    本文主要介紹了elementplus實(shí)現(xiàn)多級(jí)表格(最后一級(jí)展示圖片),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • vue實(shí)現(xiàn)輪播圖幀率播放

    vue實(shí)現(xiàn)輪播圖幀率播放

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)輪播圖幀率播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 詳談vue+webpack解決css引用圖片打包后找不到資源文件的問題

    詳談vue+webpack解決css引用圖片打包后找不到資源文件的問題

    下面小編就為大家分享一篇詳談vue+webpack解決css引用圖片打包后找不到資源文件的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03

最新評(píng)論

榆社县| 余姚市| 庄浪县| 庆元县| 浮梁县| 田阳县| 桂平市| 紫金县| 重庆市| 普兰县| 静宁县| 阿克苏市| 金昌市| 化隆| 仁布县| 郧西县| 兰西县| 庄浪县| 德兴市| 西乌| 望都县| 云龙县| 永川市| 新郑市| 永清县| 宁明县| 原平市| 电白县| 互助| 红安县| 高雄县| 乐陵市| 凤冈县| 元氏县| 海盐县| 安仁县| 竹北市| 烟台市| 正安县| 巴马| 开化县|