Vue项目中使用flow做类型检测的方法


Posted in Javascript onMarch 18, 2020

在vue2.0的项目中加入flow类型检查。当前项目是用js写的,当项目越来越大,由于js弱类型的特性,相比ts(typescript)这种强类型的语言而言,后期维护会越来越困难。为了解决这个问题,决定使用flow 加入类型检查。

flow了解

flow是fackbook公布的javascript静态类型检查器。 可以检查js中一些bug,eg:自动类型转换中出现的问题。flow官网

首先,安装flow

npm i flow-bin --save-dev

然后在package.json中添加脚本

"scripts": {
  "flow": "flow check"
 }

在项目根目录下运行命令,生成文件.flowconfig

npm run flow init

打开 .flowconfig 文件,可以看到内容大致如下

.*/node_modules/.*
.*/test/.*
.*/build/.*
[include]
[libs]
[lints]
[options]
module.file_ext=.vue 
module.file_ext=.js
[strict]

其中在[ignore]下配置要忽略的文件,在[options]中我们可以添加
module.file_ext=.vue 这样的配置让flow检测vue单文件组件

  • [ignore]:Flow 默认检查项目目录下所有文件,但是有很多文件必定是我们不想检查的,就像 node_modules、build 等目录下的文件,所以我们需要在将这些目录写在 ignore 配置下。
  • [include]:所谓的项目目录其实是 .flowconfig 目录,并不是真正的项目目录,如果我们在这个项目中的某个目录下创建一个 .flowconfig,那么 .flowconfig 所在的目录也会变为一个 Flow 项目。那么,如果我们想对当前 Flow 项目以外的文件或者目录进行检查,需要把它们写在 include 配置项中。
  • [libs]:在项目中,我们可能会用到很多自定义的类型,比如说要记录对象的结构,它可能在每个文件中都会被运用到,我们将其抽取为全局的类型或数据结构,在任何文件都可以使用。为了管理方便,我们将全局类型都定义在一个或多个单纯的目录中统一管理。这里存放的有可能是一个定义好的数据结构,存放的也有可能是根据项目中某个类对应的数据类型。我们将这些文件或目录写在 libs 配置项中,这个配置对于我们使用 Flow 来说很重要。
  • [options]:这里填写对 Flow 项目的一些配置,配置项以key=value的形式,每行写一个。所有的配置见官方文档
  • [lints]:官网中没有提到 lints 相关的配置

然后,在需要flow进行类型检测的.js文件或.vue文件script标签内容最顶部,加上注释

// @flow

没有该注释对文件将不会进行类型检测

配置到到这里,我们可以运行 npm run flow 进行代码到类型检查,获取检查报告。

由于类型注释不是我们ES规范的一部分,因此我们需要把使用了flow的代码转换成正常的js代码,可以使用babel-preset-flow或babel-plugin-transform-flow-strip-types来移除它。

安装flow相关的flow插件:
babel-cli: babel-cli脚手架
babel-preset-flow: 用于编译前去除代码中的类型声明
babel-plugin-transform-flow-strip-types 同上,而选一

npm install --save-dev babel-cli babel-preset-flow

安装完后,在项目根目录的.babelrc文件(无则创建)里添加如下内容

{
 "presets": [
  ["env", {
   "modules": false,
   "targets": {
    "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
   }
  }],
  "stage-2",
  "flow"
 ],
 "plugins": [
  //"babel-plugin-transform-flow-strip-types"
 ]
}

如果想要在代码中实时看到flow类型检查的错误,需要安装eslint插件

npm i eslint-plugin-flowtype-errors --save-dev

然后在.eslintrc文件中添加配置:

{
 plugins: [
  'flowtype-errors'
 ],
 rules: {
  "flowtype-errors/show-errors": 2
 }
}

PS:在vscode中进行类型声明时可能会报"类型声明只能在.ts文件中使用"的错误,这时候找到setting,搜索javascript.validate,将其禁用即可

参考文章:Writing Vue.js Components with Flow

到此这篇关于Vue项目中使用flow做类型检测的方法的文章就介绍到这了,更多相关Vue flow 类型检测内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Javascript 相关文章推荐
JQuery的Alert消息框插件使用介绍
Oct 09 Javascript
JQuery中的$.getJSON 使用说明
Mar 10 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
Jan 16 Javascript
js实现刷新iframe的方法汇总
Apr 27 Javascript
JQuery中基础过滤选择器用法实例分析
May 18 Javascript
JS实现方向键切换输入框焦点的方法
Aug 19 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
Jan 26 Javascript
微信小程序之小豆瓣图书实例
Nov 30 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
Sep 28 Javascript
axios发送post请求springMVC接收不到参数的解决方法
Mar 05 Javascript
MVVM框架下实现分页功能示例
Jun 14 Javascript
VUE 实现滚动监听 导航栏置顶的方法
Sep 11 Javascript
JavaScript正则表达式验证登录实例
Mar 18 #Javascript
JS正则表达式验证密码强度
Mar 18 #Javascript
原生js实现密码强度验证功能
Mar 18 #Javascript
JavaScript实现密码强度实时验证
Mar 18 #Javascript
js如何验证密码强度
Mar 18 #Javascript
js验证密码强度解析
Mar 18 #Javascript
js实现超级玛丽小游戏
Mar 18 #Javascript
You might like
php使用qr生成二维码的示例分享
2014/01/20 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
2015/01/28 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
Bootstrap里的文件分别代表什么意思及其引用方法
2017/05/01 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
在JS循环中使用async/await的方法
2018/10/12 Javascript
vue v-for循环重复数据无法添加问题解决方法【加track-by='索引'】
2019/03/15 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
ES11新增的这9个新特性,你都掌握了吗
2020/10/15 Javascript
[41:52]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第二场 2月22日
2021/03/11 DOTA
从零学Python之引用和类属性的初步理解
2014/05/15 Python
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
对python中list的五种查找方法说明
2020/07/13 Python
实例讲解使用HTML5 Canvas绘制阴影效果的方法
2016/03/25 HTML / CSS
html5中嵌入视频自动播放的问题解决
2020/05/25 HTML / CSS
奥地利顶级内衣丝袜品牌英国站:Wolford英国
2016/08/29 全球购物
西班牙电子产品购物网站:Electronicamente
2018/07/26 全球购物
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
为什么要有struct关键字
2012/05/08 面试题
民族学专业大学生职业规划范文:清晰未来的构想
2014/09/20 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
交通事故被告答辩状
2015/05/22 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
初中思想品德教学反思
2016/02/24 职场文书
Go 中的空白标识符下划线
2022/03/25 Golang
漫画《催眠麦克风-Dawn Of Divisions》第二卷PV公开
2022/04/05 日漫