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

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。