如何在vuecli项目里使用typescript 第一阶段 先安装typescript,ts-loader
1 yarn add typescript ts-loader
1.修改webpack配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 entry : { app : './src/main.ts' }, extensions : ['.js' , '.vue' , '.json' , '.ts' , '.tsx' ]{ test : /\.tsx?$/ , loader : 'ts-loader' , exclude : /node_modules/ , options : { appendTsSuffixTo : [/\.vue$/ ], } }
2.新增配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 { "include" : [ "src/**/*" ] , "exclude" : [ "node_modules" ] , "compilerOptions" : { "allowSyntheticDefaultImports" : true , "experimentalDecorators" : true , "allowJs" : true , "module" : "es2015" , "target" : "es5" , "moduleResolution" : "node" , "experimentalDecorators" : true , "isolatedModules" : true , "lib" : [ "dom" , "es5" , "es2015.promise" ] , "sourceMap" : true , "pretty" : true } }
3.新增.t.ds配置文件
1 2 3 4 5 declare module "*.vue" { import Vue from 'vue' ; export default Vue ; },
4.修改main.js为main.ts
1 2 import App from './App.vue' ;
经过以上四步设置后就可以直接在项目里使用<script lang='ts'>标签写typescript了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <script lang ='ts' > export default { name : 'hello' , data ( ) { return { msg : 'Welcome to Your Vue.js App' , }; }, computed : { computedMsg (): string { return `computed${this .msg} ` ; }, }, methods : { hello (): string { return `hello${this .msg} ` ; }, }, }; </script >
第二阶段 使用官方推荐的(vue-class-component)[https://github.com/vuejs/vue-class-component] 安装插件
1 yarn add babel-plugin-transform-decorators-legacy vue-class -component
修改babel配置
1 2 //.babelrc "plugins": ["transform-runtime","babel-plugin-transform-class-properties"],// 添加插件
之后就可以使用类的方式写ts了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <script lang ='ts' > import Vue from 'vue' ;import Component from 'vue-class-component' ;@Component class Hello extends Vue { name :string = 'hello' ; msga :string = 'sssd' ; msg :string = 'msg' ; mounted ( ) { this .greet (); } get computedMsg () { console .log (`computed ${this .msg} ` ); return `computed ${this .msg} ` ; } greet ( ) { console .log (`greeting: ${this .msg} ` ); } hello ( ) { return this .msg ; } } export default Hello ;</script >
如果需要watch则需要添加(vue-property-decorator)[https://github.com/kaorun343/vue-property-decorator]具体使用方法 请参照文档
1 yarn add vue-property-decorator
总结 我在尝试过程中发现两个坑爹问题 1.项目起动起来后chrome浏览器无法访问 (纸飞机) 2.第二阶段所有设置好后发现页面报错 (不认真)
1 2 3 4 5 6 7 [Vue warn]: Property or method "msg" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option. found in ---> <Hello> at src/components/Hello.vue <App> at src/App.vue <Root>
对于问题1: 发现竟然跟纸飞机 有关。。纸飞机 。。之前一直都是好的,在chrome自动升级后就不行了无法打开, 在我用mac访问局域网无法访问的时候才发觉跟网络有关把纸飞机一关,局域网和项目竟然都能正常了
对于问题2: 一直找不到原因,明明都对啊,为什么显示不正常,看提示信息很明显没有声明就在template里使用. 我的代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <script > import Vue from 'vue' ;import Component from 'vue-class-component' ;@Component class Hello extends Vue { name : 'hello' ; msga : 'sssd' ; msg : 'msg' ; mounted ( ) { this .greet (); } get computedMsg () { console .log (`computed ${this .msg} ` ); return `computed ${this .msg} ` ; } greet ( ) { console .log (`greeting: ${this .msg} ` ); } hello ( ) { return this .msg ; } } export default Hello ;</script >
甚至我都把ts都去了只用vue-class-component对比了N久搞到要回家了硬是没找到答案。。。 回家还在纳闷为毛不正常,为什么第二天一早很容易就发现问题了
1 2 msg: 'msg';//不是用冒号 应该用等号。。 这么简单昨天竟然一直没看出来 msg= 'msg';