第一部分:前言 

 我们知道JS是弱类型语言,在声明变量时不论是什么类型的变量我们都用var即可,所以js是非常灵活的,但是同时问题就是弱类型语言有可能会出错,比如在调用函数时,且往往在运行起来时才可以检查,于是facebook开源了flow.js,它可以看做是强类型的js,即在声明变量时使用具体的类型名称,在运行前编译为正常的js即可。 flow.js的理念类似于typescript,但是他比typescript更轻,更容易迁移,因为我们只需要做出很小的改变就可以使用flow.js,而typescript却非如此,它就像一门新的语言,所以目前flow.js是非常流行的,包括vue也使用了flow.js。

  flow.js官网

  github

  flow.js是前两年才出现的,当前版本为v0.49.1,目前在github上已经有了10000多star,可见flow.js还是非常流行的。 所以我们可以尝试在项目中使用flow.js。

  官网上是这样介绍的:flow.js是用来为js做静态类型检查的。

  flow.js的特点如下

  1. Code Faster。因为通过使用flow.js,我们可以减少很多不必要的错误 --- flow.js会在你敲代码的过程中就帮你检查代码中的错误,这样就不用再运行的时候不停地去寻找错误了。、
  2. Code Smarter。对于像js这样的动态语言我们很难创建聪明的工具。而flow.js理解你的代码,使得你更聪明的写代码。
  3. Code Confidently。 对代码做出巨大的改变是非常恐怖的。flow.js可以帮助你更快地重构,这样你就不用担心很多可能出现的问题了。
  4. Code Bigger。 很多开发人员同时对一个项目开发是很困难的。而flow.js可以帮助你解决这个问题,因为即使是半年前写的代码,使用flow.js依然可以让你轻松看明白。

  

第二部分:Getting Start

  flow是用于检查js代码的静态类型检测器。 它做了很多工作以使得你写代码的效率更高效。使得你写的更快、更聪明、更自信并且写的代码是可以非常大的。

  flow会通过静态类型注释来检测你错误的代码,这些类型允许你告诉flow你想让你的代码如何工作,并且flow将会保证它。 如下所示:

// @flow
function square(n: number): number {
return n * n;
} square(""); // Error!

因为flow已经对js非常了解了,所以他不需要太多的类型,你应该做的仅仅是告诉flow必要的对于代码的描述然后flow就会做好剩下的工作了。 大部分时候,flow甚至可以不需要声明类型就理解你的代码。 如下所示:

// @flow
function square(n) {
return n * n; // Error!
} square("");

你也可也以让flow不起作用,所以你可以尝试使用它和不使用的区别所在。

第三部分: Installation

  对于安装flow,是有很多种方法的,这取决于你在项目中使用了哪些工具,比如,我们可以使用Yarn作为包管理工具,也可以使用npm作为包管理工具;我们可以使用Babel作为编译js的工具,也可以使用专用工具flow-remove-types。

安装编译器

  首先,你需要安装编译器,可以在babel和flow-remove-types之前作出选择,Babel是一个js代码编译器并且是支持flow的。 首先安装 babel-cli 和 babel-preset-flow, 这里使用npm安装:

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

  接着你应该创建一个.babelrc的文件在你的项目根目录下,并且包括下面的代码:

{
"presets": ["flow"]
}

  

安装flow

  将flow-bin添加到devDependency。

npm install --save-dev flow-bin

  接着添加一个‘flow’script到你的package.json中。

{
"name": "my-flow-project",
"version": "1.0.0",
"devDependencies": {
"flow-bin": "^0.41.0"
},
"scripts": {
"flow": "flow"
}
}

  然后就可以运行了,第一次运行如下所示:

npm run flow init

  在第一次运行flow之后,就可以像下面这样运行了:

npm run flow

   注意:在使用的过程中可能会遇到一个问题,具体答案参考这篇文章

  

第三部分: 使用

  一旦你安装好了flow,那么你一定想要感觉一下怎么最简单的开始使用flow,对于大部分的flow工程,你需要学习下面基本的模式:

  • 初始化你的项目通过使用 flow init
  • 开始flow后台进程使用flow
  • 决定哪个文件将会被监视(monitor)使用// @flow
  • 开始在你的项目中写flow代码。
  • 检查你代码中的类型错误。

初始化你的项目

  着手准备一个flow项目需要一行命令:

flow init

  在你的项目的层级上来执行这条命令。在基本水平上,.flowconfig 告诉了flow 后台进程要进行flow检测的根目录。

  这样你的项目现在就是支持flow的了。

.flowconfig是一个空文件是很常见的事情。 然后,你可以通过多种方式来配置以及个性化flow通过添加配置选项添加到.flowconfig中。

运行flow的后台进程

  flow最重要的地方在于快速检测你代码中错误的地方,一旦你激活了项目中的flow,俺么你哭可以开启进程时flow以最快的速度检测你的代码错误。

flow status

  这条命令首先开启了一个后台进程为了寻找错误来检测所有的flow文件。后台进程会持续运行,监视着你的代码的改变并且仪最快的速度来检查。

  你也可以直接输入flow来完成相同的功能,因为status对于flow二进制文件来说是一个默认的flag。

  只有一个后台进程运行到指定时间了,你才能运行flow status多次, 因为它会始终使用同一个进程。

  为了停止后台进程,运行 flow stop。

准备为你的代码使用flow语法

  flow后台进程会监视着所有的flow文件,然后,怎么样才能让他知道哪些文件时需要flow的呢?并且该如何监测呢? 请将下面的代码放在一个js文件的代码最前面,这就是后台进程会监测的文件的标志:

// @flow

  这个标志是现代JavaScript使用flow所需要的。 flow后台进程会汇集所有的有这个标记的文件并且使用所有有用的类型信息来确保一致性对于编程。

  如果你的项目中没有这个flag,那么flow后台进程就会跳过并且忽略这些代码(除非你调用flow check --all)。

  

写flow代码

  既然所有的安装和初始化都已经完成了,那么现在你就可以开始着手准备些真正的flow代码了。 对于每一个你已经使用了// @flow标记的文件,你现在就对他有了完全的控制权利和类型检测权利,下面是一个flow文件的例子:

// @flow

function foo(x: ?number): string {
if (x) {
return x;
}
return "default string";
}

  注意,这里的类型添加到了参数当中并且在函数的最后还指定了函数的返回类型。你可以从这个代码中判断出来这里再返回类型处有一个错误,因为这个函数可能放回一个int, 然而,你是不需要自己去用眼睛来检测观察代码错误的,因为flow后台进程将能够捕获到这个错误当你检查代码时。

  

检查你的代码

  使用flow.js最大的好处在于它几乎可以实时的给你代码状态的反馈,在任何事件你想要检查代码错误,直接运行 :

flow

  即可,这等效于使用flow status, 第一次运行flow,flow的后台进程需要检查你所有的文件,当再一次运行时,flow就会直接来给出结果了。 对于上面的代码,运行flow将会yield,如下:

test.js:
: return x;
^ number. This type is incompatible with the expected return type of
: function foo(x: ?number): string {
^^^^^^ string

  

更多请看这里

初探flow.js的更多相关文章

  1. 初探原生js根据json数据动态创建table

    初探原生js根据json数据动态创建table 小生以实习生的职位进入了一家非纯软件的公司做asp.net开发,大半个月下来发现公司里居然没有前端工程师,这令我很诧异,跟着公司做项目,发现前端后台没有 ...

  2. 初探 Ext JS 6 (sencha touch/ext升级版)

    Sencha Touch 现在已全面升级至Ext Js 6,那么我们如何使用他们呢? 首先去官网下载最新的sdk和帮助文档 sdk下载地址:https://www.sencha.com/product ...

  3. 初探grunt.js

    package.js { "name": "ttd_v3", "version": "0.1.0", "aut ...

  4. 前端初学者——初探Modernizr.js Modernizr.js笔记

    什么是Modernizr? Modernizr 是一个用来检测浏览器功能支持情况的 JavaScript 库. 目前,通过检验浏览器对一系列测试的处理情况,Modernizr 可以检测18项 CSS3 ...

  5. 初探node.js

    一.定义及优势 定义:Node.js是一个基于 Chrome V8 引擎 的 JavaScript 运行时,它以事件驱动为基础实现了非阻塞模型. 优势:由于Web场景下的大多数任务(静态资源读取.数据 ...

  6. 初探three.js

    相信大多数选择前端的小伙伴都有一个设计师的梦,今天我来说一说three.js.three.js是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质等各种对象.学习了 ...

  7. 初探three.js几何体

    今天说说three.js的几何体,常见的几何体今天就不说了,今天说一说如何画直线,圆弧线,以及高级几何体. 1. 画一条直线 画直线我们使用THREE.Geometry()对象. //给空白几何体添加 ...

  8. 初探 Node.js 框架:eggjs (环境搭配篇)

    eggjs 是一个优秀的 Node.js 框架 概述:为什么标题上说 eggjs 是一个优秀的 Node.js 框架(可跳过)? 换言之,我们为什么选择 eggjs 进行开发而不是之前初学时使用的 E ...

  9. 初探three.js几何体-Geometry

    three.js几何体我们还没有说完,这一节我们说一说THREE.Geometry(),简单几何体都是继承了这个对象,使用它会相对麻烦一些,但是可操作性非常高,今天我们使用它制作一个自定义几何体-五角 ...

随机推荐

  1. SQL server 累加求和

    1. SELECT SalesOrderID, ProductID, OrderQty    ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS Tot ...

  2. WCF 学习笔记

    Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架.借助 WCF,可以将数据作为异步消息从一个服务终结点发送至另一个服务终结点.服务终结点 ...

  3. solr&lucene3.6.0源码解析(二)

    上文描述了solr3.6.0怎么采用maven管理的方式在eclipse中搭建开发环境,在solr中,为了提高搜索性能,采用了缓存机制,这里描述的是LRU缓存,这里用到了 LinkedHashMap类 ...

  4. android app启动就闪退怎么办?

    开发过程中,如遇到android app启动就闪退,不要急,直接进入调试模式运行app,就会取得出错的原因. http://blog.sina.com.cn/s/blog_44fa172f0102wg ...

  5. 基于GOJS绘制流程图

    基于GOJS封装的流程图设计(展示)工具类,主要分为两个工具类: 工具库依赖于go.js.jquery以及layer.js http://gojs.net/ http://jquery.com/ ht ...

  6. Zeal - 开源离线开发文档浏览器

    https://zealdocs.org/ win10上暂时安装版会crash,请用portalable的解压版

  7. OI题目类型总结整理

    ## 本蒟蒻的小整理qwq--持续更新(咕咕咕) 数据结构 数据结构 知识点梳理 数据结构--线段树 推荐yyb dalao的总结--戳我 以后维护线段树还是把l,r写到struct里面吧,也别写le ...

  8. 广告小程序后端开发(2.Models设计)

    1.users的数据表设计: 1.重建用户表: 1.在settings中配置: AUTH_USER_MODEL='users.UserProfile' 2.apps/users/models.py中建 ...

  9. javascript显示年月日时间代码显示电脑时间

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Python 中当前位置以及目录文件遍历操作

    Python 中当前位置以及目录文件遍历操作 当前位置 print(os.path.dirname(__file__)) 其中 dirname 会选择目录(文件夹),"__file__&qu ...