Vite 2 + Vue 3 引入 TypeScript (和 JavaScript 混合開(kāi)發(fā))

最近在遷移一個(gè) Vue 2 項(xiàng)目熏版,弄得差不多想起還是有必要整上 TypeScript纷责,但改的過(guò)程中并不想一下子把所有文件從.js改成.ts,那么我們可以在tsconfig.json文件"compilerOptions"配置上 "allowJs": true纳决,"noEmit": true碰逸。

前提是已經(jīng)安裝了 typescript,沒(méi)有的話可以全局npm install -g typescript阔加,或者安裝在項(xiàng)目本地饵史。

具體上完整干貨:

  1. cd 到項(xiàng)目根目錄,命令行敲上tsc –init胜榔,生成tsconfig.json文件胳喷,然后修改如下(部分選項(xiàng)根據(jù)自己需要來(lái)):

??tsconfig.json

{
  "compilerOptions": {
    "target": "esnext",
    "useDefineForClassFields": true, // https://cn.vitejs.dev/guide/features.html#typescript-compiler-options
    "module": "esnext",
    "moduleResolution": "node", // 指定模塊解析策略,'node' 用于 Node.js 的 CommonJS 實(shí)現(xiàn)
    "strict": true,
    "allowJs": true, // 允許編譯器編譯JS夭织,JSX文件
    "checkJs": true,
    "noEmit": true, // 編譯后不輸出任何js文件
    "jsx": "preserve", // 在 .tsx 中支持 JSX
    "sourceMap": true, // 生成目標(biāo)文件的 sourceMap 文件
    "resolveJsonModule": true, // 允許導(dǎo)入帶有“.json”擴(kuò)展名的模塊
    "esModuleInterop": true, // CommonJS/AMD/UMD 模塊導(dǎo)入兼容
    "importHelpers": true, // 模塊導(dǎo)入輔助吭露,通過(guò) tslib 引入 helper 函數(shù),https://www.typescriptlang.org/tsconfig#importHelpers
    "experimentalDecorators": true,
    "skipLibCheck": true, // 跳過(guò)庫(kù)聲明文件的類型檢查
    "allowSyntheticDefaultImports": true, // 允許如 import React from "react" 這樣的默認(rèn)導(dǎo)入(從沒(méi)有設(shè)置默認(rèn)導(dǎo)出的模塊中默認(rèn)導(dǎo)入)
    "suppressImplicitAnyIndexErrors": true, // 禁止報(bào)告對(duì)象索引的隱式 anys 錯(cuò)誤
    "baseUrl": "./", // 非絕對(duì)地址的模塊會(huì)基于這個(gè)目錄去解析尊惰,默認(rèn)值是當(dāng)前目錄
    "types": ["node", "vite/client"], // 指定加載【哪些】聲明文件包讲竿,如不設(shè)置此項(xiàng)泥兰,默認(rèn)會(huì)加載全部能找到的 node_modules/@types/xxx 包
    // "vite/client"用于 vite 項(xiàng)目中的一些類型定義補(bǔ)充,https://www.typescriptlang.org/tsconfig#types
    "isolatedModules": true, // https://cn.vitejs.dev/guide/features.html#typescript-compiler-options
    "paths": {
      // 配置具體如何解析 require/import 的導(dǎo)入题禀,值是基于 baseUrl 路徑的映射列表鞋诗。https://www.typescriptlang.org/tsconfig#paths
      "@/*": ["src/*"],
      // ...
    },
    "lib": ["esnext", "dom", "dom.iterable", "scripthost"] // 編譯時(shí)引入的 ES 功能庫(kù)
  },
  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
  "exclude": ["node_modules"] // 解析時(shí)跳過(guò)的文件
}
  1. 在 src 目錄下添加一個(gè) d.ts 聲明文件:

如 ??src/shims-vue.d.ts

/// <reference types="vite/client" />

// 定義 *.vue 文件的類型,否則 import 所有 *.vue 文件都會(huì)報(bào)錯(cuò)
declare module '*.vue' {
  import { DefineComponent } from 'vue'
  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
  const component: DefineComponent<{}, {}, any>
  export default component
}

// ...

這會(huì)和compilerOptions.types"vite/client"項(xiàng)一起迈嘹,提供以下類型定義補(bǔ)充:

  • 資源導(dǎo)入 (例如:導(dǎo)入一個(gè) .svg 文件)
  • import.meta.env 上 Vite 注入的環(huán)境變量的類型定義
  • import.meta.hot 上的 HMR API 類型定義

另外導(dǎo)入一些庫(kù)的時(shí)候可能會(huì)報(bào)Cannot find module 'xxx'..這種找不到模塊的錯(cuò)削彬,原因是沒(méi)有找到對(duì)應(yīng)的聲明文件。

  • 有些庫(kù)如lodash可以通過(guò)安裝類型定義包來(lái)解決:npm install -S @types/lodash秀仲;
  • 若部分插件尚且沒(méi)有自己的 typescript 定義文件融痛,就在我們之前的src/shims-vue.d.ts里聲明一下,如:
// src/shims-vue.d.ts

// remove this part after vue-count-to has its typescript file
declare module 'vue-count-to'

declare module 'vue-echarts'

然后就可以逐步將一些*.js改成*.ts并進(jìn)行類型定義補(bǔ)充和修改了神僵,可以先從main.js做起雁刷。

關(guān)于遷移的其他報(bào)錯(cuò)和問(wèn)題,可以參考官網(wǎng)的 JavaScript 遷移文檔挑豌。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末安券,一起剝皮案震驚了整個(gè)濱河市墩崩,隨后出現(xiàn)的幾起案子氓英,更是在濱河造成了極大的恐慌,老刑警劉巖鹦筹,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铝阐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡铐拐,警方通過(guò)查閱死者的電腦和手機(jī)徘键,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)遍蟋,“玉大人吹害,你說(shuō)我怎么就攤上這事⌒榍啵” “怎么了它呀?”我有些...
    開(kāi)封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)棒厘。 經(jīng)常有香客問(wèn)我纵穿,道長(zhǎng),這世上最難降的妖魔是什么奢人? 我笑而不...
    開(kāi)封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任谓媒,我火速辦了婚禮,結(jié)果婚禮上何乎,老公的妹妹穿的比我還像新娘句惯。我一直安慰自己土辩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布抢野。 她就那樣靜靜地躺著脯燃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蒙保。 梳的紋絲不亂的頭發(fā)上辕棚,一...
    開(kāi)封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音邓厕,去河邊找鬼逝嚎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛详恼,可吹牛的內(nèi)容都是我干的补君。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼昧互,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挽铁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起敞掘,我...
    開(kāi)封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叽掘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后玖雁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體更扁,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年赫冬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浓镜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡劲厌,死狀恐怖膛薛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情补鼻,我是刑警寧澤哄啄,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站辽幌,受9級(jí)特大地震影響增淹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乌企,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一虑润、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧加酵,春花似錦拳喻、人聲如沸哭当。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钦勘。三九已至,卻和暖如春亚亲,著一層夾襖步出監(jiān)牢的瞬間彻采,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工捌归, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肛响,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓惜索,卻偏偏與公主長(zhǎng)得像特笋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子巾兆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容