Haydenull

Haydenull

A front-end developer with a passion for using technology to increase personal efficiency and productivity 💡.
twitter

2023-01-30 週報

2023 第一篇周報,本週主要是 TypeScript 5.0 Beta 發佈,以及一些其他的技術新聞。

01 月 23 日 - 01 月 29 日#

本週技術新聞#

TypeScript 5.0 Beta 發佈#

TypeScript 發佈了 5.0 beta 版,可以使用以下命令安裝:

$ npm install typescript@beta

簡述幾個比較重要的更新:

1. Decorators 裝飾器#

EcmaScript 的裝飾器標準已經進入 Stage3,這意味著裝飾器將會成為 JavaScript 的標準特性。

在過去的版本中 TypeScript 已經支持了裝飾器,但需要手動開啟 experimentalDecorators 編譯選項。在 5.0 版本中,裝飾器已經成為了正式特性,不需要再開啟編譯選項。

下面是一個簡單的裝飾器的例子:

function loggedMethod(originalMethod: (...args: any[]) => any, context: ClassMethodDecoratorContext) {
  const methodName = String(context.name)

  return function(this: any, ...args: any[]) {
    console.log(`LOG: Entering method '${methodName}'.`)
    const result = originalMethod.call(this, ...args)
    console.log(`LOG: Exiting method '${methodName}'.`)
    return result
  }
}

class Person {
  name: string
  constructor(name: string) {
    this.name = name
  }

  @loggedMethod
  greet() {
    console.log(`Hello, my name is ${this.name}`)
  }
}

const p = new Person('Jack')
p.greet()

// Output:
//
//   LOG: Entering method.
//   Hello, my name is Jack.
//   LOG: Exiting method.

2. const 類型參數#

TypeScript 5.0 支持了 const 類型參數,這意味著你可以使用 const 修飾符來限制類型參數的值為常量。

const routes = <T>(routes: T[]) => {
  const addRedirect = (from: T, to: T) => {
    // ...
  }
  return {
    addRedirect,
  }
}

const router = routes(["/home", "/about", "/contact"])
router.addRedirect("/home", "/about") // 類型正確
router.addRedirect("/home", "/blog") // 類型正確

在上面的例子中 router.addRedirect("/home", "/blog") 不會報錯,因為 fromto 的類型參數都是 string,但是這樣的代碼是不正確的,因為 /blog 並不是 routes 的參數。

使用 const 修飾符可以限制類型參數的值為常量,這樣就可以避免上面的錯誤。

const routes = <const T extends string>(routes: T[]) => {
  const addRedirect = (from: T, to: T) => {
    // ...
  }
  return {
    addRedirect,
  }
}

const router = routes(["/home", "/about", "/contact"])
router.addRedirect("/home", "/about") // 類型正確
router.addRedirect("/home", "/blog") // 類型錯誤: TS 推斷出 from 和 to 的類型為 "/home" | "/about" | "/contact"

3. 所有的 Enum 都改為 Union enums#

在 4.9 中:

enum LogLevel {
  DEBUG,
  WARN,
  ERROR,
}

const log = (level: LogLevel) => {
  // ...
}

log(LogLevel.DEBUG) // 類型正確
log(0) // 類型正確
log(123456) // 類型正確

舊版的 TypeScript 中使用 enum 作為類型時是不安全的,在上面的例子中 log(123456) 是不會報錯的,只要是數字就可以通過檢查。

在 5.0 中,所有的 enum 都是 Union enums,這意味著 enum 的值只能是 enum 的成員。

enum LogLevel {
  DEBUG,
  WARN,
  ERROR,
}

const log = (level: LogLevel) => {
  // ...
}

log(LogLevel.DEBUG) // 類型正確
log(0) // 類型正確
log(123456) // 類型錯誤

另外需要注意:

enum LogLevel {
  DEBUG = 'debug',
  WARN = 'warn',
  ERROR = 'error',
}

const log = (level: LogLevel) => {
  // ...
}

log(LogLevel.DEBUG) // 類型正確
log('debug') // 類型錯誤: 注意數字枚舉與字符串枚舉表現不一致

編者按: TS 中的 enum 為了迎合 js 有一些奇怪的行為,比如反向映射,這裡不做過多介紹,關於是否使用 enum 網上有很多討論,大家可以自行搜尋,我個人對 enum 的態度是能不用就不用(大多數情況 enum 都可以被 object as const 以及 union type 取代),如果需要使用請一定明確使用目的,了解可能存在的問題。

4. 自動填充 switch 語句的 case#

case 語句可以窮盡所有的可能性,並自動填充。

image

5. 速度及尺寸優化#

TypeScript 5.0 有一些性能優化,與 4.9 的對比見下圖:

image

Vite 4.1.0 beta 發佈#

Vite 4.1.0 beta 發佈,主要是一些 bug 修復。

我們順便回顧一下 vite 的發展歷程:

1. Vite 1#

Vite 1 的主要目標是為 Vue 組件提供快速的開發體驗,它的核心是基於瀏覽器原生的 ES Module 實現的。

2. Vite 2#

  • Vite2 完全重構了代碼,使其可以支持任何框架,所有特定於框架的支持都委託給了插件。
  • Vite2 提供了 SSR 支持
  • 支持舊版本瀏覽器

3. Vite 3#

  • 使用 Vuepress 構建全新文檔
  • 支持模板
  • 減小構建體積
  • 單測與 E2E 測試遷移到 Vitest

同時, Vite 團隊決定每年至少一個大版本,以配合 Node.js 的 EOL。

4. Vite 4#

  • 升級到 Rollup 3
  • 開發過程中使用 SWC 的新 React 插件
    • @vitejs/plugin-react 是一個使用 esbuild 和 Babel 的插件
    • @vitejs/plugin-react-swc 是一個新插件,在構建過程中使用 esbuild,但在開發過程中使用 SWC 取代 Babel,冷啟動以及 HMR 速度更快

美團 2022 技術年貨#

點擊查看前端年貨 pdf

個人比較喜歡函數式編程的部分,但是這個年貨裡講的比較偏理論,尤其是關於 Monad 的部分,特別數學,我更加喜歡這篇知乎的文章,講的通俗易懂。

自從 React 在前端火了以後,它所推崇的函數式編程思想也在前端火了起來,但是函數式編程的理論知識卻很少有人去深入了解,函數式編程其實在前端也是非常有用處的,尤其是我們時時刻刻在與副作用打交道。

理解函數式編程,可以讓我們有意識地控制副作用,減少代碼 bug,同時也能加深對 React 的理解,寫出更好的 React 代碼。

The Pens of 2022 on CodePen#

codepen 2022 年的流行代碼。有許多有意思的動畫效果,可以添加到自己的項目中。

其他新聞#

GitHub 用戶數到達 1 億#

Github 在網頁上專門加了一個動畫,來慶祝用戶數到達 1 億。

可以點擊這裡去查看。

image

ChatGpt 即將開放 API#

ChatGpt 是 OpenAI 的一個聊天機器人,可以充當私人助理。

目前已經可以申請 wait list,等待開放。

根據目前 Twitter 放出的信息,可以知道其價格:

image

另:傳言 Microsoft 考慮將 ChatGpt 集成到 Bing 搜索中。或許這是一個彎道超車 Google 的機會。

幾個使用 OpenAI 的項目#

  1. readpilot

輸入鏈接,AI 幫你閱讀文章並以 Q&A 的形式總結

該項目完全開源: https://github.com/forrestchang/readpilot

  1. email-helper

讓 AI 幫你寫郵件

開源: https://github.com/shengxinjing/email-helper

一些想法#

最近越來越多的使用 GPT-3 的項目出現真有點新時代的意思了。看到一個很有意思的說法:

計算機使用二進制語言,人類使用自然語言,程序員的工作是使用編程語言將人類的想法翻譯給計算機。

而 GPT-3 讓這兩種語言可以互相轉換。這樣的話,未來的計算機就可以和人類一樣,用自然語言來交流了。

最近看的一本書《銀河之心》裡人類有一個分支是鐵人,他們的身體細胞都是納米機器人,從某種意義上講這樣的人類已經接近神了,在計算機的輔助下可以言出法隨,可以接近全知全能,而 AI 是這種進化的第一步。

文章推薦#

開源軟件指南#

Github 官方出品的開源軟件指南,包含了如何創建開源項目、如何維護開源項目、如何參與開源項目等等。

工具推薦#

OSS Insight#

OSS Insight 是一個開源項目的分析工具,可以分析開源項目的貢獻者、代碼量、代碼質量、代碼重複率、代碼覆蓋率、代碼安全性等等。

它自帶了一些 Collection,比如比較受歡迎的 js 打包工具排行,受歡迎的 UI 庫排行等,你也可以自己創建 Collection。

YouGlish#

youglish 是一個英語學習網站,可以通過視頻來學習英語。

在 youglish 中,你可以輸入一段英文,然後它會在 YouTube 中搜索相關的視頻,然後將視頻中的英文和你輸入的英文進行對比,高亮顯示你輸入的英文在視頻中的位置。

你可以通過這個網站來學習英語的發音,或者學習英語的語法。

QuickReference#

各種技術棧文檔速查

vhs#

用腳本的方式錄製終端命令行的操作,生成 gif 圖片。

具體效果可以看這個 mht-cli 錄製的 demo

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。