热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

react源码剖析004关于范例搜检东西flow

Flow简介flow是facebook推出的js范例搜检东西。js是一门弱范例言语,没有从言语层面去保证变量范例不婚配的基础毛病。flow使得我们能够指定变量的范例,防止此类毛病的

Flow 简介

flow是facebook推出的js范例搜检东西。js是一门弱范例言语,没有从言语层面去保证变量范例不婚配的基础毛病。flow使得我们能够指定变量的范例,防止此类毛病的发作。

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

如图,运用flow以后,square函数的参数和返回值,都能够指定范例。当你在代码中写square(‘2’, ‘2’)的时刻,用flow敕令一搜检,不需要看营业逻辑,就晓得挪用的参数有毛病。

flow入门

  1. 新建项目,初始化flow设置

    mkdir flow-demo && cd flow-demo && mkdir src && mkdir lib

  2. 设置编译器

    yarn add --dev babel-cli babel-preset-flow

    此时会天生package.jsonyarn.lock文件。yarnnpm的替代品,能够加速npm模块的装置,而且能兼容大多数的npm敕令。yarn的官网移步这里。

    然后在根目次新建一个.babelrc文件,并设置flow作为presets

    {
    "presets": ["flow"]
    }

    个中"flow"就是指适才装置的babel-preset-flow的简写,省略了babel-preset-

    此时,你能够用以下敕令来做代码编译:

    yarn run babel src/ -D lib/

    固然,也能够将这个敕令设置到package.json文件中:

    {
    "name": "flow-demo",
    "main": "lib/index.js",
    "scripts": {
    "build": "babel src/ -D lib/",
    "prepublish": "yarn run build"
    }
    }

  3. 设置flow

    引荐将flow装置到当前项目目次,而不是全局装置。

    yarn add --dev flow-bin

    此时

    运转yarn run flow init天生设置文件.flowconfig
    运转yarn run flow举行代码搜检

    运转上述代码时会天生一个可复用的背景历程,以加速后续代码搜检的速率。

    注重上面两敕令都带上yarn run flow,而不是直接运转flow。区别是yarn run flow挪用了本项目中flow-bin的flow敕令。

    别的,npm上有一个flow,和这里面的flow是完整不相关的,不能殽杂。

    停用flow背景历程,运用flow stop

    以上示例的源码。

flow设置文件.flowconfig

这部份将连系react的.flowconfig和flow官方文档举行剖析。

flowconfig也许遵照INI文档花样。一个.flowconfig文件,能够包含下以五个部份:

[include]
[ignore] 用正则表达式婚配文件或目次,满足前提的将被flow疏忽;示意项目根目次
[libs]
[options]
[version]

[ignore]

[ignore]
# Ignore Docs
/docs/.*
/.*/docs/.*

react的ignore部份,都运用了这类绝对路径的写法。在设置中运用解释,能够在行首加#号。

[ignore]
/.*/node_modules/y18n/.*

不清楚为何react只将node_modules下的y18n疏忽,而不是将全部node_modules目次疏忽?(TODO)

[libs]

[libs]
./node_modules/fbjs/flow/lib/dev.js
./flow

dev.js只要一行代码:declare var __DEV__: boolean;, react跨项目援用一行代码可见flow项目几乎就是应react而生。

说到[libs],就必须要说一说flow的一个主要观点:flow library definition。一个flow library definition文件(简称libdef),就类似于C++中的头文件,是用来定义跨项目可用的全局变量。能够定义全局的Function/Class/Variables/Type/Module。详见flow文档。

TODO: flow为何要支撑libdef?又是怎样运用libdef文件的?

[options]

[options]
# 可选项node|haste,haste已不再被保护,可react还在用
module.system=haste
# 许可在class中运用static关键字
esproposal.class_static_fields=enable
# 许可在class中运用instance关键字
esproposal.class_instance_fields=enable
# 不许可在class中运用下划线作为私有函数
munge_underscores=false
# 束缚的范例,能够用来替代TODO
suppress_type=$FlowFixMe
# 这个正则是什么寄义?TODO
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(3[0-3]\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*www[a-z,_]*\\)?)\\)

[version]

[version]
^0.41.0

此version是指flow-bin的版本,能够用yarn run flow version检察。


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
author-avatar
尘世聚散
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有