1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          源碼學習攻略

          來源:互聯網轉載 時間:2024-01-29 08:03:25

          本文主要講的是閱讀大型的前端開源項目比如 React、Vue、Webpack、Babel 的源碼時的一些技巧。目的是讓大家在遇到需要閱讀源碼才能解決的問題時,可以更快的定位到自己想看的代碼。 授人以魚不如授人以漁,希望大家可以通過這篇博客,了解到閱讀大型前端項目源碼時的切入點。在之后遇到好奇的問題時,可以自己去探索。

          問題驅動

          首先我們要明確一點,看源碼的目的是什么?

          我個人的意見是,看源碼是為了解決問題。開源項目的源代碼并沒有什么非常特殊的地方,也都是普通的代碼。這些代碼的數量級一般都挺大,如果想是從源碼中學到東西,直接瀏覽整個 Codebase 無疑是大海撈針。但如果是帶著問題去看源碼,比如想了解一下 React 的合成事件系統的原理,想了解 React 的 setState 前后發生了什么,或者想了解 Webpack 插件系統的原理。也有可能是遇到了一個 bug,懷疑是框架/工具的問題。在這樣的情況下,帶著一個具體的目標去看源碼,就會有的放矢。

          看最新版的源碼

          之前看到一種說法,看源碼要從項目的第一個 commit 開始看。如果是為了解決前文中對框架/工具產生的困惑,那自然要看當前項目中用到的框架/工具的版本。 如果是為了學習源碼,我也建議看最新的源碼。因為一個項目是在不斷迭代和重構的。不同版本之間可能是一次完全的重寫。

          前置條件

          看源碼怎么看,當然不能一把梭了。

          看源碼之前需要對項目的原理有一個基本的了解。所謂原理就是,這個項目有哪些組成部分,為了達到最終的產出,要經過哪幾步流程。這些流程里,業界主流的方案有哪幾種。
          比如前端 View層框架,要渲染出UI,組件要經過mount、 render等等步驟。數據驅動的前端框架,在mounted之后,就會進入一個循環,當用戶交互觸發組件數據變化時,會更新UI。其中數據的檢測方式又有分Push和Pull兩種方案。渲染UI可以是全量的字符串模板替換,也可以是基于Virtual DOM的差量DOM更新。
          又比如前端的一些工具,Webpack和Babel這些工具都是基于插件的?;镜墓ぷ髁鞒叹褪亲x取文件,解析代碼成AST,調用插件去轉換AST,最后生成代碼。要了解Webpack的原理,就要知道Webpack基于一個叫tapable的模塊系統。
          那我們要如何了解這些呢?要了解這些,可以去各大網站和博客上的《XXX源碼解析》系列。通過這些文章,我們可以對我們要看的框架/工具的原理有一個大致的了解。

          本地build

          不過最終我們還是要直接看源碼。筆者真正看源碼的第一步就是把項目的代碼倉庫 clone 到本地。然后按項目README上的構建指南,在本地 build 一下。
          如果是前端框架,我們可以在 HTML 中里直接引入本地 build 出的 umd bundle(記得用development build,不然會把代碼壓縮,可讀性差),然后寫一個簡單的 demo,demo 里引入本地的 build。如果是基于 Nodejs 的工具,我們可以用 npm link 把這個工具的命令 link 到本地。也可以直接看項目的 package.json 的入口文件,直接用 node 運行那個文件。
          這里要強調一下,大型的開源項目一般都會有一個Contribution Guide,目的是讓想貢獻代碼的開發者更快上手。里面就有講怎么在本地構建代碼。 以 React 為例,React 的 Contributing Guide 里就 Development Workflow 這一節。里面有這么一段話:

          The easiest way to try your changes is to run yarn build core,dom --type=UMD and then open fixtures/packaging/babel-standalone/dev.html. This file already uses react.development.js from the build folder so it will pick up your changes.

          fixtures/packaging/babel-standalone/dev.html 這個文件中的就是一個方便的 demo 頁。我們可以在這個頁面快速查看我們在本地對代碼的改動。 你可以嘗試著在項目的入口文件中加入一句 log,看看是不是可以在控制臺/終端看到這句 log。如果可以的話,恭喜你,你現在可以隨便把玩這個項目了!

          理清目錄結構

          在看具體的代碼之前,我們需要理清項目的目錄結構,這樣我們才能更快的知道在哪里地方找相關功能的代碼。我們看看 React 的目錄結構。React 是一個monorepo。也就是一個倉庫里包含了多個子倉庫。我們在 packages 目錄下可以看到很多單獨的 package:

          在React 16 之后,React 的代碼分為 React Core,Renderer 和 Reconciler 三部分。這是因為React的設計讓我們可以把負責映射數據到 UI 的 Reconciler 以及負責渲染 Vritual DOM 到各個終端的 Renderer 和 React Core 分開。React Core 包含了 React 的類定義和一些頂級 API。大部分的渲染和 View 層 diff 的邏輯都在 Reconciler 和 Renderer 中。
          Babel 也是一個monorepo。Babel 的核心代碼是 babel-core 這個 package,Babel 開放了接口,讓我們可以自定義 Visitor,在AST轉換時被調用。所以 Babel 的倉庫中還包括了很多插件,真正實現語法轉換的其實是這些插件,而不是 babel-core 本身。

          Vuejs 的代碼比較典型,核心代碼在 src 目錄下,按功能模塊劃分。因為 Vue 也支持多平臺渲染,所以把平臺相關的代碼都放到了 platform 文件夾下,core 文件夾中是 Vue 的核心代碼,compiler 是 Vue 的模板編譯器,把 HTML 風格的模板編譯為 render function。

          Webpack 和 Babel 一樣,可以說都是基于插件的系統。Webpack 的主要源碼在 lib 目錄下,里面的 webpack.js 就是入口文件。上面說了四個項目的目錄結構,那我們遇到一個新的開源項目,應該怎么了解它的目錄結構呢? 如果這個項目是一個 monorepo,首先我們要找到核心的那個 package,然后看里面的代碼。 不是 monorepo 的話,一般來說,如果這個項目是一個 CLI 的工具,那 bin 目錄下放的就是命令行界面相關的入口文件,lib 或者 src 下面就是工具的核心代碼。如果這個項目是一個前端 View 層框架,那目錄結構就和 Vue 類似。 作為驗證,大家可以看一下打包工具 parcel 和前端 View 層庫 moon 的目錄結構。目錄結構這個東西往往是大同小異,多看幾個項目就熟悉了。

          debugger && 全局搜索大法

          運行了本地的 build,了解了目錄結構,接下來我們就可以開始看源碼了!之前說了,我們要以問題驅動,下面我就以 React 調用 setState 前后發生了什么這個問題作為例子。 我們可以在 setState 的地方打一個斷點。首先我們要找到 setState 在什么地方。這個時候之前的準備工作就派上用處了。我們知道 React 的共有 API 在 react 這個 package 下面。我們就在那個 package 里面全局搜索。我們發現這個 API 定義在 src/ReactBaseClasses.js 這個文件里。于是我們就在這里打一個斷點:

          Component.prototype.setState = function(partialState, callback) {  invariant(    typeof partialState === 'object' ||      typeof partialState === 'function' ||      partialState == null,    'setState(...): takes an object of state variables to update or a ' +      'function which returns an object of state variables.',  );  debugger;  this.updater.enqueueSetState(this, partialState, callback, 'setState');};

          然后運行本地 React build 的 demo 頁面,讓組件觸發 setState,我們就可以在 Devtool 里看到斷點了。我們走進 this.updater.enqueueSetState 這個調用,就來到了 ReactFiberClassComponent 這個函數中的 enqueueSetState,這里調用了 enqueueUpdate 和 scheduleWork 兩個函數,如果要深入 setState 之后的流程.

          如果想看 setState 之前發生了什么,我們只需要看 Devtool 右邊的調用棧:

          點擊每一個 frame 就可以跳到對應的函數中,并且恢復當時的上下文。結合一步一步的代碼調試,我們可以看到框架的函數調用棧。對于每個重要的函數,我們可以在倉庫里搜索到源碼,進一步研究。Node 工具的調試方法也是相似的,我們可以在運行 node 命令時加上 --inspect 參數。具體可以看Debugging Node.js with Chrome DevTools這篇博客。 其實大家都知道單步調試這種辦法,但在哪里打斷點才是最關鍵的。我們在熟悉框架的原理之后,就可以在框架的關鍵鏈路上打斷點,比如前端 View 層框架的聲明周期鉤子和 render 方法,Node 工具的插件函數,這些代碼都是框架運行的必經之地,是不錯的切入點。如果是為了了解一個特定的問題,大家可以直接在自己覺得有問題的地方打斷點。然后把源碼運行起來,想辦法讓代碼運行到那個地方。我們在斷點可以看到局部變量等等信息,有助于定位問題。

          來自開發團隊的資源

          其實開源項目的開發團隊也都致力于讓更多的人參與到項目中來,降低項目的門檻。所以我們在線上其實可以找到很多來自開發團隊的資源。這些資源可以幫助我們去理解項目的原理。

          關注核心開發者

          每個項目都有一些核心開發者,比如 React 的 Dan Abramov, Andrew Clark 和 Sebastian Markb?ge。Webpack 的 Tobias Koppers 和 Sean Larkin。Vue 的 Evan You。我們可以在 Twitter 上關注他們,了解項目的動態。

          關注官方博客和演講視頻

          如果我們關注了上面的核心開發者,就會發現他們時常會發布一些和源碼/項目原理有關的博客或者視頻。React 的官方博客最近就有很多和項目開發有關的博客。

          • Behind the Scenes: Improving the Repository Infrastructure 這篇介紹的是 React 項目倉庫的基礎設施。
          • Sneak Peek: Beyond React 16

          Andrew Clark 一開始就寫了一篇介紹 fiber 架構的文檔。Dan Abramov 最近在 JSConf 上對 React 未來的一些新特性的介紹 - Beyond React 16。React 博客中的Sneak Peek: Beyond React 16也是對這次 Talk 的介紹。
          Evan You 介紹前端框架數據變化偵測原理的 Talk。Vue 文檔中也有 Reactivity in Depth 這樣的介紹原理的章節。
          Sean Larkin 的 Everything is a plugin! Mastering webpack from the inside out 介紹了 Webpack 的核心組件 Tapable。James Kyle 的 How to Build a Compiler 可以讓我們了解 Babel 轉譯代碼的基本流程。

          總結

          在我們閱讀完官方文檔后,我們一定會進行更深層次的學習,看源碼的目的是為了解決問題 這里廣東靚仔給下一些小建議:

          • 在看源碼前,我們先去官方文檔復習下框架設計理念、源碼分層設計
          • 閱讀下框架官方開發人員寫的相關文章
          • 借助框架的調用棧來進行源碼的閱讀,通過這個執行流程,我們就完整的對源碼進行了一個初步的了解
          • 接下來再對源碼執行過程中涉及的所有函數邏輯梳理一遍
          標簽:源碼教程-

          網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...

          在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...

          在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...

          qq加好友被限制后多長時間才可以再加?1.好友添加失敗,好友添加頻繁,好友被限制。這些都是平時加時常見的問題。尤其是申請新號的時候,更容易添加好友限制。2.這是因為tx為了避免短時間內頻繁操作號,會造成網絡垃圾和騷擾信息的增加,給其他用戶帶來騷擾;系統會暫時鎖定頻繁添加好友的賬號。3.如果賬號已被鎖定,請注意同一IP下是否有單個或多個號碼頻繁添加好友??梢試L試換個網絡環境再加好友,或者24小時后再...

          成都冷凍食品批發在那?1.冷凍食品批發市場:四川省成都市雙流區呂穎楓涇西。2.成都李因冷凍食品交易市場:四川省成都市青白江區貨運大道附近。3.姐妹冷凍食品批發:四川省成都市郫都區陽光北路與陽光南路交叉口西。4.冷凍食品批發部:四川省成都市青羊區興業街附近。5.瑞豐冷凍食品批發:四川省成都市龍泉驛區天盛路附近。6.年翔宇冷凍食品批發:四川省成都市成華區逸夫路。7.誠信冷凍食品批發零售:四川省成都市雙...

          yy飛機票怎么發?機票格式:輸入法要用中文,先輸入“yy”,再輸入“:”,再輸入“//”,最后輸入你想去的ID。交付后的格式是飛機票的格式,一點就飛。yy群里怎么發這種飛機票?機票格式:輸入法要用中文,先輸入“yy”,再輸入“:”,再輸入“//”,最后輸入你想去的ID。交付后的格式是飛機票的格式,一點就飛。YY說的飛機票是什么意思?即使有人邀請你去他的YY,你也可以送一張機票給你的朋友~他接受了就...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>