高级配置
本节讨论一些高级配置用来定制 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
的时候,检测文件包括:
/path/to/root/
(自动包含)/path/to/externalFile.js
/path/to/externalDir/
/path/to/otherProject/
下所有以.js
结尾的文件/path/to/otherProject
下任意名为coolStuff/
的目录
[ignore]
#
.flowconfig
文件的 [ignore]
一栏,用来告诉 flow
哪些文件不需要检测,
路径匹配使用正则表达式。当然,默认为空,就是都得检测嘛
Things to keep in mind:
- 这是 OCaml 正则表达式.
- 这些正则表达式匹配的绝对路径. 通常应该以
.*
开头 [ignore]
在[include]
之后, 如果同时 include 和 ignore 同个路径,那么就会 ignore
一个 [ignore]
的例子大概长这样:
[ignore]
.*/__tests__/.*
.*/src/\(foo\|bar\)/.*
.*\.ignore\.js
该 [ignore]
配置表示忽略:
- 所有名为
__tests__
目录下的目录和文件 - 所有 …
.*/src/foo
或.*/src/bar
下 … - 所有以
.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
): 使用哪种模块系统解析import
和require
. 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_modules
和custom_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 toenable
则 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 matches0.22.0
). - 范围, (例如
>=0.13.0 <0.14.0
将 匹配0.13.0
和0.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
中的类型定义
You can edit this page on GitHub and send us a pull request!