vue + typescript(一)配置篇

1:引入Typescript

npm install vue-class-component vue-property-decorator --save

安裝ts-loader

npm install ts-loader typescript tslint tslint-loader tslint-config-standard --save-dev
  • vue-class-component 擴(kuò)展vue支持typescript,將原有的vue語(yǔ)法通過(guò)聲明的方式來(lái)支持ts
  • vue-property-decorator 基于vue-class-component擴(kuò)展更多裝飾器阎抒,例如:watch.ref,provide肮柜。所以這里其實(shí)只要安裝vue-property-decorator也可以。
  • ts-loader 讓webpack能夠識(shí)別ts文件
  • tslint-loader以及tslint用來(lái)約束文件編碼
  • tslint-config-standard tslint 配置 standard風(fēng)格的約束

2:配置文件

  • webpack配置
    根據(jù)項(xiàng)目的不同配置的地方不同鸟赫,如果是vue cli 3.0創(chuàng)建的項(xiàng)目需要在vue.config.js中配置,如果是3.0以下版本的話,需要webpack.base.conf中配置散庶。(以下說(shuō)明是在webpack.base.conf文件中更改)
    (1)在resolve.extensions中增加.ts蕉堰,目的是在代碼中引入ts文件不用寫(xiě).ts后綴
 resolve: {
    extensions: ['.js', '.vue', '.json', '.ts'],
    alias: {}
  },

(2)在module.rules中增加ts的rules

 module: {
    rules: [
      {
        test: /\.ts$/,
        exclude: /node_modules/,
        enforce: 'pre',
        loader: 'tslint-loader'
      },
      {
        test: /\.tsx?$/,
        loader: 'ts-loader',
        exclude: /node_modules/,
        options: {
          appendTsSuffixTo: [/\.vue$/]
        }
      }
    ]
  }

以下附上自己測(cè)試項(xiàng)目的vue.config.js配置

const path = require("path");
function resolve(dir) {
    return path.join(__dirname, dir);
}

module.exports = {
    lintOnSave: true,
    configureWebpack: {
        resolve: {
            extensions: ['.tsx', '.ts', '.mjs', '.js', '.jsx', '.vue', '.json', '.wasm']
        }
    },
    chainWebpack: config => {
        // 處理ts文件 (新增loader)
        config.module
            .rule('ts')
            .test(/\.tsx?$/)
            .exclude
            .add(resolve('node_modules'))
            .end()
            .use('cache-loader')
            .loader('cache-loader')
            .options({
                cacheDirectory: resolve('node_modules/.cache/ts-loader')
            })
            .end()
            .use('babel-loader')
            .loader('babel-loader')
            .end()
            .use('ts-loader')
            .loader('ts-loader')
            .options({
                transpileOnly: true, // 關(guān)閉類型檢查,即只進(jìn)行轉(zhuǎn)譯(類型檢查交給webpack插件(fork-ts-checker-webpack-plugin)在另一個(gè)進(jìn)程中進(jìn)行,這就是所謂的多進(jìn)程方案,如果設(shè)置transpileOnly為false, 則編譯和類型檢查全部由ts-loader來(lái)做, 這就是單進(jìn)程方案.顯然多進(jìn)程方案速度更快)
                appendTsSuffixTo: ['\\.vue$'],
                happyPackMode: false
            })
            .end()

        // eslint 自動(dòng)修復(fù) (修改已經(jīng)存在的loader)
        config.module
            .rule('eslint')
            .test(/\.(vue|(j|t)sx?)$/)
            .pre() // eslint是pre處理的
            .use('eslint-loader')
            .loader('eslint-loader')
            .tap(options => { // 修改已經(jīng)存在loader的配置
                options.fix = true
                return options
            })
            .end()
    }
}
{
  // 編譯選項(xiàng)
  "compilerOptions": {
    // 輸出目錄
    "outDir": "./output",
    // 是否包含可以用于 debug 的 sourceMap
    "sourceMap": true,
    // 以嚴(yán)格模式解析
    "strict": false,
    // 采用的模塊系統(tǒng)
    "module": "esnext",
    // 如何處理模塊
    "moduleResolution": "node",
    // 編譯輸出目標(biāo) ES 版本
    "target": "es5",
    // 允許從沒(méi)有設(shè)置默認(rèn)導(dǎo)出的模塊中默認(rèn)導(dǎo)入
    "allowSyntheticDefaultImports": true,
    // 將每個(gè)文件作為單獨(dú)的模塊
    "isolatedModules": false,
    // 啟用裝飾器
    "experimentalDecorators": true,
    // 啟用設(shè)計(jì)類型元數(shù)據(jù)(用于反射)
    "emitDecoratorMetadata": true,
    // 在表達(dá)式和聲明上有隱含的any類型時(shí)報(bào)錯(cuò)
    "noImplicitAny": false,
    // 不是函數(shù)的所有返回路徑都有返回值時(shí)報(bào)錯(cuò)屋讶。
    "noImplicitReturns": true,
    // 從 tslib 導(dǎo)入外部幫助庫(kù): 比如__extends,__rest等
    "importHelpers": true,
    // 編譯過(guò)程中打印文件名
    "listFiles": true,
    // 移除注釋
    "removeComments": true,
    "suppressImplicitAnyIndexErrors": true,
    // 允許編譯javascript文件
    "allowJs": true,
    // 解析非相對(duì)模塊名的基準(zhǔn)目錄
    "baseUrl": "./",
    // 指定特殊模塊的路徑
    "paths": {
      "jquery": [
        "node_modules/jquery/dist/jquery"
      ]
    },
    // 編譯過(guò)程中需要引入的庫(kù)文件的列表
    "lib": [
      "dom",
      "es2015",
      "es2015.promise"
    ]
  }
}
  • tslint.json配置
    在目錄中新增tslint.json文件须教,由于我們前面安裝了tslint-config-standard皿渗,所以可以直接用tslint-config-standard中規(guī)則,文件如下
{
    "extends": "tslint-config-standard",
    "globals": {
      "require": true
    }
  }

3:讓項(xiàng)目識(shí)別.ts

由于 TypeScript 默認(rèn)并不支持 *.vue 后綴的文件轻腺,所以在 vue 項(xiàng)目中引入的時(shí)候需要?jiǎng)?chuàng)建一個(gè) vue-shim.d.ts 文件乐疆,放在根目錄下

declare module '*.vue' {
  import Vue from 'vue';
  export default Vue;
}

然后引入vue的時(shí)候需要加上.vue,否則在嚴(yán)格模式下會(huì)報(bào)錯(cuò)
注:也試過(guò)不寫(xiě)這個(gè)文件,項(xiàng)目依舊運(yùn)行成功贬养,很神奇挤土,留一個(gè)疑問(wèn),后期看下因?yàn)槭裁?/p>

4:編寫(xiě)test.vue

<template>
  <div class="test-container">
    {{message}}
    <Hello></Hello>
  </div>
</template>
<script lang="ts">
import { Component } from "vue-property-decorator";
import Hello from "./HelloWorld.vue";
@Component({
  components: {
    Hello
  }
})
export default class Test extends Vue {
  message: string = "asd";
}
</script>

運(yùn)行項(xiàng)目就可以看到項(xiàng)目正常運(yùn)行啦

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末误算,一起剝皮案震驚了整個(gè)濱河市仰美,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌儿礼,老刑警劉巖咖杂,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蚊夫,居然都是意外死亡翰苫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)这橙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)奏窑,“玉大人,你說(shuō)我怎么就攤上這事屈扎“Nǎ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵鹰晨,是天一觀的道長(zhǎng)墨叛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)模蜡,這世上最難降的妖魔是什么漠趁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮忍疾,結(jié)果婚禮上闯传,老公的妹妹穿的比我還像新娘。我一直安慰自己卤妒,他們只是感情好甥绿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布字币。 她就那樣靜靜地躺著,像睡著了一般共缕。 火紅的嫁衣襯著肌膚如雪洗出。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,829評(píng)論 1 290
  • 那天图谷,我揣著相機(jī)與錄音翩活,去河邊找鬼。 笑死便贵,一個(gè)胖子當(dāng)著我的面吹牛菠镇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嫉沽,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辟犀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绸硕?” 一聲冷哼從身側(cè)響起堂竟,我...
    開(kāi)封第一講書(shū)人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玻佩,沒(méi)想到半個(gè)月后出嘹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咬崔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年税稼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垮斯。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡郎仆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出兜蠕,到底是詐尸還是另有隱情扰肌,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布熊杨,位于F島的核電站曙旭,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏晶府。R本人自食惡果不足惜桂躏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望川陆。 院中可真熱鬧剂习,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)购对。三九已至猾昆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骡苞,已是汗流浹背垂蜗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留解幽,地道東北人贴见。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像躲株,于是被迫代替她去往敵國(guó)和親片部。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349