vue项目引入ts步骤(小结)
最近考虑到老项目代码的可维护性以及稳定性,决定引入ts做规范检测。因为介绍的东西比较基础,如果介绍的不对,麻烦指正。
1.简介
TypeScript是JavaScript的一个超集,主要提供了类型系统和对ES6的支持。网上关于ts的学习资料很多,这里不做详细介绍。可参考的学习网站:
ts.xcatliu.com/
typescript.bootcss.com/
2.安装依赖包
cnpmitypescriptts-loader--save-dev
3.添加tsconfig.json文件
在项目根目录下添加tsconfig.json文件。tsconfig.json文件用来指定ts的编译选项。配置可参考:
https://typescript.bootcss.com/tsconfig-json.html
项目工程tsconfig.json文件配置如下:(仅做参考)
{
"compilerOptions":{
"baseUrl":".",
"experimentalDecorators":true,
"emitDecoratorMetadata":true,
"noEmitOnError":true,
"target":"esnext",
"module":"esnext",
"strict":true,
"allowJs":true,
"noEmit":false,
"noImplicitThis":true,
"esModuleInterop":true,
"sourceMap":true,
"moduleResolution":"node"
},
"include":[
"src/**/*","types"
],
"exclude":[
"node_modules",
"build"
]
}
4.webpack打包配置修改
webpack.config.js打包文件修改,新增对.ts文件的打包配置。
4.1入口文件后缀名由.js修改为.ts
module.exports={
entry:{
app:['@babel/polyfill','./src/main.ts']
}
}
4.2extensions文件扩展名增加.ts,.tsx文件的支持
tsx针对react项目文件的支持,因为我们的工程基于vue开发,支持.ts文件就可以了。
module.exports={
resolve:{
extensions:['.js','.vue','.json','.css','.ts']
}
}
4.3loader增加对ts文件的支持
使用ts-loader来转换ts文件。
module.exports={
module:{
rules:[
{
test:/\.ts?$/,
loader:'ts-loader',
exclude:/node_modules/,
options:{
appendTsSuffixTo:[/\.vue$/],
}
}
]
}
}
5.eslint添加对ts文件的检测
5.1安装依赖包
cnpmi@typescript-eslint/parser@typescript-eslint/eslint-plugineslint-config-typescripteslint-plugin-typescript--save-dev
@typescript-eslint/parserts文件解析器
@typescript-eslint/eslint-plugin版本号需要与@typescript-eslint/parser的版本一致,解析器相关的配置选项
eslint-config-typescript针对ts项目配置的eslint检测规范
5.2.eslintrc配置文件修改
.eslintrc配置文件修改,支持对ts的文件的校验。经过多次调整,我们工程的.eslintrc配置文件如下:
{
"parserOptions":{
"parser":"@typescript-eslint/parser",
"project":"./tsconfig.json",
"extraFileExtensions":[".vue"],
"ecmaVersion":2017,
"sourceType":"module",
"ecmaFeatures":{
"modules":true
}
},
"env":{
"jest":true,
"browser":true
},
"settings":{
"import/resolver":{
"node":{
"extensions":[".js",".jsx",".ts",".tsx",".eslintrc"]
},
"webpack":{
"config":{
"resolve":{
"alias":{
"src":"src"
}
}
}
}
}
},
"plugins":[
"vue",
"babel",
"@typescript-eslint"
],
"extends":[
"eslint:recommended",
"plugin:vue/base",
"typescript",
"standard"
],
"rules":{
"func-names":0,
"one-var":[1,"never"],
"prefer-const":1,
"no-unused-expressions":1,
"new-cap":2,
"prefer-arrow-callback":2,
"arrow-body-style":0,
"max-len":[
1,
{
"code":200,
"ignoreStrings":true,
"ignoreUrls":true,
"ignoreRegExpLiterals":true
}
],
"consistent-return":"off",
"default-case":2,
"prefer-rest-params":2,
"no-script-url":0,
"no-console":[
2,
{
"allow":["info","error","warn","log"]
}
],
"no-duplicate-imports":2,
"newline-per-chained-call":2,
"no-underscore-dangle":2,
"eol-last":2,
"no-useless-rename":2,
"class-methods-use-this":0,
"prefer-destructuring":0,
"no-unused-vars":0,
"@typescript-eslint/no-unused-vars":1,
"no-plusplus":0,
"import/prefer-default-export":0,
"import/no-dynamic-require":2,
"@typescript-eslint/no-var-requires":2,
"no-use-before-define":[
"error",
{
"functions":false
}
],
"@typescript-eslint/no-use-before-define":0,
"@typescript-eslint/explicit-function-return-type":0,
"@typescript-eslint/interface-name-prefix":0,
"no-invalid-this":0,
"babel/no-invalid-this":2,
"no-await-in-loop":"off",
"array-callback-return":"off",
"no-restricted-syntax":"off",
"@typescript-eslint/no-explicit-any":0,
"import/no-extraneous-dependencies":0,
"import/no-unresolved":0,
"@typescript-eslint/explicit-member-accessibility":0,
"@typescript-eslint/no-object-literal-type-assertion":0,
"no-param-reassign":[
2,
{
"props":false
}
],
"generator-star-spacing":"off",
"indent":[2,4,{
"SwitchCase":1
}],
"eqeqeq":0,
"no-else-return":2,
"arrow-parens":0,
"space-before-function-paren":["error","never"],
"comma-dangle":[2,"never"],
"semi":[2,"always"]
}
}
注意"extends":["plugin:vue/base"],只能选择vue/base,不能用vue/recommend。不然会有规则冲突。
6.项目文件转换
项目配置好后,开始对老代码进行改造,来支持ts的语法检测。
6.1增加ts声明文件目录
项目中总会依赖一些资源包,或是自己开发的一些组件,这些文件需要补充声明文件,声明文件就是将多个声明语句放在一起,这些声明文件可统一放到一个目录里。这个目录需要包含在tsconfig.json文件的include里。
ms工程在根目录下新建types目录,目前包含vue.d.ts,request.d.ts,dialog.d.ts,base.d.ts等文件。
6.2全局vue.d.ts声明文件
需要在ts环境下识别vue文件,需要添加vue.d.ts全局声明文件,例子如下:
importVueRouter,{Route}from'vue-router';
importRequestAxiosfrom'./request';
declaremodule'*.vue'{
importVuefrom'vue';
exportdefaultVue;
}
declaremodule'vue/types/vue'{
interfaceVue{
$router:VueRouter;
$route:Route;
$request:RequestAxios;
....
}
}
6.2vue文件的改造
vue文件的改造,只改造js部分,代码大致修改如下:
import{Vue,Component,Prop,Watch}from'vue-property-decorator';
@Component({
components:{
....
}
})
exportdefaultclassMyComponentextendsVue{
//prop
@Prop({default:()=>{}})readonlypageInfo!:any
//data
privateshowAnimation:boolean=true;
//watch
@Watch('showModuleIndex')
onShowModuleIndexChanged(newValue:any){
this.$emit('input',newValue);
}
//computed
getlist(){
const{page,cityList}=this;
returnpage.cityList.split(',').map(
cityId=>cityList.find(c=>String(c.id)===cityId)
);
}
//mounted
privatemounted():void{
this.initEditor();
}
//methods
privateinitEditor():void{
....
}
}
6.3js文件的改造
将文件后缀名更改为.ts,然后加上类型就可以了。
7.踩坑总结
大部分都是eslint校验时的报错,按照提示修复就可以了。
"vue/html-indent":[2,4]eslint这条规则去掉
"plugin:vue/base"与"plugin:vue/recommend"的区别
...
8.总结
项目改造过程中,大部分时间都是在查配置兼容问题,配置这块解决了,改造起来速度还是挺快的。虽然前期会有一些改造成本,但是长远来看,还是有意义的。毕竟很多代码类型上的问题在开发阶段就可以暴露,不用等到运行时才发现了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。