JSDC 2021 議程筆記

總結

此篇整理了 2021 JSDC 議程之相關筆記與自用的延伸閱讀資料,包含:

The Future of React: 18 and Beyond

Suspense

Suspense 解決的問題:告訴 react 要等一個元件準備好之後再渲染

const resource = fetchProfileData();

function ProfilePage() {
  return (
    <Suspense fallback={<h1>Loading profile...</h1>}>
      <ProfileDetails />
      <Suspense fallback={<h1>Loading posts...</h1>}>
        <ProfileTimeline />
      </Suspense>
    </Suspense>
  );
}

function ProfileDetails() {
  // Try to read user info, although it might not have loaded yet
  const user = resource.user.read();
  return <h1>{user.name}</h1>;
}

function ProfileTimeline() {
  // Try to read posts, although they might not have loaded yet
  const posts = resource.posts.read();
  return (
    <ul>
      {posts.map((post) => (
        <li key={post.id}>{post.text}</li>
      ))}
    </ul>
  );
}

REACT 官方文件:Suspense for Data Fetching (Experimental)

// Error boundaries currently have to be classes.
class ErrorBoundary extends React.Component {
  state = { hasError: false, error: null };
  static getDerivedStateFromError(error) {
    return {
      hasError: true,
      error,
    };
  }
  render() {
    if (this.state.hasError) {
      return this.props.fallback;
    }
    return this.props.children;
  }
}
function ProfilePage() {
  return (
    <Suspense fallback={<h1>Loading profile...</h1>}>
      <ProfileDetails />
      <ErrorBoundary fallback={<h2>Could not fetch posts.</h2>}>
        <Suspense fallback={<h1>Loading posts...</h1>}>
          <ProfileTimeline />
        </Suspense>
      </ErrorBoundary>
    </Suspense>
  );
}

Streaming Suspense SSR

解決的問題:改善過去一定要一次到位的 SSR(全部都要準備好才會送到前端,快的要等慢的),開始支援 Suspense

官方說明:New Suspense SSR Architecture in React 18

Selective Hydration

解決的問題:讓 hydration 支援 Suspense

從 Concurrent Mode 到 Concurrent Features

解決的問題:比起過去,在 REACT 18 中可以更簡單地測試 Concurrent Features

useTransition

startTransition

可將較不重要的 state update 任務設定交給 startTransition 處理

start transition

import { startTransition } from 'react';

highPriorityTask();

startTransition(() => {
  lowPriorityTask();
});

isPending

回傳的是布林值,其中一種應用方式為搭配控制 spinner 元件的顯示與否

import { useTransition } from 'react';

function myComponent() {
  const [isPending, startTransition] = useTransition();
  // ...
  return <div>{isPending && <Spinner />}</div>;
}

SuspenseList

應用情境:畫面上有許多使用者卡片元件需要等待資料載入後才顯示照片,但使用者資料不一定會依照順序備妥(所以圖片顯示的順序也會不同);但如果將這些使用者卡片元件包在裡面,就可以透過修改 SuspenseList 的參數來控制內部元件的顯示順序(與方式)

<SuspenseList revealOrder="forwards">
  <Suspense fallback={'Loading...'}>
    <ProfilePicture id={1} />
  </Suspense>
  <Suspense fallback={'Loading...'}>
    <ProfilePicture id={2} />
  </Suspense>
  <Suspense fallback={'Loading...'}>
    <ProfilePicture id={3} />
  </Suspense>
  ...
</SuspenseList>

Server Components

優點:

缺點(注意事項):

前端工程師也能搞得懂的區塊鏈

區塊鏈可以是什麼?

但以上提到的這些常見應用,其實各自的技術底層都不相同

不同的技術應用會有對應的BC類型

分歧點:

所以(比特幣這類型的)區塊鏈的技術究竟是什麼?

如何做到「去中心化」

如何做到「不可偽造」

如何做到「不可被篡改」

區塊鏈與 computing engine

前端工程師與區塊鏈

JS 在生成式、演算藝術與 NFT 的應用

名詞解釋(非議程內容)

生成式藝術與互動的常用工具

區塊鏈與生成藝術的整合

聊天室問答

好奇使用程式碼創作藝術時,是如何構思作品主題的,與傳統藝術的創作有哪些異同之處?

想問哲宇和其他講者怎麼找到最一手的學習資源的,有具體的建議嗎?

個人心得 1

JSDC 2021 最精實的 20 分鐘,聽完這個議程真的會想要掏錢買講者開的課程

meet god

窮途末路的 SPA,堅持 CSR 到放棄

CSR 與 SSR 不一定壁壘分明,一個網站可以是混合式的 rendering

舉例:使用者會頻繁存取到的首頁(或任何熱門功能)就可以透過 SSR 來處理,而(比如)使用者資料修改、或是使用者在拜訪網站時不會在第一時間去操作的功能,就可以透過 CSR 配合 lazy loading 處理

CSR 無法應付的問題

解決純 CSR 問題的工具

個人心得 2

整個議程聽起來有點像是一開始在選技術的時候沒有透徹研究 CSR 的優缺點(以及公司是否能接受這些缺點),比較多是前端開發不想碰後端相關內容所以選了 CSR 技術,但之後為了處理 CSR 技術做不到的事情所以開始 SSR,血淋淋的教訓 🤔

為什麼許多公司都願意導入 Next.js

關鍵字:大企業會在他們專案的「一部份」頁面導入 Next.js,但並非「一整個專案」都會透過 Next.js 處理

Next.js 解決了 CSR 的什麼問題

圖片優化:使用 Next.js 的 Image 元件

webP(非議程內容)

Next.js 適合拿來當全端框架嗎?

團隊在引入 Next.js 前可以考慮的問題

JavaScript 模組進化論 - 模組化的演進與實戰

模組化之前遭遇的問題

為了解決以上煩惱,IIFE 這個概念誕生了

但 IIFE 無法解決「引入檔案順序」的問題

ESM: ECMAScript Module

解決了 CommonJS 與 IFEE 未處理掉的問題

module compare

Memory Leak 與你的距離

v8 執行 Garbage Collection 的三個階段

The generational hypothesis

理論重點:如果一個物件沒有馬上被 GC 機制從記憶體中回收掉,那麼它就有可能存活很長一段時間

圖片來源:Plumbr

Semi-space Design 與 Minor GC(Scavenge)

semi-space design

延伸閱讀

鳴謝

special thanks

特別感謝 Alpha Camp 全額贊助本次 JSDC 活動之門票 🙏