写点什么

Flow: Facebook 出品的 JavaScript 静态类型检查工具

2014 年 11 月 25 日

Flow 是 Facebook 出品的一个 JavaScript 代码的静态类型检查工具,该工具采用开放源码的 OCaml (Objective Caml)语言开发, 并遵守 BSD 开源协议发布,其代码托管在 GitHub 上。Flow 能够帮助开发人员查找出 JavaScript 代码中的类型错误,从而提高开发效率和代码质量。Flow 已经能够捕获 JavaScript 代码中的常见问题,如静态类型转换不匹配、空指针引用等问题。同时,Flow 还为 JavaScript 新增了类型语法,如类型别名。当前,Flow 已具有以下两个主要特征:

1、 Flow 的类型检查具有可选性和自动性

通过使用 Flow,开发者能够有针对性地对文件进行检查,当开发者选择一个文件进行检查时,Flow 会自动检查相应代码,并报告检查出的错误。但是,对于比较大的 lib 一类文件,Flow 的检查报告有时候会不太精确,不过开发者可以使用“类型注释”人为干预 Flow 来进行类型检查或者将 Flow 切换到一种“弱模式”下以提高精确度。

2、Flow 的类型检查是一种及时、在线的检查

当对整个代码库进行检查时,Flow 首先会对整个代码库的所有文件进行一个初步地分析,然后监控文件的后续变化,并进行类型检查和依赖检查。对于开发者来说,他们根本感觉不出编译时间的延迟。当对代码进行编辑或者批量更新一批文件时,Flow 将会自动触发代码检查,并保存检查的结果以备及时查询使用。

目前,Flow 还处在早期阶段,仅支持 Mac OS X、Linux (64-bit) 两种系统。但是,Flow 开发团队正在进行快速的迭代开发,新功能将很快在接下来的版本中出现,如支持 JavaScript 的新标准 ECMAScript 6、使用 js_of_ocaml 编译器将 Flow 编译成 JavaScript 代码、为编集成 Flow、错误信息的分类和文件的过滤以及改进错误提示以做到能够更好的错误原因提示和错误定位等。Flow 已经在 Facebook 相关项目中使用,Facebook 开发团队期待着大家加入到该项目中,并给予宝贵的意见和建议。

Flow 类型检查的一个简单实例如下:

复制代码
/* @flow */
function foo(x) {
return x * 10;
}
foo(‘Hello, world!');

运行如下命令:

复制代码
$> flow

将会给出在某行代码出现类型不兼容的提示,并指明应该是什么类型以及实际是什么类型。

Flow 官方还提供了使用入门指南,以供大家学习和研究,该指南包括如何在已存在的代码中运行Flow、如何检查第三方代码、如何运行Flow 的代码、如何排除问题排除以及代码检查的实例等内容。Flow 是个开放源码的项目,所以有兴趣的用户都可以从GitHub 库下载其源码并进行深一步的研究。Flow 基于高性能的OCaml 语言的实现,而OCaml 是由 Xavier Leroy Damien Doligez 等人于 1996 年基于函数式编程语言 Caml 创立的一个开源项目,并在面向对象方面做了扩展。另外,除了 Flow 外,还有前端领域的大牛 Douglas Crockford 编写的 JavaScript 静态类型检查工具 JSLint 以及 JSLint 的一个分支——开源项目 JSHint 等。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2014 年 11 月 25 日 10:073735
用户头像

发布了 92 篇内容, 共 38.5 次阅读, 收获喜欢 1 次。

关注

评论

发布
暂无评论
发现更多内容

技术人为什么该坚持写作?

极客思享

那个百无一用的技术主管

极客思享

使用 jsDelivr 免费加速 GitHub Pages 博客的静态资源(二)

mzlogin

jsDelivr CDN Jekyll GitHub Pages 个人博客

算法岗有没有泡沫

极客思享

Python 为什么不支持 switch 语句?

Python猫

Python 编程

LeetCode题解:226. 翻转二叉树,递归,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

Redis-技术专题-基础介绍

李浩宇/Alex

菜鸟工程师的超神之路 -- 从校园到职场

极客思享

架构师训练营第四周学习总结

尹斌

有这些要素,架构才完整

北风

架构 架构师之道 架构方法

演化过程中的技术与业务双驱引擎

boshi

云计算 架构 中台 成长 数字化

极客时间架构 1 期:第 3 周代码重构 - 学习总结

Null

Serverless 多云解决方案 Malagu

木香丘

云计算 Serverless 架构 云原生 Malagu

深入剖析go中字符串的编码问题——特殊字符的string怎么转byte?

Gopher指北

go golang 后端 string utf-8

架构师1期-代码重构作业

ltl3884

极客大学架构师训练营

第四周作业

极客大学架构师训练营

架构师训练营第四周作业

尹斌

共享服务中心建设原则-《企业IT架构转型之道-阿里巴巴中台战略思想与架构实战》

Man

中台 研发管理 DDD

java安全编码指南之:方法编写指南

程序那些事

java安全编码 java安全 java安全编码指南

Hazelcast IMDG 带你瞬间进入内存计算的时代

张磊

分布式计算 内存管理 分布式缓存 分布式内存网格

spring-boot-route(九)整合JPA操作数据库

Java旅途

Java Spring Boot jpa

发几张国庆的照片

亨利笔记

容器 k8s Harbor 镜像

甲方日常 26

句子

生活 随笔杂谈 日常

基于 Spring Boot 的企业级快速开发框架 BDF3

木香丘

架构 Spring Boot 可视化 后台管理系统

如何高质量学习与正确运用设计模式

木香丘

学习 设计模式 实战

架构师训练营第三小结(9.28-10.4)

zjzj2017

架构师训练营第三周作业(9.28-10.4)

zjzj2017

week03作业

xxx

week03总结

xxx

缓存服务-技术专题-解决方案

李浩宇/Alex

Malagu 框架介绍

木香丘

云计算 开源 Serverless 架构 框架

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

Flow: Facebook出品的JavaScript静态类型检查工具-InfoQ