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")
不會報錯,因為 from
和 to
的類型參數都是 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 語句可以窮盡所有的可能性,並自動填充。
5. 速度及尺寸優化#
TypeScript 5.0 有一些性能優化,與 4.9 的對比見下圖:
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 技術年貨#
個人比較喜歡函數式編程的部分,但是這個年貨裡講的比較偏理論,尤其是關於 Monad 的部分,特別數學,我更加喜歡這篇知乎的文章,講的通俗易懂。
自從 React 在前端火了以後,它所推崇的函數式編程思想也在前端火了起來,但是函數式編程的理論知識卻很少有人去深入了解,函數式編程其實在前端也是非常有用處的,尤其是我們時時刻刻在與副作用打交道。
理解函數式編程,可以讓我們有意識地控制副作用,減少代碼 bug,同時也能加深對 React 的理解,寫出更好的 React 代碼。
The Pens of 2022 on CodePen#
codepen 2022 年的流行代碼。有許多有意思的動畫效果,可以添加到自己的項目中。
其他新聞#
GitHub 用戶數到達 1 億#
Github 在網頁上專門加了一個動畫,來慶祝用戶數到達 1 億。
可以點擊這裡去查看。
ChatGpt 即將開放 API#
ChatGpt 是 OpenAI 的一個聊天機器人,可以充當私人助理。
目前已經可以申請 wait list,等待開放。
根據目前 Twitter 放出的信息,可以知道其價格:
另:傳言 Microsoft 考慮將 ChatGpt 集成到 Bing 搜索中。或許這是一個彎道超車 Google 的機會。
幾個使用 OpenAI 的項目#
輸入鏈接,AI 幫你閱讀文章並以 Q&A 的形式總結
該項目完全開源: https://github.com/forrestchang/readpilot
讓 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