国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

精讀《源碼學習》

aboutU / 2390人閱讀

摘要:精讀原文介紹了學習源碼的兩個技巧,并利用實例說明了源碼學習過程中可以學到許多周邊知識,都讓我們受益匪淺。討論地址是精讀源碼學習如果你想?yún)⑴c討論,請點擊這里,每周都有新的主題,周末或周一發(fā)布。

1. 引言

javascript-knowledge-reading-source-code 這篇文章介紹了閱讀源碼的重要性,精讀系列也已有八期源碼系列文章,分別是:

精讀《Immer.js》源碼

精讀《sqorn 源碼》

精讀《Epitath 源碼 - renderProps 新用法》

精讀《Htm - Hyperscript 源碼》

精讀《React PowerPlug 源碼》

精讀《syntax-parser 源碼》

精讀《react-easy-state 源碼》

精讀《Inject Instance 源碼》

筆者自己的感悟是,度過大量源碼的程序員有以下幾個特質:

思考具有系統(tǒng)性,主要體現(xiàn)在改一處代碼模塊時,會將項目所有文件串聯(lián)起來整體考慮,提前評估影響面。

思考具有前瞻性,對已實現(xiàn)的方案可以快速評價所處階段(臨時 or 標準 or 可拓展),將邊界情況提前解決,將框架 BUG 降低到最小程度。

代碼實現(xiàn)更優(yōu)雅,有大量源碼經(jīng)驗做支撐,解決同樣問題時,這些程序員可以用更短的行數(shù)、更合適的三方庫解決問題,代碼可讀性更好,模塊拆分更合理,更利于維護。

既然閱讀源碼這么重要,那么怎么才能讀好源碼呢?本周精讀的文章就是一篇方法論文章,告訴你如何更好的閱讀源碼。

2. 概述

原文分三個部分:閱讀源碼的好處、閱讀源碼的技巧、以及 Redux Connect 的案例研究。

閱讀源碼的好處

閱讀源碼有助于理解抽象的概念,比如虛擬 DOM;有助于做方案調研,而不僅僅只看 Github star 數(shù)量;了解優(yōu)秀框架目錄結構的設計;看到一些陌生的工具函數(shù),還可能激發(fā)你對 JS 規(guī)范的查閱,這種問題驅動的方式也是筆者推薦的 JS 規(guī)范學習方式。

閱讀源碼的技巧

最好的閱讀源碼方式是看文章,如果源碼的作者有寫源碼解讀文章,這就是最省力的方式。雖然直接看代碼可以了解到所有細節(jié),但當你不清楚設計思路時,僅看源碼可能會找不到方向,而讀源碼的最終目的是找到核心的設計理念,如果一個框架沒有自己核心設計理念,這個框架也不值得誕生,更不值得被閱讀。如果框架的作者已經(jīng)將框架核心理念寫成了文章,那讀文章就是最佳方案。

還有一種方式是斷點,寫一個最小程序,在框架執(zhí)行入口出打下斷點,然后按照執(zhí)行路徑一步步理解。雖然執(zhí)行路徑中會存在大量無關的函數(shù)干擾精力,但如果你足夠有耐心,當斷點走完時一定會有所收獲。

原文還提到了一種看源碼方式,即沒有目的的尋寶。在尋找框架主要思路的過程中,遇到一些有意思的函數(shù),可以停下來仔細閱讀,可能會發(fā)現(xiàn)一些對你有啟發(fā)的代碼片段。

Redux Connect 案例研究

原文以 Redux Connect 作為案例介紹研究思路。

首先看到 Connect 的功能 “包裝組件” 后,就要問自己兩個問題:

Connect 是如何實現(xiàn)包裝組件后原樣返回組件,但卻增強組件功能的?(高階組件知識)

了解這個設計模式后,如何利用已有的文檔實現(xiàn)它?

通過創(chuàng)建一個使用 Connect 的基本程序:

class MarketContainer extends Component {

}

const mapDispatchToProps = dispatch => {
 return {
   updateSummary: (summary, start, today) => dispatch(updateSummary(summary, start, today))
 }
}

export default connect(null, mapDispatchToProps)(MarketContainer);

比如從生成 connect 函數(shù)的 createConnect 我們就可以學習到 Facade Pattern - 門面模式。

createConnect 函數(shù)調用處:

export function createConnect({
 connectHOC = connectAdvanced,
 mapStateToPropsFactories = defaultMapStateToPropsFactories,
 mapDispatchToPropsFactories = defaultMapDispatchToPropsFactories,
 mergePropsFactories = defaultMergePropsFactories,
 selectorFactory = defaultSelectorFactory
} = {})

我們可以學習到解構默認函數(shù)參數(shù)的知識點。

總之,在學習源碼的過程中,可以了解到一些新的 JS 特性,一些設計模式,這些都是額外的寶藏,不斷理解并學會運用到自己寫的框架里,就實現(xiàn)了源碼學習的目的。

3. 精讀

原文介紹了學習源碼的兩個技巧,并利用 Redux Connect 實例說明了源碼學習過程中可以學到許多周邊知識,都讓我們受益匪淺。

筆者結合之前寫過的八篇源碼分析文章,把最重要的設計思路提取出來,以實際的例子展示閱讀源碼能給我們思維帶來哪些幫助。

Immerjs 源碼的精華

Immer 可以讓我們以 Mutable 的方式更新對象,最終得到一個 Immutable 對象:

this.setState(produce(state => (state.isShow = true)))
詳細源碼解讀可以閱讀 這里。

核心思路是利用 Proxy 把臟活累活做掉。上面的例子中,state 已經(jīng)是一個代理(Proxy)對象,通過自定義 setting 不斷遞歸進行淺拷貝,最后返回一個新引用的頂層對象作為 produce 的返回值。

從 Immerjs 中,我們學到了 Proxy 可以化腐朽為神奇的用法,比看任何 Proxy 介紹文章都直觀。

sqorn 源碼的精華

sqorn 是一個 sql orm,舉例來看:

const sq = require("sqorn-pg")();

const Person = sq`person`,
  Book = sq`book`;

// SELECT
const children = await Person`age < ${13}`;
// "select * from person where age < 13"
詳細源碼解讀可以閱讀 這里

核心思路是在鏈式調用過程中創(chuàng)建 context 存儲結構,并在鏈式調用的時候不斷填充 context 信息,最終拿到的是一個結構化 context 對象,生成 sql 語句也就簡單了。

從 sqorn 中,我們學到了如何實現(xiàn)鏈式調用 init().a().b().c().print() 最后拿到一個綜合的結果,原理是內部維護了一個不斷修改的對象。不論前端 React Vue 還是后端框架 Koa 等,一般都有內置的 context,一般實現(xiàn)這種優(yōu)雅語法的框架內部都會維護 context。

Epitath 源碼的精華

Epitath 在 React Hooks 之前出來,解決了高階函數(shù)地獄的問題:

const App = epitath(function*() {
  const { count } = yield 
  const { on } = yield 

  return (
    
  )
})

詳細源碼解讀可以閱讀 這里

其核心是利用 generator 的迭代,將 React 組件的平級結構還原成嵌套結構,將嵌套寫法打平了:

yield 
yield 
yield 
// 等價于

  
    
  

從 epitath 中,我們了解到 generator 原來可以這么用,正因為其執(zhí)行是多次迭代的,因此我們可以利用這個特性,改變代碼運行結構。

Htm - Hyperscript 源碼的精華

Htm 將模版語法很自然的融入到了 html 中:

html`
  
<${Header} name="ToDo"s (${page})" />
    ${todos.map( todo => html`
  • ${todo}
  • ` )}
<${Footer}>footer content here
`;
詳細源碼解讀可以閱讀 這里

其核心是怎么根據(jù)模版拿到 dom 元素的 AST?拿到 AST 后就方便生成后續(xù)內容了。

作者的辦法是:

const TEMPLATE = document.createElement("template");
TEMPLATE.innerHTML = str;

這樣 TEMPLATE 就自帶了 AST 解析,這是利用瀏覽器自帶的 AST 解析拿到了 AST。從 Htm 中,我們學到了 innerHTML 可以生成標準 AST,所以只要有瀏覽器運行環(huán)境,需要拿 AST 的時候,不需要其他庫,innerHTML 就是最好的方案。

React PowerPlug 源碼的精華

React PowerPlug 是一個利用 render props 進行狀態(tài)管理的工具庫。

它可以在 JSX 中對任意粒度插入狀態(tài)管理:


  {({ value, set, reset }) => (
    <>