456 阅读 2020-07-13 10:24:02 上传
以下文章来源于 西语语言学工作坊
前言
都2020了,作为目前最热门的前端语言且号称未来的TypeScript(文中简称ts),本文菜头同学带领大家在项目中用上ts,趁着在家闲的慌,赶紧动起来吧。下面我将展示如何使用Vue CLI 构建一个Vue + TypeScript应用
TypeScript
为什么要将TypeScript 和 Vue 集成呢?因为TypeScript 有以下几个优势:
① 可读性:TypeScript 是 JavaScript 的超集,这意味着他支持所有的 JavaScript 语法。并在此之上对 JavaScript 添加了一些扩展,如interface等。这样会大大提升代码的可阅读性
② 静态类型检查:静态类型检查可以避免很多不必要的错误,不用在调试的时候才发现问题。
③ 代码提示:ts 搭配 vscode,代码提示非常友好
④代码重构:例如全项目更改某个变量名(也可以是类名、方法名,甚至是文件名[重命名文件自动修改的是整个项目的import]),在JS中是不可能的,而TS可以轻松做到。
这些就是使用ts的好处(包括但不限于此),当然javascript也有它的好处,只不过程序员不就是要不断地学习心的知识吗?下面我们就来一起从构建一个vue+ts的项目开始
初始化项目初始化vue-cli项目,安装typescript,ts-loader,tslint,tslint-loader,tslint-config-standard,vue-property-decorator.上面只有typescript,ts-loader是必须的,其余的包用于增强开发体验。
Vue create ts-vue
安装完后,根据提示操作
cd ts-vue
npm run serve
在浏览器打开地址 "http://localhost:8080/",可以看到项目已经跑起来啦
修改配置增加tsconfig.json,下面是我的配置(值得注意的是,建议开启严格模式,也就是下面的strit为true这个选项,这样才能严格的推断Vue中的property):
{
"compilerOptions": {
// 编译目标平台
"target": "es5",
// 输出目录
"outDir": "./dist/",
// 添加需要的解析的语法,否则TS会检测出错。
"lib": ["es2015", "es2016", "dom"],
// 模块的解析
"moduleResolution": "node",
// 指定生成哪个模块系统代码
"module": "esnext",
// 在表达式和声明上有隐含的any类型时报错
"noImplicitAny": false,
// 把 ts 文件编译成 js 文件的时候,同时生成对应的 map 文件
"sourceMap": true,
// 允许编译javascript文件
"allowJs": true,
// 指定基础目录
"baseUrl": "./",
// 启用装饰器
"experimentalDecorators": true,
// 移除注释
"removeComments": true,
"pretty": true,
// 是相对于"baseUrl"进行解析
"paths": {
"vue": ["node_modules/vue/types"],
"@/*": ["src/*"]
}
},
"include": [
"src/**/*"
],
"exclude": [
"node_modules"
]
}
在webpack.base.conf.js中需要配置对ts和tsx的支持(加了注释的地方是新增的或需要修改的配置):
base: {
entry: {
...
app: resolve('src/main.ts') // 把main.js改为main.ts
}
...
resolve: {
...
extensions: ['vue', '.js', '.ts']
}
module: {
rules: [
...,
{ // 加入对文件的ts识别
test: /\.ts$/,
exclude: /node_modules/,
enforce: 'pre',
loader: 'tslint-loader'
}, {
test: /\.tsx?$/,
loader: 'ts-loader',
exclude: /node_modules/,
options: {
appendTsSuffixTo: [/\.vue$/],
}
}
]
}
在src目录下创建sfc.d.ts(用来声明全局变量、class、module、function、命名空间) 我们在这里主要是让ts识别.vue文件、window对象和一些module
具体declare的使用方式请看这里
/**
* 告诉 TypeScript *.vue 后缀的文件可以交给 vue 模块来处理
* 而在代码中导入 *.vue 文件的时候,需要写上 .vue 后缀。
* 原因还是因为 TypeScript 默认只识别 *.ts 文件,不识别 *.vue 文件
*/
declare module "*.vue" {
import Vue from 'vue'
export default Vue
}
/**
* 告诉 TypeScript window是个全局对象,直接可用,这样就不会在window.xx = 123时报错
*/
declare var window: any
/**
* 引入部分第三方库/自己编写的模块的时候需要额外声明文件
* 引入的时候,需要使用类似 import VueLazyLaod from 'vue-lazyload' 的写法
*/
declare module 'vue-lazyload'
declare module '@zz/perf/vue'
declare module 'raven-js'
declare module 'raven-js/plugins/vue'
将main.js重命名为main.ts, 并在webpack.base.conf.js中修改路径名
entry: {
app: './src/main.ts'
}
经过上面的配置,基本的开发环境就搞定了,接下来就可以使用ts写你的代码了,不需要做多少改造,只需要在你原来书写javascript标签上声明"lang=ts",如下提供一些使用示例:
组件声明
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';
@Component
export default class Test extends Vue {
}
data 对象
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';
@Component
export default class Test extends Vue {
private name: string;
}
Prop 声明
@Prop({ default: false }) private isCollapse!: boolean;
@Prop({ default: true }) private isFirstLevel!: boolean;
@Prop({ default: "" }) private basePath!: string;
!: 表示一定存在,?: 表示可能不存在。这两种在语法上叫赋值断言
@Prop(options: (PropOptions | Constructor[] | Constructor) = {})
PropOptions,可以使用以下选项:type,default,required,validator
Constructor[],指定 prop 的可选类型
Constructor,例如 String,Number,Boolean 等,指定 prop 的类型method
js 下是需要在 method 对象中声明方法,现变成如下
public clickFunc(): void {
console.log(this.name)
console.log(this.msg)
}
生命周期函数
public created(): void {
console.log('created');
}
public mounted():void{
console.log('mounted')
}
computed 计算属性
public get allname() {
return 'computed ' + this.name;
}
allname 是计算后的值,name 是被监听的值
Watch 监听属性
@Watch("$route", { immediate: true })
private onRouteChange(route: Route) {
const query = route.query as Dictionary
; if (query) {
this.redirect = query.redirect;
this.otherQuery = this.getOtherQuery(query);
}
}
以上就是一些vue项目开发中常用的东西进行的ts的示例!
总结
到这里基本上跟着一步步配置下来并且正常运行起来的话,恭喜你,你已经成功构建了一个使用ts开发的vue工程,既然都做到这里了何不动起你的手指做一个完整功能的项目出来呢,等疫情过去了你也多了一项技能,动起来吧!我相信湖北和你会一起变好的!!!