记一次用ts+vuecli4重构项目的实现


Posted in Javascript onMay 21, 2020

项目背景:

一个以前的项目( 刚入职实习的时候写的,用的vuecli2 ),然后这次要添加修改东西,看着代码看的头大,冲动之下就重构了( 想打死自己,写的啥玩意 ),刚好用下最近刚学的typescript,从搭建开始,一步步更新记录下,怕自己之后忘了再回过头来看看。( 顺便说一句,用起来有点别扭,不过还是挺爽的,期待vue3.0...

一.项目搭建:

使用命令   vue create news 创建项目

配置自定义,贴一下我自定义的安装依赖     

记一次用ts+vuecli4重构项目的实现

ts+vuex+router这几个肯定是要的,这里的css我选择的是scss,unit测试也来一个

之后一些的选项就自己选择

3. 搭建好后目录就是这样

├── public             // 静态页面

├── src               // 主目录

  ├── assets           // 静态资源

  ├── components         // 组件

  ├── views            // 页面

  ├── App.vue           // 页面主入口

  ├── main.ts           // 脚本主入口

  ├── router.ts          // 路由

  ├── shims-tsx.d.ts       // 相关 tsx 模块注入

  ├── shims-vue.d.ts       // Vue 模块注入

  └── store.ts          // vuex 配置

├── tests              // 测试用例

├── .eslintrc.js          // eslint 相关配置

├── .gitignore           // git 忽略文件配置

├── babel.config.js         // babel 配置

├── postcss.config.js        // postcss 配置

├── package.json          // 依赖

└── tsconfig.json          // ts 配置

想着为了以后更好的维护,就修改了一下目录结构

├── public             // 静态页面

├── src               // 主目录

  ├── api             // 接口

  ├── assets           // 静态资源

  ├── filters           // 过滤

  ├── store            // vuex 配置

  ├── styles           // 样式

  ├── utils            // 工具方法(axios封装,全局方法等)

  ├── views            // 页面

  ├── App.vue           // 页面主入口

  ├── main.ts           // 脚本主入口

  ├── router.ts          // 路由

  ├── shime-global.d.ts      // 相关 全局或者插件 模块注入

  ├── shims-tsx.d.ts       // 相关 tsx 模块注入

  ├── shims-vue.d.ts       // Vue 模块注入, 使 TypeScript 支持 *.vue 后缀的文件

├── tests              // 测试用例

├── .eslintrc.js          // eslint 相关配置

├── postcss.config.js        // postcss 配置

├── .gitignore           // git 忽略文件配置

├── babel.config.js         // preset 记录

├── package.json          // 依赖

├── README.md            // 项目 readme

├── tsconfig.json          // ts 配置

└── vue.config.js          // webpack 配置

tsconfig.js是ts的配置项

具体可以看官网自己配置: https://www.tslang.cn/docs/handbook/compiler-options.html

4.初步修改vue.config.js

const path = require("path");
const webpack = require('webpack');

function resolve(dir) {
 return path.join(__dirname, dir)
}
const router='http://xxx.xxx.xxx'

module.exports = {
 publicPath: "./",  //基本路径
 outputDir: 'dist', //打包时生成的文件夹
 lintOnSave: process.env.NODE_ENV === 'development', 
 productionSourceMap: process.env.NODE_ENV === 'development', 
 devServer: {
  port: 8080,
  open: true,
  proxy: {
   '/test': {
    target: router,
    changeOrigin: true
   }
  }
 },
 configureWebpack: {
  name: process.env.VUE_APP_NAME,
  resolve: {
   alias: {
    '@': resolve('src'),
   }
  },
  externals: {},
  plugins: [],
 },
}

至此,项目初步搭建完成,然后就开始封装安装插件

二. 安装插件和基本内容填充

这里我使用 的element-ui,echarts, babel-polyfill,jquery等

这里有个注意的,在typescript 中使用jquery,echarts等插件的 时候,必须要安装对应的声明文件,当然typescripe社区已经有很多大佬写好了,前人种树,后人乘凉复制代码

什么是声明文件:

https://github.com/xcatliu/typescript-tutorial/blob/master/basics/declaration-files.md

声明文件搜索地址: microsoft.github.io/TypeSearch/

untils 文件夹(可以放一些常用的工具函数,节流、防抖、localStorage等)                    

这个里面我存放了一些工具函数,date函数,axios的封装等

styles 文件夹  (存放全局scss文件)

这里面除了初始化一些样式外,我还定义了一些常亮,例如导航栏的高度,颜色等,便于          好改

router 文件夹(懒加载)

因为这个系统权限之类的并没有很复杂,路由也不是很多,就没有按模块引入,就直接写了。

/* webpackChunkName: "login" */  /*这里名字是什么,打包出来的名字就是什么*/ 
{
  path: '/',
  name: 'login',  
  component: () => import(/* webpackChunkName: "login" */ '@/views/login/index.vue'),
  meta: {
   title:'登录页'
   keepAlive: false,
  }
 },
 {
  path: "/home",
  name: "home",
  redirect: "/homepage",    
  component: () => import(/* webpackChunkName: "home" */"@/views/Home.vue"),
  children: [
   {
    path: "/homepage",
    component: () => import(/* webpackChunkName: "homepage" */ "@/views/homepage/index.vue"),
    name: "homepage",
    meta: {
     title: "首页", keepAlive: true
    }
   }, 
  ]
}

api  文件夹

根据不同模块的接口,去建不同的文件

三.vue中typescript的写法

typescript的写法和vue差不多,只是script的区别,例:

import { Component, Prop, Vue, Watch } from 'vue-property-decorator'
@Component({ 
  name: 'homepage', 
  components: {}
})

export class MyComponent extends Vue { 
 @Prop({ default: '' }) private name!: string 
 @Watch('name', { deep: true }) 
 changeName(newVal,olVal){}

  //data
  private count:number=5
  private arr:string[]=[]
  mounted(){}

  //methods
  private test(){}
}

四.typescript使用中的问题

1.获取refs 

写法:

let layoutList:any = this.$refs.layout as HTMLDivElement

2.引用插件,且找不到声明文件或引用Json文件

在shims-vue.d.ts 文件中声明,再在组件中引用

declare module "*.json" { 
  const value: any; 
  export default value;
}
declare module "vue-count-to" { 
  const count: any; 
  export default count;
}

页面里面

import * as myJson from '../../../public/test.json'

使用  myJson.default

3.计算属性

get age() { 
  return this.aTagDatasF.filter(item => item.visible)
}

4.@prop

@Prop()private datas!: any

感叹号是非null和非undefined的类型断言,所以上面的写法就是对datas这个属性进行非空断言

5.引入vue组件时,后面必须加  .vue

6.定义接口类型,前面加 I,例如,接口尽量定义类型,规范管理

interface IUserInfo{
  name:string,
  index:number
}

7.定义全局变量(可以用vuex取代)

在.ts文件里面  

export var User:IUserInfo={  
  name:'111',
  index:996
}

其他页面import ,然后 就可以获取到这个值

8.强行让ts不检测

//@ts-ignore  下一行不检测

五.开始改造页面代码(开始吐槽自己)

槽点1:组件切换

以前的代码(部分片段)

记一次用ts+vuecli4重构项目的实现

改造后:用component   用is去动态判断就行

<div class="haveClick>
  <component :is="echartsIndex" :obj="obj"/>
</div>

槽点2:对象赋值

以前的代码(部分片段):

记一次用ts+vuecli4重构项目的实现

改造后:

//这样写是因为initObj还有别的key

for(let i in this.obj){
  if(this.initObj(i)!=undefined){ 
   this.initObj[i]=this.obj[i]
  }
}

//或者  
 写一个函数,如果key值一样就赋值

槽点3:switch case 判断之前的代码:

//片段,有十几个case

optionList:['饼图','柱状图','折线图','...']

筛选下拉后,aa为index
switch (aa) {
    case 0: this.getData() break;
    case 1: this.avgBqzs() break;
    case 2: this.areaCount() break;
    case 3: this.yiqing() break;
    case 4: this.avgFinish() break;
 }

修改后:

private optionList=[{
  title:'饼图', 
  type:'getData'
},{ 
  title:'柱状图',
  type:'avgBqzs'}
 ......
] 
下拉后,用change事件获取 item (这里就不获取index了)
例如:
changeSelect(item:any){
  //当然这里不能通过ts的编译  @ts-ignore
  this[item.type]()}

六.个人项目规范

1.尽量不要使用for,使代码观赏性更高   

forEach 遍历 , map转换,filter 过滤

2.调接口使用 尽量 async和await来调用接口

例如:

private async getData() {  
  const { data } = await getTransactions({})
}

3.只需要部分筛选条件的时候用解构去获取值

public sizeTop={
 id:'',
 City:'',
 County:'',
 time:''
}

const {City,County}=this.sizeTop

 private async getData() {  
  const { data } = await getTransactions({City,County})
 }

到此这篇关于记一次用ts+vuecli4重构项目的实现的文章就介绍到这了,更多相关ts+vuecli4重构内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
js 获取浏览器高度和宽度值(多浏览器)
Sep 02 Javascript
javascript下利用arguments实现string.format函数
Aug 24 Javascript
基于Jquery实现的一个图片滚动切换
Jun 21 Javascript
JS 添加网页桌面快捷方式的代码详细整理
Dec 27 Javascript
用javascript替换URL中的参数值示例代码
Jan 27 Javascript
JavaScript设计模式之外观模式介绍
Dec 28 Javascript
javascript获取四位数字或者字母的随机数
Jan 09 Javascript
jQuery遍历json的方法(推荐)
Jun 12 Javascript
前端程序员必须知道的高性能Javascript知识
Aug 24 Javascript
bootstrap table 多选框分页保留示例代码
Mar 08 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
Sep 11 jQuery
vue计算属性无法监听到数组内部变化的解决方案
Nov 06 Javascript
JS实现图片幻灯片效果代码实例
May 21 #Javascript
Javascript实现秒表计时游戏
May 27 #Javascript
JavaScript实现猜数字游戏
May 20 #Javascript
Vue 打包体积优化方案小结
May 20 #Javascript
vue实现输入框自动跳转功能
May 20 #Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
May 20 #Javascript
精读《Vue3.0 Function API》
May 20 #Javascript
You might like
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
php中用foreach来操作数组的代码
2011/07/17 PHP
PHP代码实现爬虫记录――超管用
2015/07/31 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
Dojo 学习要点
2010/09/03 Javascript
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
jQuery判断复选框是否勾选的原理及示例
2014/05/21 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
javascript中Object使用详解
2015/01/26 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
Bootstrap 响应式实用工具实例详解
2017/03/29 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
js实现自动播放匀速轮播图
2020/02/06 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
2020/07/21 Javascript
vue 手机物理监听键+退出提示代码
2020/09/09 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python中self原理实例分析
2015/04/30 Python
Python中函数eval和ast.literal_eval的区别详解
2017/08/10 Python
python实现感知器算法详解
2017/12/19 Python
numpy中loadtxt 的用法详解
2018/08/03 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
Html5新标签datalist实现输入框与后台数据库数据的动态匹配
2017/05/18 HTML / CSS
Hoover胡佛官网:美国吸尘器和洗地机品牌
2019/01/09 全球购物
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的
2015/07/23 面试题
英文版区域经理求职信
2013/10/23 职场文书
志愿者活动总结范文
2014/04/26 职场文书
学校课外活动总结
2014/05/08 职场文书
关于读书的演讲稿800字
2014/08/27 职场文书
技术股东合作协议书
2014/12/02 职场文书
2015年护士医德医风自我评价
2015/03/03 职场文书
2016年教师节慰问信
2015/12/01 职场文书
新学期开学寄语2016
2015/12/04 职场文书