vue接入ts基本方法
下面將以項(xiàng)目搭建的方式完成改文章敘述:
項(xiàng)目基礎(chǔ)架構(gòu)是通過(guò)cli搭建的,主要是vue(2.5.16)+ webpack(3.6.0)+ element-ui(2.8.2),整體項(xiàng)目還簡(jiǎn)單用了vuex,eslint等。
一、依賴(lài)記
項(xiàng)目從基礎(chǔ)js改為ts,因?yàn)槭浅醮螄L試,本著最小依賴(lài)、最小改動(dòng)原則,只引入了一些基礎(chǔ)依賴(lài):
typescript
:#3.1.6 -- 接入ts的基礎(chǔ)依賴(lài),版本需要根據(jù)項(xiàng)目相關(guān)版本進(jìn)行修改ts-loader
:#3.5.0 -- 同樣是基礎(chǔ)依賴(lài)- ts-lint tslint-config-standard tslint-loader -- 這三個(gè)是將原來(lái)的eslint校驗(yàn)替換掉,沒(méi)仔細(xì)研究過(guò),應(yīng)該是可以處理一些引入了ts之后eslint導(dǎo)致的莫名其妙的校驗(yàn)問(wèn)題。
二、配置記
webpack.base.config.js修改:
入口文件將原來(lái)的.js改為.ts
entry: { ? ? app: ['babel-polyfill', './src/main.ts'] ?},
resolve.extensions增加ts:
extensions: ['.tsx', '.ts', '.js', '.vue', '.json'],
rules增加對(duì)ts的解析:
{ ? ? test: /\.(ts|tsx)?$/, ? ? loader: 'ts-loader', ? ? exclude: /node_modules/, ? ? options: { ? ? ? appendTsxSuffixTo: [/\.vue$/], ?// ts不知道如何處理.vue結(jié)尾文件,需加此配置 ? ? ? happyPackMode: true ?// 開(kāi)啟多線程,加快編譯 ? ? } ?}
eslint替換為tslint:
{ ? ? test: /\.ts$/, ? ? loader: 'tslint-loader', ? ? exclude: /node_modules/, ? ? enforce: 'pre' }
同時(shí)在vue-loader.conf.js
里增加配置,在根目錄下增加tslint.json
配置文件:
// vue-loader.conf.js const mergeVue = require('webpack-merge') loaders: mergeVue(utils.cssLoaders({ ? ? sourceMap: sourceMapEnabled, ? ? extract: isProduction }), { ? ? ts: ['ts-loader', 'tslint-loader'] ? // 新增 }), // tslint.json { ? ? "extends": "tslint-config-standard", ? ? "globals": { ? ? ? "require": true ? ? }, ? ? "rules": { ? ? ? "no-consecutive-blank-lines": false ? ? } }
另外還有其他一些基礎(chǔ)的修改,比如ts會(huì)校驗(yàn)不同文件間的重名,并給出錯(cuò)誤提示。這點(diǎn)當(dāng)然可以通過(guò)配置去處理,但是個(gè)人覺(jué)得這個(gè)提示可以保留,只需要修改對(duì)應(yīng)的變量名就可以了。
新增配置文件tsconfig.json
(個(gè)別配置字段會(huì)在后面填坑說(shuō)明)
{ ? "compilerOptions": { ? ? "target": "es5", ? ? "strict": true, ? ? "module": "es2015", ? ? "moduleResolution": "node", ? ? "baseUrl": ".", ? ? "paths": { ? ? ? "@/*": ["src/*"] ? ? }, ? ? "types": [ ? ? ? "node" ? ? ], ? ? "noImplicitAny": false, ? ? "allowSyntheticDefaultImports": true ? } }
src目錄下增加 vue.d.ts 文件:
此文件主要是告訴ts,.vue結(jié)尾的文件交給vue去處理。但是這樣會(huì)造成一個(gè)父子組件引用問(wèn)題,同樣后邊填坑單說(shuō)。
declare module '*.vue' { ? ? import Vue from 'vue' ? ? export default Vue }
三、修改記
1.將必要文件的.js替換為.ts
這里說(shuō)必要的js結(jié)尾文件,我處理的主要是邏輯相關(guān)的文件,對(duì)于一些config類(lèi)型的文件并沒(méi)有修改,依然保留了js結(jié)尾,目的是最小改動(dòng)原則,避免一些難處理的問(wèn)題。
2.vue文件修改
針對(duì)vue文件:
- 需要在script標(biāo)簽上增加 lang='ts'
- 同時(shí)需要用vue.extend定義組件
- 如果有引用其他組件,未引入ts時(shí)候可以省略.vue后綴,但是引入ts之后,引入組建的時(shí)候一定要加上.vue后綴
<script lang="ts"> import Vue from 'vue' import Table from '@/components/table/index.vue' export default Vue.extend({ ? ? data(){ ? ? ? ? return { ? ? ? ? ? ? name: '' ? ? ? ? } ? ? } })
經(jīng)過(guò)以上三步基礎(chǔ)的修改,如果你的項(xiàng)目非常簡(jiǎn)單,簡(jiǎn)單到就是個(gè)測(cè)試架子,那就可以愉快地npm start了,沒(méi)有太大問(wèn)題。但是如果是原有項(xiàng)目,去start的時(shí)候,會(huì)爆出很多警告問(wèn)題,當(dāng)然如果是基礎(chǔ)的ts校驗(yàn)問(wèn)題,我們可以去直接修改文件或者配置即可。
忽略ts格式校驗(yàn),我們可以看到原有項(xiàng)目里增加ts語(yǔ)法后(或者未增加ts語(yǔ)法)會(huì)出現(xiàn)另外一些問(wèn)題,可能問(wèn)題并不會(huì)影響到程序的編譯運(yùn)行,但是在編輯器里會(huì)飄紅~ 接下來(lái)就簡(jiǎn)單說(shuō)下所填的幾個(gè)坑。
四、填坑記
Cannot find name ‘require‘. Do you need to install type definitions for node?
當(dāng)我們用require引入某些文件時(shí),可能會(huì)出現(xiàn)這個(gè)錯(cuò)誤提示,這種問(wèn)題基本就是需要安裝對(duì)應(yīng)的@type依賴(lài),針對(duì)此問(wèn)題:
安裝:npm i --save-dev @types/node
,在tsconfig.json
里增加 "types": ["node"],如果還是有錯(cuò)誤提示,可以添加 declare var require: any。
類(lèi)似的問(wèn)題還有引入lodash、qs等,需要安裝對(duì)應(yīng)的@type/xx。如果使用了vue-cookie,需要安裝對(duì)應(yīng)的ts版本 vue-cookies-ts同時(shí)對(duì)應(yīng)的方法需要做修改,詳見(jiàn)文檔 vue-cookies-ts 。
Cannot find module ‘XXX‘ or its corresponding type declarations.Vetur
這種錯(cuò)誤出現(xiàn)場(chǎng)景是,我們按照基礎(chǔ)內(nèi)容配置好之后,通過(guò)import引入某個(gè)ts文件的時(shí)候出現(xiàn)的。這個(gè)問(wèn)題其實(shí)挺詭異的,如果加上.ts后綴,會(huì)提示不需要加,去掉后綴之后就報(bào)找不到模塊。
這個(gè)問(wèn)題解決辦法一種就是看有沒(méi)有配置alias,同時(shí)需要在tsconfig.json里增加 "paths": {"@/*": ["src/*"]}。配置之后如果還不生效,基本方法二就能解決了,方法二就是把項(xiàng)目放在第一個(gè),就是用vscode直接打開(kāi)一個(gè)項(xiàng)目,而不是打開(kāi)某個(gè)文件夾下有很多項(xiàng)目的情況。這個(gè)問(wèn)題應(yīng)該是vetur插件導(dǎo)致的。當(dāng)然還有第三種方法就是添加單獨(dú)的vetur配置,這個(gè)沒(méi)有去研究,有時(shí)間的小伙伴可以考慮下。
Property ‘$http‘ does not exist on type ‘xxx‘
通常vue開(kāi)發(fā)我們網(wǎng)絡(luò)請(qǐng)求會(huì)使用axios封裝一個(gè)統(tǒng)一的方法,在main.ts里引入綁定:
import httpRequest from '@/utils/httpRequest' Vue.prototype.$http = httpRequest // 方法的使用 this.$http()
在使用this(Vue)
去使用的時(shí)候會(huì)出現(xiàn)報(bào)錯(cuò)提示,考慮原因是因?yàn)槲覀兩线吪渲昧藇ue.d.ts,.vue結(jié)尾的文件都當(dāng)做vue去處理,而vue是沒(méi)有$http方法的,最簡(jiǎn)單的辦法就是直接上any了,(this as any).$http ,但是對(duì)于成型項(xiàng)目來(lái)說(shuō)這么寫(xiě)改動(dòng)內(nèi)容太多了??梢圆捎萌缦路椒?同樣處理了$store的使用問(wèn)題):
在src下新建一個(gè)vue-shim.d.ts
,添加下面配置:
import { Store } from 'vuex'; declare module 'vue/types/vue' { ? ? interface Vue { ? ? ? ? '$stroe': Store, ? ? ? ? '$http': any ? ? } }
Property 'resetFields' does not exist on type 'Vue'
如果使用了element表單相關(guān)方法,可能會(huì)涉及到表單清空、重置之類(lèi)的方法調(diào)用,通常做法可以給form一個(gè)ref,然后通過(guò) this.$refs['xxx'].resetFields()調(diào)用。但是加入ts之后會(huì)提示錯(cuò)誤,原因同樣是這里的this被指向了vue,不存在相關(guān)方法。
解決方法使用類(lèi)型斷言,將ref斷言成element相關(guān)內(nèi)容:
import { Form as EleForm } from 'element-ui' // 方法內(nèi)部 const ref = this.$refs['searchForm'] as EleForm ref.resetFields()
還有一種情況,就是父子組件間,在父組件內(nèi)部去使用子組件的方法,同樣是使用ref去調(diào)用,也會(huì)出現(xiàn)上邊的錯(cuò)誤提示。這個(gè)問(wèn)題開(kāi)始考慮是用類(lèi)似的斷言,把ref斷言成子組件,但是方法不通,通過(guò)網(wǎng)上搜索也沒(méi)找到合適的方法,大部分方法都是直接斷言成了any,即(this.$refs['xxx'] as any).clearList() 。這么斷言,問(wèn)題是可以解決的,但是希望能找到更合適的方法,
到此這篇關(guān)于vue接入ts基本方法的文章就介紹到這了,更多相關(guān)vue接入ts內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue實(shí)現(xiàn)動(dòng)態(tài)表單動(dòng)態(tài)渲染組件的方式(2)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)動(dòng)態(tài)表單動(dòng)態(tài)渲染組件的方式第二篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Ant?Design?Vue中的table與pagination的聯(lián)合使用方式
這篇文章主要介紹了Ant?Design?Vue中的table與pagination的聯(lián)合使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10用element的upload組件實(shí)現(xiàn)多圖片上傳和壓縮的示例代碼
這篇文章主要介紹了用element的upload組件實(shí)現(xiàn)多圖片上傳和壓縮的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-02-02Vue router傳遞參數(shù)并解決刷新頁(yè)面參數(shù)丟失問(wèn)題
這篇文章主要介紹了Vue router傳遞參數(shù)并解決刷新頁(yè)面參數(shù)丟失問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12vue實(shí)現(xiàn)公告消息橫向無(wú)縫循環(huán)滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)公告消息橫向無(wú)縫循環(huán)滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04vue封裝實(shí)現(xiàn)自動(dòng)循環(huán)滾動(dòng)的列表
在做數(shù)據(jù)大屏開(kāi)發(fā)的過(guò)程中,經(jīng)常出現(xiàn)需要對(duì)列表進(jìn)行自動(dòng)滾動(dòng)的需求,所以本文就來(lái)為大家介紹一下如何利用vue封裝一個(gè)自動(dòng)循環(huán)滾動(dòng)的列表吧2023-09-09Vue 路由間跳轉(zhuǎn)和新開(kāi)窗口的方式(query、params)
這篇文章主要介紹了Vue 路由間跳轉(zhuǎn)和新開(kāi)窗口的方式,本文主要通過(guò)query方式和params方式介紹,需要的朋友可以參考下2019-12-12