前一天【環境建立】時提到,執行 tsc --init
會自動生成 tsconfig.json
,也介紹了各個默認配置選項的涵義。今天就不對默認配置做太多說明,來分享幾個實用、常見的配置選項吧
// 默認配置
{
"compilerOptions": {
"target": "es2016", // 指定編譯後的 JS 版本
"module": "commonjs", // 指定編譯後的 JS 要使用哪種模組系統
"strict": true, // 是否啟用所有嚴格的型別檢查選項
"esModuleInterop": true, // 是否允許 TypeScript 導入符合 ES6 模組規範的模組
"skipLibCheck": true, // 是否跳過對 `.d.ts` (聲明檔案)的型別檢查, d:declaration
"forceConsistentCasingInFileNames": true // 大小寫是否敏感
}
}
🔗 Day2 環境建立傳送門:https://ithelp.ithome.com.tw/articles/10349532
tsconfig.json 的配置選項非常多,通常是用到再去找就好
但身邊有朋朋提出疑問:「對配置選項沒有概念,有時候根本不知道哪些地方有提供選項做設定」
覺得這真是個好問題耶~ 官方其實有作分類,分得很細資訊量挺大的XD
所以這邊將分類整合一下:
這邊抽幾個配置來介紹~
target
(官方說明):指定編譯後的 JS 版本,例如:es5
, es6
, es2016
, ESNext
等P.S. ESNext
則表示使用目前最新、尚未被 ECMAScript 正式納入標準的版本
lib
(官方說明):指定編譯時需要引入哪些特定函式庫檔案,例如:ES6
、DOM
、DOM.Iterable
等DOM: 基本定義和 DOM API (基本定義包括 window, document)
DOM.Iterabl:算是 DOM 的擴展,加入對可迭代的 DOM 集合(NodeList、HTMLCollection 等)的支持,像是能使用 for 迴圈去操作
jsx
(官方說明):指定要如何處理 jsx
的語法,用於 React 開發。可以設定為 preserve
、react
、react-jsx
、react-native
等preserve:JSX 代碼不會被處理,保留原樣
strict
(官方說明):是否啟用所有嚴格的型別檢查選項
預設是自動啟用,可以根據專案需求再單獨關閉或註解特定選項的檢查
noImplicitAny
(官方說明):不允許隱含的 any 型別,提醒開發者是否有未明確型別的地方
baseUrl
(官方說明):導入模組時的起始路徑./
或 ./src
,4.1
版本後當你有設置 paths
,這選項就不是必須的了project
├—— src
├—— components
├—— Header.vue
├—— utils
├—— helpers.ts
tsconfig.json
以這個資料夾結構為例,假設 baseUrl: "./"
,那在 Header.vue
中這樣引入 helpers.ts
import { helpersFunc } from 'utils/helpers';
若沒設置 baseUrl
,則要這樣引入
import { helperFunction } from '../../utils/helpers';
module
(官方說明):指定編譯後的 JS 要使用哪種模組系統(module system)
可以填入 none、commonjs、amd、umd、es2020、ESNext 等
rootDir
(官方說明):告訴 TypeScript 編譯器要從哪個根路徑去編譯(定義編譯的源頭)
如果你發現你的 src 或是不該被編譯的資料夾出現在 dist 中,就要注意有可能是此選項沒設定好
預設是 ./
,通常設定為 ./src
rootDir 不會影響到 include
、exclude
、files
的設定,他們有各自負責的工作
rootDir 主要用於設定編譯輸出的目錄結構,而不是控制哪些文件應被包括或排除在編譯中
P.S. rootDirs
:與 rootDir 不同的是,rootDirs 允許多個目錄作為編譯的源頭
paths
(官方說明):設置路徑別名,類似 webpack 的 alias
{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
},
}
}
resolveJsonModule
(官方說明):是否能在 TypeScript 中導入 JSON 文件,需要讀取 JSON 文件的時候很實用{
"resolveJsonModule": true,
}
來看看範例
假設有一個 data.json
{
"name": "Hannah",
"type": "Human"
}
在 importJSON.ts
引入 data.json
import data from './JSON/data.json'; // ✅ Pass,不會報錯
console.log(data.name); // Hannah
console.log(data.type); // Human
sourceMap
(官方說明):編譯時是否輸出 .map 文件,通常是 .js.map
或.jsx.map
,便於在開發工具中進行測試、查看sourceMap: true
時,編譯後會在 dist 資料夾裡看到相對應的 .js.map
檔
你會在編譯出的 .js
檔案裡看到這段自動生成的註解 //# sourceMappingURL=test.js.map
當然 .js 前的檔名會隨著檔案名稱做變化
outDir
(官方說明):指定編譯後輸出的資料夾,一般是 ./dist
removeComments
(官方說明):是否在編譯時移除代碼中的註釋
true 代表將從編譯後的 JavaScript 中移除所有註解,提升載入速度。如果在開發過中希望保留註解方便除錯,可以設定為 false 或直接註解此設定
以下這些選項是寫在 Root Fields,跟 compilerOptions 在同一層
include
(官方說明):指定哪些文件「要」被編譯,可設定多個並用逗號隔開{
"include": ["src/**/*"] // src 目錄下的所有檔案(包括子目錄)
}
files
(官方說明):明確指定要進行編譯的檔案,TS 只會編譯這裡列出的檔案。當今天專案很小時,甚至小到只有幾支檔案時,用 files 就很合適{
"compilerOptions": {},
"files": ["core.ts", "types.ts"]
}
files 和 include 就像手足,他們個性上有相似的地方,但本質上卻不同
編譯器爸爸接受他們同時存在,但沒辦法同時聽兩個人的意見,心只容得下一人
files 用於明確指定要編譯的檔案, include 用於指定特定檔案的規則
如果只定義了 files,則只有 files 內的檔案會被編譯。
如果只定義了 include,則所有符合 include 規則的檔案都會被編譯。
如果同時定義了 files 和 include,只有 files 中列出的檔案會被編譯,include 的不會。
exclude
(官方說明):指定哪些文件「不要」被編譯,也就是「排除」。預設是 node_modules
, outDir的值
, bower_components
, jspm_packages
{
"exclude": ["node_modules", "dist"]
}
extends
(官方說明):是否繼承一個現有的 tsconfig.json 配置,值會是字串,裡面填上檔案路徑
文字描述不好懂的話,可以看圖
references
(官方說明):references 是在TypeScript 3.0 新增的,如果專案裡有很多個 tsconfig.json 檔案,例如 tsconfig.base.json
, tsconfig.node.json
,可以透過 references 指定要引用的專案。這個配置特別適用於大型專案或前後端都放在同個專案下時,可以被組織成多個相互依賴的子專案(例如:共享庫)project
├—— src
tsconfig.json
tsconfig.node.json
在 tsconfig.json
中加上下面這段
references 的結構為陣列包物件,也是寫在 Root Fields,跟 compilerOptions 在同一層
{
"references": [
{ "path": "./tsconfig.node.json" }
]
}
tsconfig.node.json
reference 裡所有參考的子專案中的 composite 務必要設為 true,因為 composite 啟用了 TypeScript 的增量編譯特性,這對在管理和編譯相互依賴的多個專案時是必需的
{
"compilerOptions": {
"composite": true,
}
}
每天講的內容有推到 github 上喔