自己搭建Vue + Vuex + Typescript 项目的使用
栏目: JavaScript · 发布时间: 5年前
内容简介:现在很多主流语言都是强类型的,而这点也一直是JavaScript所被人诟病的地方。使用TypeScript之后,将会在代码调试、重构等步骤节省很多时间。比如说:函数在返回值的时候可能经过复杂的操作,那我们如果想要知道这个值的结构就需要去仔细阅读这段代码。那如果有了TypeScript之后,直接就可以看到函数的返回值结构,将会非常的方便创建tsconfig.json文件,放在根目录下,和
现在很多主流语言都是强类型的,而这点也一直是JavaScript所被人诟病的地方。使用TypeScript之后,将会在代码调试、重构等步骤节省很多时间。
比如说:函数在返回值的时候可能经过复杂的操作,那我们如果想要知道这个值的结构就需要去仔细阅读这段代码。那如果有了TypeScript之后,直接就可以看到函数的返回值结构,将会非常的方便
TypeScript配置
1. Webpack
-
首先需要安装
ts-loader
,这是TypeScript为Webpack提供的编译器,类似于babel-loader
npm i ts-loader -D 复制代码
-
配置rules
接着在Webpack的
module.rules
里面添加对ts的支持(我这里的webpack版本是2.x):
{ test: /\.vue$/, loader: 'vue-loader', options: vueLoaderConfig }, { test: /\.ts$/, loader: 'ts-loader', options: { appendTsSuffixTo: [/\.vue$/], } } 复制代码
- 配置extensions 添加可识别文件后缀对ts的支持,如:
extensions: ['.js', '.vue', '.json', '.ts'] 复制代码
2. tsconfig.json
创建tsconfig.json文件,放在根目录下,和 package.json
同级
配置内容主要也看个人需求,具体可以去typescript的官网查看,但是有一点需要注意:
在Vue中,你需要引入 strict: true (或者至少 noImplicitThis: true,这是 strict 模式的一部分) 以利用组件方法中 this 的类型检查,否则它会始终被看作 any 类型。
{ "include": [ "src/*", "src/**/*" ], "exclude": [ "node_modules" ], "compilerOptions": { // types option has been previously configured "types": [ // add node as an option "node" ], // typeRoots option has been previously configured "typeRoots": [ // add path to @types "node_modules/@types" ], // 以严格模式解析 "strict": true, // 在.tsx文件里支持JSX "jsx": "preserve", // 使用的JSX工厂函数 "jsxFactory": "h", // 允许从没有设置默认导出的模块中默认导入 "allowSyntheticDefaultImports": true, // 启用装饰器 "experimentalDecorators": true, "strictFunctionTypes": false, // 允许编译javascript文件 "allowJs": true, // 采用的模块系统 "module": "esnext", // 编译输出目标 ES 版本 "target": "es5", // 如何处理模块 "moduleResolution": "node", // 在表达式和声明上有隐含的any类型时报错 "noImplicitAny": true, "lib": [ "dom", "es5", "es6", "es7", "es2015.promise" ], "sourceMap": true, "pretty": true } } 复制代码
3. 修改main.js
-
把项目主文件
main.js
修改成main.ts
,里面的写法基本不变,但是有一点需要注意: 引入Vue文件的时候需要加上.vue
后缀,否则编辑器识别不到 -
把webpack的entry文件也修改成
main.ts
4. vue-shims.d.ts
TypeScript并不支持Vue文件,所以需要告诉TypeScript *.vue
文件交给vue编辑器来处理。解决方案就是在创建一个vue-shims.d.ts文件,
创建vue-shims.d.ts文件,可放在根目录下,和 package.json
同级
*.d.ts类型文件不需要手动引入,TypeScript会自动加载
declare module '*.vue' { import Vue from 'vue'; export default Vue; } 复制代码
5. 全局变量的使用
你可以通过 declare 关键字,来告诉 TypeScript,你正在试图表述一个其他地方已经存在的代码
创建vue-shims.global.ts文件,可放在根目录下,和 package.json
同级
declare let $:(select:string) => any declare let wx: any interface Window { Bridge: any, _XT: any } 复制代码
6.Vue 的全局/实例属性和方法、组件
创建vue-shims.option.ts文件,可放在根目录下,和 package.json
同级
import Vue from 'vue' declare module 'vue/types/vue' { // 可以使用 `VueConstructor` 接口 // 来声明全局属性 interface Vue { $axios: any, Login: (options?:any):void } } 复制代码
7.引入第三方库的时候需要额外声明文件
创建vue-shims.d.ts文件,可放在根目录下,和 package.json
同级
declare module 'vue-awesome-swiper' { export const swiper: any export const swiperSlide: any } declare module 'vue-lazyload' 复制代码
第三方插件库
vue-class-component
vue-class-component 是官方维护的TypeScript装饰器,写法比较扁平化
import { Component, Vue, Watch, Prop } from 'vue-class-component' import Header from '@/component/header.vue' import MyMixin from './mixin.js' Vue.mixin(MyMixin); @Component({ // component components:{ Header } }) export default class App extends Vue { // initial data name:string = 'xiaowu' // computed get getMyName():string { return `my name is ${this.name}` } // props @Prop({ default: '', type: [String, Number] }) phone: [string, number]; // method jumpPage():void{ console.log('jump page') } // lifecycle hook mounted(){ console.log('mounted !!) } // watch @Watch('state', { deep: true }) onStateChange(n: any, o: any) { console.log('state is change ') } } 复制代码
如何在组件内使用路由钩子
- 新建class-component-hooks.ts文件,在入口文件main.ts 引入,就可以正常使用
// Register the router hooks with their names Component.registerHooks([ 'beforeRouteEnter', 'beforeRouteLeave', 'beforeRouteUpdate' // for vue-router 2.2+ ]) 复制代码
vuex-class
vuex-class
是基于基于 vue-class-component
对Vuex提供的装饰器。它的作者同时也是 vue-class-component
的主要贡献者,质量还是有保证的。
import Vue from 'vue' import Component from 'vue-class-component' import { State, Getter, Action, Mutation, namespace } from 'vuex-class' const someModule = namespace('path/to/module') @Component export class MyComp extends Vue { @State('foo') stateFoo @State(state => state.bar) stateBar @Getter('foo') getterFoo @Action('foo') actionFoo @Mutation('foo') mutationFoo @someModule.Getter('foo') moduleGetterFoo // If the argument is omitted, use the property name // for each state/getter/action/mutation type @State foo @Getter bar @Action baz @Mutation qux created () { this.stateFoo // -> store.state.foo this.stateBar // -> store.state.bar this.getterFoo // -> store.getters.foo this.actionFoo({ value: true }) // -> store.dispatch('foo', { value: true }) this.mutationFoo({ value: true }) // -> store.commit('foo', { value: true }) this.moduleGetterFoo // -> store.getters['path/to/module/foo'] } } 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 搭建Typescript+React项目模板(4) --- 项目打包
- 健壮的数据仓库项目搭建
- vue入门(一):项目搭建
- Spring项目本地环境搭建
- 搭建Typescript+React项目模板(3) --- 整理项目和杂项
- 搭建Typescript+React项目模板(1) --- 项目初始化
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective JavaScript
David Herman / Addison-Wesley Professional / 2012-12-6 / USD 39.99
"It's uncommon to have a programming language wonk who can speak in such comfortable and friendly language as David does. His walk through the syntax and semantics of JavaScript is both charming and h......一起来看看 《Effective JavaScript》 这本书的介绍吧!