摘要:引入全面指南系列目錄引入全面指南引入全面指南篇寫在前面寫這篇文章時(shí)的我,使用經(jīng)驗(yàn)三個(gè)多月,完全空白,花了大概三個(gè)晚上把手頭項(xiàng)目遷移至,因此這篇文章更像個(gè)入門指引。見文章引入全面指南篇完整代碼見庫(kù),分支為整合示例,分支為不含的基礎(chǔ)示例。
Vue2.5+ Typescript 引入全面指南
系列目錄:
Vue2.5+ Typescript 引入全面指南
Vue2.5+ Typescript 引入全面指南 - Vuex篇
寫在前面寫這篇文章時(shí)的我,Vue使用經(jīng)驗(yàn)三個(gè)多月,Typescript完全空白,
花了大概三個(gè)晚上把手頭項(xiàng)目遷移至Typescript,因此這篇文章更像個(gè)入門指引。
兩大原則:
最小依賴引入由于我個(gè)人從Javascript到Typescript的升級(jí),更傾向于平滑順移,因此,我對(duì)新依賴的引入整體保持克制原則,只引入了必要項(xiàng),以盡量貼近原生vue寫法:
typescript
ts-loader
以下依賴均未引入:
vue-class-component:官方維護(hù),學(xué)習(xí)成本小,但與vuex融合性較差,計(jì)劃等官方完善對(duì)vuex支持后再考慮引入
vue-property-decorator:非官方維護(hù),一定學(xué)習(xí)成本
vuex-class:非官方維護(hù),在 vue-class-component 基礎(chǔ)上補(bǔ)充一定vuex支持(支持有限)
vuex-ts-decorators/vuex-typescript等:非官方維護(hù),學(xué)習(xí)成本極高
PS: 后總結(jié),vue官方維護(hù)的 vue-class-component 還是很有必要引入的,文末有詳細(xì)說(shuō)明。既然用了 Typescript,不到萬(wàn)不得已不用 any!PS: tslint-loader由于對(duì)vue的支持尚不完美,作為可選項(xiàng)文末有詳細(xì)說(shuō)明。
any 任意類型的存在,在我看來(lái)就是個(gè)潘多拉魔盒,一旦開啟,很容易養(yǎng)成偷懶的習(xí)慣,碰到難題就上 any。因此,我的建議是,盡量不要去碰它,除非你無(wú)路可走。
Vue-cli 生成項(xiàng)目啟用 Typescript注:這里只介紹Webpack模板下使用。
vue init webpack <項(xiàng)目名稱> 生成的項(xiàng)目需做如下改動(dòng)以兼容 Typescript:
依賴安裝npm i --save-dev typescript ts-loader 安裝必要依賴。推薦使用 npm 8及以上版本。
Webpack 配置./build/webpack.base.conf.js,作如下改動(dòng):
entry入口文件main.js改為main.ts:
entry: { app: "./src/main.ts" }
resolve.extensions添加.ts:
resolve: { extensions: [".js", ".ts", ".vue", ".json"] }
module.rules添加.ts解析規(guī)則:
module: { rules: [ { test: /.tsx?$/, loader: "ts-loader", exclude: /node_modules/, options: { appendTsSuffixTo: [/.vue$/] } } ] }tsconfig.json
項(xiàng)目根路徑下添加文件tsconfig.json,官方推薦配置如下:
// tsconfig.json { "compilerOptions": { // 與 Vue 的瀏覽器支持保持一致 "target": "es5", // 這可以對(duì) `this` 上的數(shù)據(jù)屬性進(jìn)行更嚴(yán)格的推斷 "strict": true, // 如果使用 webpack 2+ 或 rollup,可以利用 tree-shake: "module": "es2015", "moduleResolution": "node" } }vue-shim.d.ts
src目錄下添加文件vue-shim.d.ts:
declare module "*.vue" { import Vue from "vue"; export default Vue; }
意思是告訴TypeScript *.vue后綴的文件可以交給vue模塊來(lái)處理。
.js 文件重命名為 .ts 文件從src/main.js開始,包括src/router/index.js等逐一從.js重命名為.ts
注意:重命名后對(duì)vue文件的import,需添加.vue后綴
因?yàn)門ypescript默認(rèn)只識(shí)別*.ts文件,不識(shí)別*.vue文件
之前:
import App from "./App" import HelloWorld from "@/components/HelloWorld"
需改為:
import App from "./App.vue" import HelloWorld from "@/components/HelloWorld.vue".vue 文件改造
要點(diǎn):
標(biāo)簽添加lang="ts"聲明
使用Vue.extend定義組件
示例:
// src/components/HelloWorld.vuenpm run dev
至此運(yùn)行項(xiàng)目,即可正常運(yùn)行,vue對(duì)typescript的初步引入,基本完成。
TSLint2017-12-6更新:
當(dāng)前(2017年12月),對(duì).vue文件,VSCode編輯器的編輯時(shí)提示,有了一個(gè)非官方方案(官方進(jìn)度見以下issue,仍均未解決),TSLint Vue。
簡(jiǎn)單講,一給力小哥 Fork 了 VSCode 官方的 TSLint插件,添加了對(duì) Vue 文件的支持。小哥更新蠻頻繁的,基本上第一時(shí)間跟隨官方插件的最新版,親測(cè)可用。
使用方式:VSCode Plugin,關(guān)閉 TSLint,下載并啟用 TSLint Vue即可:
當(dāng)前(2017年11月),對(duì).vue文件,可以在關(guān)閉no-consecutive-blank-lines檢查前提下,開啟構(gòu)建時(shí)TSLint支持;至于VSCode編輯器的編輯時(shí)提示,完全沒有。
詳見TSLint的 issue 及vetur的 issue
不幸的是,也不能拿ESLint將就用,不然一堆如下的Error等著你:
所以,只剩倆選擇,要么關(guān)了,要么按照下面的配置將就著用:
添加依賴
npm i --save-dev tslint tslint-loader tslint-config-standard
module.rules移除eslint-loader,添加tslint-loader預(yù)處理
// ./build/webpack.base.conf.js module: { rules: [ // { // test: /.(js|vue)$/, // enforce: "pre", // exclude: /node_modules/, // use: { // loader: "eslint-loader", // options: { // formatter: require("eslint-friendly-formatter") // } // } // }, { test: /.ts$/, exclude: /node_modules/, enforce: "pre", loader: "tslint-loader" }, { test: /.vue$/, loader: "vue-loader", options: vueLoaderConfig }, ] }
vue-loader中開啟tslint-loader選項(xiàng):
// ./build/vue-loader.conf.js const merge = require("webpack-merge") module.exports = { loaders: merge(utils.cssLoaders({ sourceMap: isProduction ? config.build.productionSourceMap : config.dev.cssSourceMap, extract: isProduction }), { ts: ["ts-loader", "tslint-loader"] } ), ... // 其他內(nèi)容 }
項(xiàng)目根路徑下添加文件tslint.json:
// tslint.json { "extends": "tslint-config-standard", "globals": { "require": true }, "rules": { "no-consecutive-blank-lines": false } }
no-consecutive-blank-lines 關(guān)閉的解釋 見這里
簡(jiǎn)單翻譯,vue-loader與tslint-loader結(jié)合使用,就像是把.vue文件里的與等非js內(nèi)容全部置為了空行一樣,為此,只能關(guān)閉此檢查。
重新運(yùn)行npm run dev,即可看到構(gòu)建時(shí)可能輸出的tslint警告(tslint默認(rèn)級(jí)別warning,不阻斷構(gòu)建,如需error級(jí)別,可自行修改)
原生vue組件寫法會(huì)導(dǎo)致一很煩的問題:
data()如果如下形式定義數(shù)組,將會(huì)被推導(dǎo)為[]never類型:
export default Vue.extend({ data () { return { list: [] // type: []never } } })
這樣一來(lái),此array直接廢掉,因?yàn)椴荒芡细郊又?,只能如此提前聲明?/p>
export default Vue.extend({ data () { const list: string[] = [] return { list: list } } })
而引入vue-class-component后的class寫法,則可以一行搞定:
我個(gè)人是考慮到 vue-class-component 對(duì) vuex 的 mapState, mapGetters 等函數(shù)支持較差,(可以借助vuex-class引用),再加Decorators并不是我對(duì)typescript的核心需求(Interface才是?。?,決定的暫緩引入,先不增加復(fù)雜度。
Vuex見文章 Vue2.5+ Typescript 引入全面指南 - Vuex篇
完整代碼見 Github 庫(kù):vue-vuex-typescript-demo,master 分支為整合 vuex 示例,basic 分支為不含 vuex 的基礎(chǔ)示例。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/89505.html
摘要:引入全面指南篇系列目錄引入全面指南引入全面指南篇前言正是我下決心引入的核心痛點(diǎn)。其中,可以通過建立輔助函數(shù)形式,簡(jiǎn)單繞開。只是類型均為建議不使用,以明確指定類型及調(diào)用可通過上述下輔助函數(shù),手動(dòng)開啟類型推導(dǎo)及類型推導(dǎo),暫時(shí)只能手動(dòng)指定。 Vue2.5+ Typescript 引入全面指南 - Vuex篇 系列目錄: Vue2.5+ Typescript 引入全面指南 Vue2.5+ T...
摘要:遷移至指南為什么要遷移至本身是動(dòng)態(tài)弱類型的語(yǔ)言,這樣的特點(diǎn)導(dǎo)致了代碼中充斥著很多的報(bào)錯(cuò),給開發(fā)調(diào)試和線上代碼穩(wěn)定都帶來(lái)了不小的負(fù)面影響。可行性因?yàn)槭堑某?,不?huì)阻止的運(yùn)行,即使存在類型錯(cuò)誤也不例外,這能讓你的逐步遷移至。 Vue2.5+遷移至Typescript指南 為什么要遷移至Typescript Javascript本身是動(dòng)態(tài)弱類型的語(yǔ)言,這樣的特點(diǎn)導(dǎo)致了Javascript代碼...
摘要:遷移至指南為什么要遷移至本身是動(dòng)態(tài)弱類型的語(yǔ)言,這樣的特點(diǎn)導(dǎo)致了代碼中充斥著很多的報(bào)錯(cuò),給開發(fā)調(diào)試和線上代碼穩(wěn)定都帶來(lái)了不小的負(fù)面影響??尚行砸?yàn)槭堑某?,不?huì)阻止的運(yùn)行,即使存在類型錯(cuò)誤也不例外,這能讓你的逐步遷移至。 Vue2.5+遷移至Typescript指南 為什么要遷移至Typescript Javascript本身是動(dòng)態(tài)弱類型的語(yǔ)言,這樣的特點(diǎn)導(dǎo)致了Javascript代...
摘要:哪吒別人的看法都是狗屁,你是誰(shuí)只有你自己說(shuō)了才算,這是爹教我的道理。哪吒去他個(gè)鳥命我命由我,不由天是魔是仙,我自己決定哪吒白白搭上一條人命,你傻不傻敖丙不傻誰(shuí)和你做朋友太乙真人人是否能夠改變命運(yùn),我不曉得。我只曉得,不認(rèn)命是哪吒的命。 showImg(https://segmentfault.com/img/bVbwiGL?w=900&h=378); 出處 查看github最新的Vue...
閱讀 1961·2021-09-09 09:33
閱讀 1107·2019-08-30 15:43
閱讀 2646·2019-08-30 13:45
閱讀 3297·2019-08-29 11:00
閱讀 845·2019-08-26 14:01
閱讀 3558·2019-08-26 13:24
閱讀 471·2019-08-26 11:56
閱讀 2683·2019-08-26 10:27