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
- 523
 
   
   
  