概述
本文為配置TypeScript+Webpack+React,開發UI元件庫時遇到的坑以及相對應的解決方案記錄,適合相關同學進行查閱解決問題。
本文主要內容為:
tsconfig.js
配置中遇到的問題- 選擇TypeScript Loader遇到的問題
- Webpack遇到的問題
此三類配置和選擇會同時導致某一類問題,因此這三類不作為分類標準,僅作為讀者思考的方向,我們下面會根據具體的問題和錯誤以及對應的解決方案來進行說明。
本文只需略讀,在遇到相對應問題時,能夠知道此處有提供相對應解決方案可以供嘗試即可。
開發中遇到的問題
在專案中使用Webpack對應的alias
在使用TypeScript時,如果需要使用alias功能,有以下兩種方法。相關解決方案參考Stack Overflow上面的回答,不過此回答仍然有部分內容沒有考慮到,我們將在下面介紹時進行說明。
使用ts-loader
使用ts-loader作為loader來編譯TypeScript時,你需要在TypeScript中配置baseUrl
和paths
,具體配置可以參考下面示例:
{
"baseUrl": ".",
"paths": {
"Src/*": [
"src/*"
],
"Interfaces/*": [
"src/interfaces/*"
],
"Components/*": [
"src/components/*"
],
"Utils/*": [
"src/utils/*"
]
}
}
複製程式碼
注:在paths中,絕對路徑不允許以@開頭,如:將@utils的絕對路徑解析到src/utils中。
在tsconfig.json
配置完成後,使用TsConfigPathsPlugin外掛來讀取相關配置檔案到webpack.config.js
中,官方示例配置如下:
const TsconfigPathsPlugin = require(`tsconfig-paths-webpack-plugin`);
module.exports = {
...
resolve: {
plugins: [new TsconfigPathsPlugin({ /*configFile: "./path/to/tsconfig.json" */ })]
}
...
}
複製程式碼
通過這種方法,使用ts-loader就能夠使用alias功能了。
使用awesome-typescript-loader
推薦使用此loader來編譯TypeScript,速度相較於ts-loader來說,肉眼可見的快。
在使用awesome-typescript-loader時,在Stack Overflow的回答中說這個外掛會將tsconfig.json
中的配置檔案自動新增到Webpack中。經過實踐發現,當絕對路徑最終引用的檔案是一個Interface時,只需要在tsconfig.js
中進行指定即可找到相對應檔案。
當絕對路徑最終引用的檔案是一個Function時,如果不指定webpack alias欄位,則會出現相關錯誤,如Module not found: Error: Can`t resolve `Utils/handle-url`
。需要解決此問題,只需要在webpack alias中新增相同配置的alias即可解決。
Webpack支援ts/tsx字尾
需要讓Webpack支援ts/tsx字尾,需要在extension
欄位中新增相對應的值,具體如下:
{
"extensions": [".ts", ".tsx"]
}
複製程式碼
注:需要增加的欄位都需要帶上`.`,否則Webpack仍然不識別。
無法解析tsx檔案
出現錯誤jsx You may need an appropriate loader to handle this file type.
。
需要解決此問題,需要增加tsconfig.json
中的jsx
相對應的值,具體如下:
{
"jsx": "react"
}
複製程式碼
無法找到@types/csstypes
在編譯時,出現無法找到@types/csstypes錯誤,具體錯誤內容為Cannot find module `csstype`.
。
需要解決此問題,需要增加tsconfig.json
中的jsx
相對應的值,具體如下:
{
"moduleResolution": "node"
}
複製程式碼
元素隱含地具有“任何”型別,因為型別“視窗”沒有索引簽名?
將部分JavaScript檔案改成TypeScript檔案時,會出現此錯誤,我遇到的問題是因為:定義的全域性物件沒有確定格式。
需要解決此問題,需要增加指定的Interface,格式如下:
Interface ObjInterface {
[key: string]:string
}
複製程式碼
總結
本文是我在工作中配置TypeScript+Webpack+React開發相關腳手架時遇見的問題,大家只需要閱讀相關目錄,對相對應的問題有所瞭解。在遇到相對應的問題時,再搜尋進行解決即可。