高级配置

本节讨论一些高级配置用来定制 flow 的运行

.flowconfig#

使用 flow init 创建的 .flowconfig 文件,告诉 Flow 在这个目录下 开始检测,这能满足大多数情况。

不过,.flowconfig 确实提供了一些配置选项,额外告诉 Flow 哪些文件是否要检测

[include]#

.flowconfig 中的 [include] 一栏,用来告诉 flow 还要检测哪些文件或者目录(所有子文件)。 这一栏配置的每一行表示一个待检测的路径,可以使用相对于根目录的路径,或者绝对路径, 支持一个或多个星号通配符。

别忘了,根目录(.flowconfig 所在目录)下的所有文件都自动认为是待检测

举例说明,如果 /path/to/root/.flowconfig 包含了下面配置

[include]
../externalFile.js
../externalDir/
../otherProject/*.js
../otherProject/**/coolStuff/

当 Flow 检测项目 /path/to/root 的时候,检测文件包括:

  1. /path/to/root/ (自动包含)
  2. /path/to/externalFile.js
  3. /path/to/externalDir/
  4. /path/to/otherProject/ 下所有以 .js 结尾的文件
  5. /path/to/otherProject 下任意名为 coolStuff/ 的目录

[ignore]#

.flowconfig 文件的 [ignore] 一栏,用来告诉 flow 哪些文件不需要检测, 路径匹配使用正则表达式。当然,默认为空,就是都得检测嘛

Things to keep in mind:

  1. 这是 OCaml 正则表达式.
  2. 这些正则表达式匹配的绝对路径. 通常应该以 .* 开头
  3. [ignore][include] 之后, 如果同时 include 和 ignore 同个路径,那么就会 ignore

一个 [ignore] 的例子大概长这样:

[ignore]
.*/__tests__/.*
.*/src/\(foo\|bar\)/.*
.*\.ignore\.js

[ignore] 配置表示忽略:

  1. 所有名为 __tests__ 目录下的目录和文件
  2. 所有 … .*/src/foo.*/src/bar 下 …
  3. 所有以 .ignore.js 结尾命名的文件

从 Flow v0.23.0 开始,你可以在正则中用 <PROJECT_ROOT> 占位符表示根目录的绝对路径。 对于相对路径的场景就很有用了,例如:

[ignore]
<PROJECT_ROOT>/__tests__/.*

这就忽略了项目根目录下 __tests__ 的目录和文件。

不像之前的 .*/__tests__/.* 那样忽略了整个系统名为 __tests__ 的目录

[libs]#

配置了 .flowconfig 文件的 [libs] 后,当检测代码的时候, flow 就会包含指定的 声明 (接口文件)。

[libs] 下每行配置表示要包含的一个目录或文件,相对与根目录的路径,或者绝对路径

[options]#

.flowconfig[options] 支持多个键值对。 任何未设置的配置项都有默认值,有一些配置项可以通过命令行标记 (--xx) 覆盖。

  • log.file (string): 日志文件路径 (默认为 /tmp/flow/<根目录转义>.log)

  • module.name_mapper (‘正则’ -> ‘字符串’): 正则用来匹配模块名,字符串表示替换后的模块

    例如:

    module.name_mapper='^image![a-zA-Z0-9$_]+$' -> 'ImageStub'

    让 Flow 认为 require('image!foo.jpg') 就是 require('ImageStub').

    表达式使用 OCaml 正则表达式. 使用 \(\) (斜杠不能少) 来创建捕获组, 然后在替换字符串中引用,像\1 (到 \9).

    (注意: 可以给 module.name_mapper 配置多条规则)

  • module.name_mapper.extension (string -> string): 指定文件扩展名用于匹配, 和一个用于替换的模块名, 用 -> 分隔

    (注意,这相当于 module.name_mapper='^\(.\*\)\.EXTENSION$' -> 'TEMPLATE' 的简便用法)

    例如:

    module.name_mapper.extension='css' -> '<PROJECT_ROOT>/CSSFlowStub.js.flow'

    让 Flow 认为 require('foo.css') 就是 require(PROJECT_ROOT + '/CSSFlowStub').

    (注意: 可以配置多条 module.name_mapper.extension )

  • module.system (node | haste): 使用哪种模块系统解析 importrequire . Haste 用在 React Native. 默认是node.

  • module.system.node.resolve_dirname (string): 默认, Flow 会在 node_modules 目录下查找 node 模块。 通过这个配置更改查找目录。

    例如配置:

    [options] module.system.node.resolve_dirname=node_modules module.system.node.resolve_dirname=custom_node_modules

    Flow 会依次在 node_modulescustom_node_modules 查找模块

  • module.ignore_non_literal_requires (boolean): 设置 true 的话,Flow 允许 require() 动态路径. 默认 false

  • module.file_ext (string): 默认, Flow 查找以 .js, .jsx, 和 .json 文件,通过这个配置改变默认规则

    例如配置:

    [options] module.file_ext=.foo module.file_ext=.bar

    于是 Flow 将默认检测 .foo.bar 扩展名的文件

  • module.use_strict (boolean): 如果你使用一个转换器给 每个模块的头部添加 "use strict"; 的话 就设置为 true ,默认 false

  • munge_underscores (boolean): 如果设置为 true,Flow会认为 类中以 _ 下划线开头的属性和方法都是私有的。这个功能要结合 jstransform的 ES6 class transform 使用,保证运行时也具有一样规则

  • server.max_workers (integer): Flow server 能启动 workder 最大数 默认, 用上各个 cpu.

  • traces (integer): 打开错误跟踪 (展示更多信息),指定层级. 消耗很大,默认禁用.

  • strip_root (boolean): 设置为 true 就会在错误信息中移除根目录字符串 可以通过命令参数行覆盖 flag --strip-root.

  • suppress_comment (regex): 定义一个神奇的注释,这样,他后面的代码就不会报错后面代码. 例如:

    suppress_comment= \\(.\\|\n\\)*\\$FlowFixMe

    匹配到下面的注释:

    // $FlowFixMe: 禁止下面报错 var x : string = 123;

    则会禁止报错. 如果后面的代码没错(描述部分是可以忽略的), 会给出 “Unused suppression” 错误

    提醒: 可以配置多条 suppress_comment 建议你这样定义 $FlowFixMe (表示需要解决的) $FlowIssue (Flow 内部错误,不用管).

  • temp_dir (string): Tell Flow which directory to use as a temp directory. Defaults to /tmp/flow. Can be overridden with the commandline flag --temp-dir.

  • esproposal.class_static_fields (enable ignore warn): 设置为

    enable 则 Flow 会根据草案解析静态 类成员。如果设置成 ignore 则 Flow 会忽略这类语法 (好比说:Flow 不会根据这个语法,然后去探测类上静态属性的存在). 默认是 warn, 只给一些警告, 毕竟这是个草案

  • esproposal.class_instance_fields (enable|ignore|warn): 设置为 enable 的话,则 Flow 会根据草案解析对象 成员 设置 ignore 则略这个语法 (好比说:Flow 不会根据这个语法,然后去探测类上对象属性的存在). 默认是 warn,只给一些警告, 毕竟这是个草案

  • esproposal.decorators (ignore|warn): 设置为 ignore 则 Flow 忽略 decorators 语法. 默认 warn, 只给一些警告, 毕竟这是个草案

  • esproposal.export_star_as (enable|ignore|warn): set this to enable 则 Flow 支持 export * as 语法,提案在 leebyron’s proposal. 设置 ignore 则略这个语法 默认是 warn,只给一些警告, 毕竟这是个草案

[version]#

可以在 .flowconfig 通过配置 [version] 指定 Flow 的版本

如果没有配置或者留白, 则允许任意版本. 如果配置了,但是运行的版本不匹配,就报错退出

例如你配置 .flowconfig 为

[version]
0.22.0

你运行 Flow 版本未 v0.21.0, 则报错

"Wrong version of Flow. The config specifies version 0.22.0 but this is version 0.21.0"

目前为止,我们提供下列方式为指定支持的版本

  • 明确的版本, (e.g. 0.22.0, which only matches 0.22.0).
  • 范围, (例如 >=0.13.0 <0.14.0 将 匹配 0.13.00.13.5,单步包括 0.14.0).
  • Caret 范围,下界:左起第一个非0数字升1,后面改为0
    • ^0.13.0 表示 >=0.13.0 <0.14.0
    • ^0.13.1 表示 >=0.13.1 <0.14.0
    • ^1.2.3" 表示 >=1.2.3 <2.0.0

注释#

注释从 v0.23.0 开始支持,例子:

# 这行是注释
   # 这行是注释
; 这行是注释
   ; 这行是注释

例子#

假设目录 mydir.flowconfig 文件,并且子目录如下:

otherdir
└── src
    ├── othercode.js
mydir
├── .flowconfig
├── build
│   ├── first.js
│   └── shim.js
├── lib
│   └── flow
├── node_modules
│   └── es6-shim
└── src
    ├── first.js
    └── shim.js

下面展示如何配置 .flowconfig

[include]
../otherdir/src

[ignore]
.*/build/.*

[libs]
./lib

现在 flow 包含检测根目录以外的一个文件夹, 忽略 build 目录和使用 lib 中的类型定义

← Prev Next →

You can edit this page on GitHub and send us a pull request!