记一个Vue+TypeScript项目配置实例

最近想学习一下TypeScript语法,可是只是看官方文档又有些乏味,仍是经过项目在实践中学习比较有趣,因此在这里记录一下个人学习历程,与Vue项目结合开发。(官方文档 请戳 >>javascript

项目搭建

经过脚手架搭建

1. 经过Vue CLI 3 建立vue项目

java

vue create vue-typescript

// 在此选择typescript支持html

? Check the features needed for your project: () Babel () TypeScript ( ) Progressive Web App (PWA) Support () Router () Vuex >() CSS Pre-processors () Linter / Formatter ( ) Unit Testing ( ) E2E Testingvue

复制代码// 引入 vue-class-component 插件 // 如下大概是个人选择 ? Use class-style component syntax? (Y/n) y ? Use Babel alongside TypeScript (required for modern mode, auto-detected polyfills, transpiling JSX)? Yes ? Use history mode for router? (Requires proper server setup for index fallback in production) Yes ? Pick a CSS pre-processor (PostCSS, Autoprefixer and CSS Modules are supported by default): Sass/SCSS (with node-sass) ? Pick a linter / formatter config: Prettier ? Pick additional lint features: Lint on save ? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files ? Save this as a preset for future projects? (y/N) n
复制代码

2. 启动项目

yarn run serve
复制代码

能跑起来吗,能跑就是好项目😂node

3.项目配置

此时其实脚手架已经帮咱们配置好了大多数的配置,但仍是须要熟悉一下配置。jquery

tsconfig.json

在项目根目录下建立tsconfig.jsongit

{
 // 编译选项  "compilerOptions": {  // 输出目录  "outDir": "./output",  // 是否包含能够用于 debug 的 sourceMap  "sourceMap": true,  // 以严格模式解析  "strict": true,  // 采用的模块系统  "module": "esnext",  // 如何处理模块  "moduleResolution": "node",  // 编译输出目标 ES 版本  "target": "es5",  // 容许从没有设置默认导出的模块中默认导入  "allowSyntheticDefaultImports": true,  // 将每一个文件做为单独的模块  "isolatedModules": false,  // 启用装饰器  "experimentalDecorators": true,  // 启用设计类型元数据(用于反射)  "emitDecoratorMetadata": true,  // 在表达式和声明上有隐含的any类型时报错  "noImplicitAny": false,  // 不是函数的全部返回路径都有返回值时报错。  "noImplicitReturns": true,  // 从 tslib 导入外部帮助库: 好比__extends,__rest等  "importHelpers": true,  // 编译过程当中打印文件名  "listFiles": true,  // 移除注释  "removeComments": true,  "suppressImplicitAnyIndexErrors": true,  // 容许编译javascript文件  "allowJs": true,  // 解析非相对模块名的基准目录  "baseUrl": "./",  // 指定特殊模块的路径  "paths": {  "jquery": [  "node_modules/jquery/dist/jquery"  ]  },  // 编译过程当中须要引入的库文件的列表  "lib": [  "dom",  "es2015",  "es2015.promise"  ]  } } 复制代码
tslint.json

在根路径下建立tslint.json文件,就是 引入 tsstandard 规范。es6

若是已经引入了eslint的配置文件,这一步其实也能够不作。github

{
 "extends": "tslint-config-standard",  "globals": {  "require": true  } } 复制代码

附上一个脚手架自动生成的eslint的默认配置 eslintrc.jsweb

module.exports = {
 root: true,  env: {  node: true  },  extends: [  "plugin:vue/essential",  "eslint:recommended",  "@vue/typescript/recommended",  "@vue/prettier",  "@vue/prettier/@typescript-eslint"  ],  parserOptions: {  ecmaVersion: 2020  },  rules: {  "no-console": process.env.NODE_ENV === "production" ? "warn" : "off",  "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off"  } }; 复制代码

4.支持ES6 / ES7

tsconfig.json中,添加对es6 / es7的支持,更多的配置请见tsconfig - 编译选项

"lib": [
 "dom",  "es5",  "es6",  "es7",  "es2015.promise" ] 复制代码

5.配置Vuex

首先固然是先安装依赖啦。

yarn add vuex vuex-class
复制代码
  • vuex:在 vue 中集中管理应用状态
  • vuex-class :在 vue-class-component 写法中 绑定 vuex

引用了vuex-class以后仍是和原来的写法有点儿区别的。

vuex store 中该怎么写,还怎么写,引用的时候以下:

import { Component, Prop, Vue } from "vue-property-decorator";
import { State, Getter, Action, Mutation, namespace } from "vuex-class"; // 声明使用的是哪一个模块 const commonModule = namespace("common"); @Component export default class HelloWorld extends Vue {  @Prop() private msg!: string;  // 获取vuex中的数据  @commonModule.State("token") token!: string;  @commonModule.Getter("getToken") getToken!: string;  @commonModule.Action("setToken") actionSetToken: (arg0: string) => void;  @commonModule.Mutation("setToken") mutationSetToken: unknown;  // @State token  // @Getter("token") getterToken;  // @Action("token") actionToken;  // @Mutation("token") mutationToken;  created() {  this.actionSetToken("123");  alert(this.token);  } } 复制代码

6.支持 vue mixin 函数

在src下新建mixins目录,根据业务复用模块划分结构。

在使用Vue进行开发时咱们常常要用到混合,结合TypeScript以后通常有两种mixins的方法。

一种是vue-property-decorator提供的

// 定义 routerMixins.ts文件
// mixin router 公共方法 import Vue from 'vue' import Component from 'vue-class-component'  @Component export default class myMixins extends Vue {  /**  * @author: WangXinYu  * @describe: 浏览器后退事件  * @param: {}  * @return:  **/  goBack() {  this.$router.go(-1)  }  /**  * @author: WangXinYu  * @describe: test  * @param: {}  * @return:  **/  routerTest() {  console.log('are you ok?')  } }  复制代码
// 引入 mixin
import { Component, Prop, Vue, Mixins } from 'vue-property-decorator' import routerMixins from '@/mixins/router' @Component export default class HelloWorld extends Mixins(routerMixins) {  created() {  this.routerTest()  } } 复制代码

第二种是在@Component中混入。

// mixins.ts
import { Vue, Component } from 'vue-property-decorator';   declare module 'vue/types/vue' {  interface Vue {  value: string;  } }  @Component export default class myMixins extends Vue {  value: string = 'Hello' } 复制代码
// 混入
import { Vue, Component, Prop } from 'vue-property-decorator'; import myMixins from '@/mixins/myMixins';  @Component({  mixins: [myMixins] }) export default class myComponent extends Vue{  created(){  console.log(this.value) // => Hello  } } 复制代码

(未完待续...)

本文使用 mdnice 排版

相关文章
相关标签/搜索