国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Vue2.5+ Typescript 引入全面指南

liangzai_cool / 945人閱讀

摘要:引入全面指南系列目錄引入全面指南引入全面指南篇寫在前面寫這篇文章時(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ō)明。

PS: tslint-loader由于對(duì)vue的支持尚不完美,作為可選項(xiàng)文末有詳細(xì)說(shuō)明。

既然用了 Typescript,不到萬(wàn)不得已不用 any!

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):

npm run dev

至此運(yùn)行項(xiàng)目,即可正常運(yùn)行,vue對(duì)typescript的初步引入,基本完成。

TSLint

2017-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-loadertslint-loader結(jié)合使用,就像是把.vue文件里的