2022-04-14使用ts重構(gòu)vue2項(xiàng)目

一赵讯、改動點(diǎn)

1. 安裝依賴
  • 如果不使用基于類的組件(使用基本組件)略過這步
    vue-class-component :官方維護(hù)的裝飾器
    vue-property-decorator :基于vue-class-component的裝飾器格嗅,社區(qū)維護(hù)
    npm install --save vue-class-component vue-property-decorator 
    
  • 必須安裝
    npm install --save-dev ts-loader typescript
    
  • 其他(eslint相關(guān))
    @typescript-eslint/eslint-plugin
    @typescript-eslint/parser
2. 修改webpack配置(vue.config.js)
configureWebpack: (config) => {
  config.resolve.extensions.push('.ts');   // 添加ts擴(kuò)展文件:引用ts文件的時(shí)候不用寫后綴名
  config.module.rules.push({             // 使用ts-loader對ts/tsx文件打包編譯
    test: /\.tsx?$/,
    loader: 'ts-loader',
    exclude: /node_modules/,
    options: {
      appendTsSuffixTo: [/\.vue$/],    // ts編譯器tsc不能識別.vue文件译秦,所以在 .vue文件后加.ts后綴
    },
  });
}
3. 根目錄下新建tsconfig.json文件(或者使用tsc --init自動生成)
  • compilerOptions用于確定如何編譯ts文件

  • 使用官方/默認(rèn)配置即可米愿。

  • 自定義配置參考:

     "compilerOptions": {
       "target": "es5",  // 指定ECMAScript目標(biāo)版本
       "module": "commonjs",  // 指定生成哪個(gè)模塊系統(tǒng)代碼
       "allowJs": true,   // 允許編譯js文件
       "sourceMap": true, // 是否生成map文件
       "strict": true, // 啟用所有嚴(yán)格類型檢查選項(xiàng)
       "noUnusedLocals": true,
       "baseUrl": ".",   // 工作根目錄
       "paths": {          // 和webpack中resolve.alias配置一樣
           "@/*": [
             "src/*"     
           ]
        }, 
       "esModuleInterop": true, // 支持使用esm的方式引入commonjs包
       "experimentalDecorators": true, // 啟用試驗(yàn)性的es裝飾器(如果要使用裝飾器的話)
       "skipLibCheck": true, // 忽略所有的聲明文件的類型檢查。
       "forceConsistentCasingInFileNames": true. // 禁止對同一個(gè)文件的不一致的引用(將強(qiáng)制區(qū)分大小寫)擦酌。
     }
    
    1. \color{red}{*}path路徑查找注釋minimatch闺鲸,用來模式匹配字符串的庫。
    • *匹配 0 個(gè)或多個(gè)字符赛糟,不包含目錄分隔符
    • **/遞歸匹配任意子目錄
    1. esModuleInterop作用解析
    2. compilerOptions編譯選項(xiàng)
4. 修改.eslintrc.js文件:詳見(二派任、重構(gòu)問題/踩坑-Q2)
5. src根目錄下創(chuàng)建聲明文件支持引入.vue文件(必須)
// shims-vue.d.ts
//通配符聲明模塊
declare module '*.vue' {
    import Vue from 'vue';  // import寫里面,不要寫外面(原因待補(bǔ)充)
    export default Vue;
}
6. 支持this訪問vue原型上定義的功能(非必須)
// type.d.ts
import { default as Axios } from '@/plugins/axios.js'
declare module 'vue/types/vue'{
    interface Vue {
        $axios: Axios;
    }
}

二璧南、重構(gòu)問題/踩坑

Q1:import Vue from 'vue' => Cannot find module ‘vue’.
原因
解決:tsconfig.json配置

"target": "es5",             
"module": "es6", 

修改為

"target": "es5",             
"module": "commonjs", 

Q2:.vue文件使用ts語法eslint報(bào)錯(cuò)
解決:修改.eslintrc文件(目前只針對特定重構(gòu)目錄使用ts解析掌逛,后面有更合適的配置會修改)
待解決:怎么對不同目錄下的文件分別使用不同的配置。\color{red}{已解決}

  • (解決方式:在子目錄下配置自己的eslintrc文件司倚。層疊配置使用離要檢測的文件最近的 .eslintrc文件作為最高優(yōu)先級豆混,然后才是父目錄里的配置文件。配置沖突時(shí)动知,子目錄配置會覆蓋根目錄配置)eslint-Configuration Cascading and Hierarchy
 overrides: [{
    files: [
      '**/financial_manage/**/*.ts',
      '**/financial_manage/**/*.tsx',
      '**/financial_manage/**/*.vue',
    ],
    plugins: ['@typescript-eslint'],
    parserOptions: {
      parser: '@typescript-eslint/parser',
    },
  }],

Q3:使用this訪問定義在vue原型上的功能
解決:在type.d.ts文件進(jìn)行模塊補(bǔ)充(在shims-vue.d.ts聲明會使之前對.vue的聲明皿伺、自定義模塊的聲明等全部失效。)盒粮。重點(diǎn)是模塊補(bǔ)充和其他的分開兩個(gè)文件寫鸵鸥,也可以在shims-vue.d.ts中聲明原型上的方法屬性,在type.d.ts.vue聲明ts識別處理vue文件丹皱。聲明文件名遵循xxx.d.ts就可以脂男。
原因:暫時(shí)不知道(待補(bǔ)充)
Q4:ts文件引入js報(bào)錯(cuò)
解決:

  1. 方法一:tsconfig.json設(shè)置allowJs:true
  2. 方法二:聲明文件中聲明模塊
  3. 方法三:使用require導(dǎo)入

三、tsconfig.json文件配置項(xiàng)

1. target种呐、module、lib
  • ES版本:ES6 == ES2015 ES7 == ES2016 ES8 == ES2017 ESNext(泛指) == es最新版本的下一版本
  • target:指定ECMAScript目標(biāo)版本
    默認(rèn)值:ES3
    選值:"ES5"弃甥, "ES6"/ "ES2015"爽室, "ES2016", "ES2017"或 "ESNext"
  • module: 指定生成哪個(gè)模塊系統(tǒng)代碼
    默認(rèn)值:target === "ES6" ? "ES6" : "commonjs"
    選值:"None"淆攻, "CommonJS"阔墩, "AMD", "System"瓶珊, "UMD"啸箫, "ES6"或 "ES2015"
  • lib:編譯過程中需要引入的標(biāo)準(zhǔn)庫文件的列表
    默認(rèn)值: - target ES5:DOM,ES5伞芹,ScriptHost
    - target ES6:DOM忘苛,ES6蝉娜,DOM.Iterable,ScriptHos
  • types:要包含的類型聲明文件名列表
    默認(rèn):所有可見的"@types"包會在編譯過程中被包含進(jìn)來扎唾;如果指定了types召川,只有被列出來的包才會被包含進(jìn)來
    \color{red}{*}所以不清楚所有node_modules/@types中全局聲明文件意義的時(shí)候,盡量不要單獨(dú)設(shè)置types胸遇,可能會產(chǎn)生一些例如es語法無法匹配到標(biāo)準(zhǔn)庫的bug
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荧呐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纸镊,更是在濱河造成了極大的恐慌倍阐,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逗威,死亡現(xiàn)場離奇詭異峰搪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)庵楷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門罢艾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尽纽,你說我怎么就攤上這事咐蚯。” “怎么了弄贿?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵春锋,是天一觀的道長。 經(jīng)常有香客問我差凹,道長期奔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任危尿,我火速辦了婚禮呐萌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘谊娇。我一直安慰自己肺孤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布济欢。 她就那樣靜靜地躺著赠堵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪法褥。 梳的紋絲不亂的頭發(fā)上茫叭,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音半等,去河邊找鬼揍愁。 笑死呐萨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吗垮。 我是一名探鬼主播垛吗,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烁登!你這毒婦竟也來了怯屉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饵沧,失蹤者是張志新(化名)和其女友劉穎锨络,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狼牺,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡羡儿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了是钥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掠归。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖悄泥,靈堂內(nèi)的尸體忽然破棺而出虏冻,到底是詐尸還是另有隱情,我是刑警寧澤弹囚,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布厨相,位于F島的核電站,受9級特大地震影響鸥鹉,放射性物質(zhì)發(fā)生泄漏蛮穿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一毁渗、第九天 我趴在偏房一處隱蔽的房頂上張望践磅。 院中可真熱鬧,春花似錦灸异、人聲如沸音诈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至褥傍,卻和暖如春儡嘶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恍风。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工蹦狂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留誓篱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓凯楔,卻偏偏與公主長得像窜骄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子摆屯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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