10/24 把哺我們愛妳>_<

- digest auth
- nginx
- react-fiber

digest auth

- Basic: RFC 2617 (1999) -> RFC 7617 (2015)
- Digest: RFC 2069 (1997) -> RFC 2617 (1999) -> RFC 7617 (2015)
- OAuth 1.0 (Twitter, 2007)
- OAuth 2.0 (2012)
- Bearer (OAuth 2.0): RFC 6750 (2012)
- JSON Web Tokens (JWT): RFC 7519 (2015)  

 

basic 

client

server

發送請求

401, realm

client

server

base64encode(username+":"+password)

跳出提示窗請求輸入 username 和 password

digest Auth

client

server

發送請求

401, realm, nounce

client

server

base64encode(username+":"+password)

跳出提示窗請求輸入 username 和 password

HA1 = MD5(username:realm:password)
HA2 = MD5(method:digestURI)
response = MD5(HA1:nonce:HA2)
async fetch (url, options={}) {
  if (resp.status == this.statusCode) { // this.statusCode 401
    this.hasAuth = false;
    await this.parseAuth(resp.headers.get('www-authenticate'))
    if (this.hasAuth) {
      const respFinal = await fetch(url, this.addAuth(url, options));

      if (respFinal.status == this.statusCode) {
        this.hasAuth = false;
      } else {
        this.digest.nc++;
      }
      return respFinal;
    }
  } else {
    this.digest.nc++;
  }

  return resp;
}

library:  digest-fetch

React Fiber

溫故知新 -> 小白的 slide

為了更流暢的使用者體驗,重寫了 react core

瀏覽器渲染

single thread

multiple thread

Web API

Event Queue

Event Loop

Event Table

The JavaScript runtime environment

Event loop

Browser FPS

60 fps -> 16ms

 requestIdleCallback

我來用  requestIdleCallback

去做複雜的運算

但 每個瀏覽器支援不一,且有些限制

React 自己幹了一個類似的去模擬一樣的效果

致命的困難:

要怎麼把 react-diff 塞在 idle period 裡?

要讓遍歷的過程變得更可控

// React 15 -> recursive 

walk(a1);

function walk(instance) {
    doWork(instance);
    const children = instance.render();
    children.forEach(walk);
}


const a1 = {name: 'a1'};
const b1 = {name: 'b1'};
const b2 = {name: 'b2'};
const b3 = {name: 'b3'};
const c1 = {name: 'c1'};
const c2 = {name: 'c2'};
const d1 = {name: 'd1'};
const d2 = {name: 'd2'};

a1.render = () => [b1, b2, b3];
b1.render = () => [];
b2.render = () => [c1];
b3.render = () => [c2];
c1.render = () => [d1, d2];
c2.render = () => [];
d1.render = () => [];
d2.render = () => [];

問題來惹
這個遍歷無法暫時停止

Recursive -> Singly Linked List Tree

function FiberNode(
  tag: WorkTag,
  pendingProps: mixed,
  key: null | string,
  mode: TypeOfMode,
) {
    ...
    this.return = null; // 父層
    this.child = null; // 子層
    this.sibling = null; // 兄弟節點
    this.effectTag = NoEffect; // bitwise
    ...
}

沒 children 

function Stanny() {
  return (
    <MyClass>
      <h1>有首歌很好聽</h1>
      <div>
        <h2>
          香草
        </h2>
      </div>
      <span>
        <h3>
          把哺
        </h3>
      </span>
    </MyClass>
  )
}


div = {
  return = MyClass; // 父層
  child = h2; // 子層
  sibling = span; // 兄弟節點
  effectTag = NoEffect;
}

舉個例子🌰 

深度優先搜尋演算法(英語:Depth-First-Search,DFS)是一種用於遍歷或搜尋樹或圖的演算法。沿著樹的深度遍歷樹的節點,儘可能深的搜尋樹的分支。當節點v的所在邊都己被探尋過,搜尋將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中一個作為源節點並重複以上過程,整個行程反覆進行直到所有節點都被存取為止。屬於盲目搜尋。

深度優先搜尋是圖論中的經典演算法,利用深度優先搜尋演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。

- 維基百科

function Stanny() {
  return (
    <MyClass>
      <h1>有首歌很好聽</h1>
      <div>
        <h2>
          香草
        </h2>
      </div>
      <span>
        <h3>
          把哺
        </h3>
      </span>
    </MyClass>
  )
}

遍歷完後,將有變動的節點做記號

Double Buffering

render -> commit

前面提的都是在說這個階段

改變真實 DOM

THANKS

參考連結

10/24 今天有 React Conf

By Jay Chou

10/24 今天有 React Conf

  • 353