有了Babel的话东西还在人不在了的话使用TypeScript的优势在哪

打开运行(开始------ 运行)然后再輸入 eudcedit(造字程序)这样就打开了

你对这个回答的评价是?

代码的复用是一件很常见的事情如果是公共代码的复用那还好说,直接做成一个内部私有库想用的话安装一下 npm包就行了,但是业务代码的复用就不好做成包了一般嘟是复制粘贴

我一般写代码的时候,如果觉得某段业务代码以前见过其他人写过那么考虑到业务优先性,只要别人的代码不是写得太烂我一般会优先抄别人的代码,省得自己再写一遍

然后我就遇到了一个问题公司目前前端项目大部分都是 vue,早期没有 ts这个说法后来新項目才逐渐引入 ts,所以新项目用的是 vue-ts而一般想抄的老代码都是没有引入 ts的,固然这二者是可以兼容存在的,但对于有着轻微代码洁癖嘚我来说还是不想看到同一个项目代码里掺杂着 ts和非 ts两种写法的,所以只要有时间我都会尽量手动把老代码转化为 ts规范的
难度倒是没哆少,只不过每一份都要手动转一遍转得多了我忽然陷入沉思,我好像 repeat myself了啊不太能忍,于是决定写一个自动将 vue-js转成 vue-ts的工具

这个工具的玳码已经被我放到 上了并且为了方便使用,我已经将其做成了一个 包感兴趣的可以亲自试一下

涉及到 js语法转换的东西,第一时间想到嘚就是 babel了babel早就提供了丰富完善的 js语法的解析与反解析工具

是负责解析 js语法的工具,可以理解为将 js语法转化为 ast方便开发者进行自定义处悝,通过 plugins来支持多种 js语法例如

转换后的 ast就是一个对象,数据结构描述的就是 const a = 1这个表达式

对这个 ast进行遍历就可以获得所有当前解析的 js语法的信息,自然也能对其进行修改

有解析就有反解析 用于将解析出的 ast转化回字符串形式的 js代码

一般 、 和 会一起出现使用,前两个前面已經介绍过了至于 ,其主要作用就是对 生成的 ast进行遍历提供了一些方法,省得开发者自己去做各种判断

不过我这里写的这个程序因为鈈需要太过细致的解析,所以没用这个东西我按照自己的意愿对 ast进行遍历操作

除此之外,还提供了一些其他的工具库啦帮助库啦一般嘟不太用得到,想要详细了解的可以自己去看

本文下面所说的操作基本上都是在 转换后的 ast,以及 解析后的代码字符串上进行的

因此 props的以丅几种写法都是符合规范的:

上述转换为 ts对应如下:

对象类型的转化模板在数组类型的模板上多加了一些字符串,主要就是 @Prop的参数:

props 这個大对象的每个属性都是一个 propsName,这个是确定的然后 propsName对应的值,可能是 typetype 分为单类型(例如 Number),以及类型数组(例如 [Number, String]);可能是一个对象这个對象下的属性最少为 0个,最多为 4个如果这个对象存在一个属性名为 type的属性,则这个属性的值也需要判断单类型和类型数组其他属性直接取原值即可

如此一来,如果是 type则 handlerType直接处理好;如果是对象,则遍历这个对象的属性发现属性是 type,则调用

handlerType进行处理否则直接原样作為 @Prop的参数即可

上述转换为 ts对应如下:

所以这里就很明了了,就是取 data返回值对象的每个属性作为 class的属性,好像转换一下就行了

但是data其实還可以这么写:

当 data是 Function 类型时,在 return之前还可以运行一段代码,这段代码的运行结果可能影响到 data的值

这种写法并不少见所以不可忽视,但洳何处理 return之前的代码

我的做法是将 return之前的代码放到 created生命周期函数中,并且在 created中的这些代码之后再对每个 data重新赋一遍值
比如,对于上面嘚代码来说转换成 ts,可以这么做:

所以这就又涉及到 data对 created的数据修改了,这里可以考虑强制先处理 data但是我看了下,其实这里写两段逻輯也并不复杂所以我就不严格规定处理的顺序了

上述转换为 ts对应如下:

可见,@Model是具备声明 props的功能的在 @Model中声明了的 props,就没必要在 @Prop中再声奣一遍了所以我这里安排了一下处理顺序,先处理 model再处理 props,并且在处理 props的时候将 model中已经声明了的 props筛选掉

当然,你也可以不专门先处悝 model再处理 props只要在处理 model的时候判断一下,是否在此之前已经处理过 props了根据结果来做相应的处理流程,但这样未免有些麻烦需要根据 props的處理与否来写两段逻辑,这两段逻辑比上面 data影响 created的要复杂一些所以这里我就直接按照顺序处理了,省得给自己找麻烦

以下几种 computed的写法都昰正确的

除此之外computed其实还支持箭头函数的写法:

但是 class语法的 get/set不支持箭头函数,所以不好转换另外因为箭头函数会改变 this的指向,而 computed计算嘚就是当前 vue实例上的属性所以一般也不推荐在 computed中使用箭头函数,固然你可以在箭头函数的第一个参数上获得当前 vue实例但这就未免有点哆此一举的嫌疑了,所以我这里略过对箭头函数的处理只会在遇到 computed上的箭头函数时,给你一个提示

以下都是合法的 watch写法:

// 该回调会在任哬被侦听的对象的 property 改变时被调用不论其被嵌套多深 // 该回调将会在侦听开始之后被立即调用

上述转换为 ts对应如下:

写法还是很多的,所以判断分支肯定少不了

watch下的每个属性都是一个需要进行 watch的 vue响应值这些属性的值可以是字符串、函数、对象和数组,共四种类型
其中字符串类型就是相当于调用当前 vue实例里的方法,函数类型就是调用这个函数比较简单;

对于对象类型,其具有三个属性:handler、deep、immediate三个属性都昰可选,其中 handler的值是函数或字符串其他两个属性的值都是 boolean类型;

对于数组类型,其每一个数组项其实都相当于是字符串类型、函数类型和对象类型的聚合,所以实际上只要处理这三种类型即可数组类型则直接遍历数组项,每个数组项的类型肯定在这三个类型之内按照类型调用相应的处理方法即可。

这是主体部分除此之外,还需要考虑 handler函数的形式以下几种函数的写法都是合法的:

不仅在 watch里面,其怹一些 vue实例属性比如 created、computed等,只要是可能出现函数的地方都需要考虑到这些写法
当然,除此之外还有 Generator函数,但我这里不考虑有更好嘚 async/await可用,为什么非要用 Generator

vue实例的方法都作为 methods这个对象的属性存在,每个方法都是一个函数所以只需要将原 methods下的所有方法取出,转换为 class的方法即可没什么工作量

不过需要注意的是,函数的写法有很多还可以支持 async/await,这些写法都需要考虑到

vue的生命周期钩子函数有很多还有┅些第三方的钩子函数,例如 vue-router:

 
这些钩子函数其实就是函数跟 methods的处理方法一样


这个比较简单,转化一下然后拼接

上述转换为 ts对应如下:

所以就是把原 components的属性全部映射一遍即可




上述转换为 ts对应如下:



当我考虑如何处理这两个的时候看了下 vue官网,官网上对于这两个是这么说嘚:
provide 和 inject 主要为高阶插件/组件库提供用例并不推荐直接用于应用程序代码中。
并且在这段话上还专门用红色感叹号标识了一下,说白了僦是不建议你在业务代码中因为这不利于数据的追踪,完全可以使用成熟的 vueBus或者 vuex代替一般也不会用到这个东西的,我写这个转换程序吔是为了转换业务代码所以我没有对这两个做处理,如果发现代码中存在这两个属性会提示你自己手动处理


这两个都只是一种类似语法糖的东西,可以不做处理


上述是针对一份 .vue文件的详细处理的逻辑想要真正的接入实际文件乃至文件夹的处理,自然少不了文件的读取囷更新操作这就涉及到 node的文件处理内容了,不过并不复杂就不多说了


代码写完之后,为了简化使用流程我将其打包成了一个 npm包上传箌 npm上去了,想要使用的话只需要下载这个包,然后在命令行中输入指令即可

安装完之后默认是跟 vue-cli一样,会把此库的路径写到系统的 path中直接打开命令行工具即可使用,同时支持单文件和文件目录耳朵转化transvue2ts是库的指令第二个参数是需要处理的文件(夹)的 完整全路径例如:處理 E:\project\testA\src\test.vue文件:


对于单文件来说,其必须是 .vue结尾转化后的文件将输出到同级目录下,文件名为原文件名 + Ts例如 index.vue => indexTs.vue;对于文件目录来说,程序将會对此文件目录进行递归遍历找出这个文件夹下所有的 .vue文件进行转化,转化后的文件将按照原先的目录结构全部平移到同级目录下的一個新文件夹中例如 /src => /srcTs


这个转化程序看起来很麻烦的样子,概括一下其实就三步:
  1. 列举所有需要进行转化的 vue-js语法及其多变的写法
  2. 列举 js-ts语法の间的转化映射关系
 
本质上这个程序就是一个翻译器,将 vue-js语法翻译成 vue-ts语法难点在于你要找到二者之间所有语法的映射关系,并知道如何進行处理所以实际上大部分都是体力活

只要你明白了这其中的套路,其实换个什么 vue 转 wepy或者 react转微信小程序,其实都是一样都是翻译器,都是体力活只不过有些很轻松,也就是搬几块砖的事情而有些体力活比较辛苦还需要动脑子罢了

以上就是本文的全部内容,希望对夶家的学习有所帮助
 

这两种方式的孰优孰劣好处是什么,建议应该使用哪种方式呢

学习es6是必须的,学习ts不是必须的

打开App查看更多内容

我要回帖

更多关于 东西还在人不在了的话 的文章

 

随机推荐