iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 8
0
Modern Web

Next.js + 各種套件組合系列 第 8

Next.js & Typescript

介紹
Typescirpt 以下簡稱 TS 是一個強型別的語言在 React 通常也可以使用 Flow 來增加型別,TS 有更多優異的功能例如智能提示,有錯誤在開發階段型別有錯誤馬上提示,不會累積到要 Build 的時候在提示錯誤,此外在重構也可以使用 Referenc 看看程式關聯避免漏掉 ,TS 也有支援 JSX 副檔名為tsx ,更強的是也內建了 Babel 轉換功能,而且是babel未來版本都支援,所以使用 TS 是一個很好的選項

安裝
npm i typescirpt concurrently -D

設定
因為 Typescirpt 是開發時期會使用所以加上 -D , 另外 concurrently 是同步執行的意思因為在 package.json script 中 TS 會執行 tsc --watch 只要有異動檔案就會自動 Rebuild 程式碼 因為除了執行 tsc --watch(持續不中斷), Next.js 也需要同時並行所以需要 concurrently, 這樣就可以在 package.json 的 script 縮短成一行指令同時執行(要不然就要分兩次執行)

package.json
設定concurrently 同時跑 tsc 監聽與 next, \是包在"裡面

    "dev": "concurrently \"tsc --pretty --watch\" \"next\"",

Typescirpt 的tsconfig.json 檔案是重點, 設定完後就會代理許多事情

{
  "compilerOptions": {
    "outDir": "./dist",   
    "module": "commonjs",
    "target": "es2015",
    "moduleResolution": "node",
    "jsx": "react",
    "allowJs": true,
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2017"
    ]
  }
}

常見的設定就如同上方
outDir 是輸出的資料夾根據 target 看要產生哪種的 script 以上範例指定 es2015 也就是 es6
moduleResolution 因為 Next.js 是屬於 node 項目所以選擇 node
jsx 可以選擇 react 或是 react-native
typeRoots 是預設 ts module 的定義檔
lib 如果選擇 2017 就會包含之前所有的 2016 2015....等等

以上設定完後就可以享受 Typescirpt 帶來的智能提示以及一些強型別錯誤的偵測功能
進到程式端的部分 以 React 基本元件為 範例

interface Props {
// 這邊定 Props 有哪些
    Open:boolean,
    Word:string
}
interface States {
// 這邊定 States 有哪些
    Show?:boolean
}

class componentName extends React.Component<Props, States> {

省略
}

以上是定義這個元件的 Props 與 States 的 interface 這樣就可以在這個 元件 呼叫 Props 或是 States 的時候用到智能提示了,如果有缺少的也立即用紅色小波浪提示,只要把滑鼠移到小波浪就會提示哪些沒有吻合定義檔

當越來越多程式會用到各式各樣的 Plugin 的時候這時後,會建議 由 TS Build Script 後再由 Next.js 來幫忙補需要的 Plugin ,例如要加上一些 bablerc 但又不希望由 TS 來加入,所以在 script 的部分就會使用到一些檔案搬移的工作.

以下的 script 就會每次在執行tsc之前先把移除之前的檔案再把需要的檔案建立好然後再把 TS 的程式藉由tsc幫忙轉換 (mac 或 linux指令)


    "dev:prework": "rm -rf ./dist && mkdir ./dist && cp -rf static ./dist/static && cp ./nextwork/.babelrc ./dist && tsc",

補充 如果是用 windows 的話指令要改 rimraf cp-cli

總結

在 React 中使用 Typescirpt 設定上不會很難,好處也多多,建議 Typescirpt 與 Next.js 需要理解各自的用途,然後再進行組合發揮各自的功能,這樣可以讓設定檔變更少,例如 Next.js 就有例如提供 Automatic Code Splitting 而 TS 有幫忙轉 Babel 等等...這兩者的搭配可以少設定 Webpack 或 BabelRc ,如果真的有需要在交付給 Next.js 的next.config.js ... 沒有看到 Webpack或BabelRc 那些設定專注於開發 是一件心情很好的事啊

參考設定檔案

https://github.com/polo13999/StartWithTsAndNext


上一篇
Next.js & Styled-component
下一篇
Next.js & Recompose
系列文
Next.js + 各種套件組合30

1 則留言

0
Wolke
iT邦新手 3 級 ‧ 2017-12-11 20:02:38

下一篇 要講 vs code 設斷點嗎?

polo iT邦新手 4 級 ‧ 2017-12-11 20:36:40 檢舉

那個你來講,坐等顆顆

我要留言

立即登入留言