资讯专栏INFORMATION COLUMN

flow从零开始----安装和配置

KoreyLee / 3099人阅读

摘要:资源官网安装参考什么是是一个弱类型的解释性语言,无法在编译环节进行静态类型校验,如果想也具备静态类型检查功能。那就得使用到由推出,官网是。

资源

官网:https://flow.org/

安装:https://flow.org/en/docs/inst...

参考:https://www.01hai.com/note/av... https://www.jianshu.com/p/868e0fe373ed

什么是Flow

JavaScript是一个弱类型的解释性语言,无法在编译环节进行静态类型校验,如果想JS也具备静态类型检查功能。那就得使用到Flow,Flow由Facebook推出,官网是 https://flow.org/。Flow与微软的TypeScript有些类似,但TypeScript其实像是另一门新语言,而Flow可以理解为一个工具,象vue2、react等都是基于Flow开发,所以很有必要了解一下Flow。

安装Flow

安装方法:npmyarn两种,yarn为facebook出品,现在好象更流行一些
安装方式:全局安装 yarn global add flow-bin
安装过程:

$ yarn global add flow-bin
yarn global v1.12.3
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Installed "flow-bin@0.89.0" with binaries:
      - flow
Done in 6.32s.

安装位置:

$ yarn global bin
C:UsersAdministratorAppDataLocalYarnin
# 注意:npm全局安装位置是C:UsersAdministratorAppDataRoaming
pm
# 注意:请将...Yarnin目录添加到系统全局变量path中

cli命令说明:

$ flow --help  # 查看帮助信息
# flow 命令,实际上是调用的是C:UsersAdministratorAppDataLocalYarnDataglobal
ode_modulesflow-binflow-win64-v0.89.0flow.exe,不同操作系统调用的是不同的执行文件
配置

工作目录:切换到项目根目录,我的是F:youshengyouselearn-flow
配置flow: 命令是$ flow init,它会在当前目录下生成一个.flowconfig文件,内容如下

[ignore]

[include]

[libs]

[lints]

[options]

[strict]
Flow注释JS文件

凡加Flow注释的文件,以下称flow文件,flow文件就是将// @flow/* @flow */加到js文件的最顶部。只有flow文件,flow进程才会在后台监视这些文件,当有类型检查时,有错误它就会报错
准备第1个js文件: 内容如下

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

square("2")

执行 flow check,报错如下:

$ flow check
Error ---------------------------------------------------------------------------- a.js:6:8

Cannot call `square` with `"2"` bound to `n` because string [1] is incompatible with number [2].

   a.js:6:8
   6| square("2")
             ^^^ [1]

References:
   a.js:2:19
   2| function square(n:number): number {
                        ^^^^^^ [2]

Found 1 error

square("2")改为square(2)flow check看下

$ flow check
Found 0 errors

或者将// @flow去掉,都会提示Found 0 errors

Flow服务器

启动: flow status
停止: flow stoop

删除flow类型标注

function square(n:number): number {中的类型标注,如:number,含有这样的js文件,事实上运行起来会报错的,不论是在nodejs还是浏览器中,现在在nodejs中运行测试下

$ node a.js
F:youshengyousedela.js:2
function square(n:number): number {
                 ^

SyntaxError: Unexpected token :
    at new Script (vm.js:79:7)
    at createScript (vm.js:251:10)
    at Object.runInThisContext (vm.js:303:10)
    at Module._compile (internal/modules/cjs/loader.js:657:28)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
    at startup (internal/bootstrap/node.js:283:19)

将两个:number去掉再测试下,不会报错。所以说flow文件是两个过程,编程时加上类型检查,最后成品代码中,得将所有的类型约束要去掉,去掉这个过程肯定不能人工操作,有相应的程序处理。目前有两个方法去掉类型注解,一是包flow-remove-types,二是在babel中去掉

方法一:flow-remove-types
官方文档:https://flow.org/en/docs/tool...

安装

# 如果没有package.json文件,先生成
yarn add --dev flow-remove-types
# or
npm install --save-dev flow-remove-types

去类型

# 为了方便,先将a.js移到src目录下
$ yarn run flow-remove-types src/ -d dist/
yarn run v1.12.3
$ F:youshengyousedel
ode_modules.binflow-remove-types src/ -d dist/
srca.js
 ↳ dista.js
Done in 0.30s.

去类型前

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

square(2)

去类型后

//      
function square(n       )         {
    return n * n;
}

square(2)
方法二:Babel的预置babel-preset-flow

安装

yarn add --dev babel-cli            # 凡需要在命令行执行babel,得安装babel-cli
yarn add --dev babel-preset-flow    # 目的就是去除类型

提示: babel在没有配置时,也不认识类型,也会报错,如没有配置就转码,会报错如下

$ ./node_modules/.bin/babel src -d dist
SyntaxError: src/a.js: Unexpected token, expected , (2:17)
  1 | // @flow
> 2 | function square(n:number): number {
    |                  ^
  3 |     return n * n;
  4 | }
  5 |

现在配置预置看下,新建配置文件 .babelrc,内容如下

{
  "presets": ["flow"]
}

再执行

$ ./node_modules/.bin/babel src -d dist
srca.js -> dista.js

没有报错,打开dist/a.js看下,内容如下

function square(n) {
    return n * n;
}

square(2);

类型约束全部去掉了。查看flow预置源码,其实它只是包装了@babel/plugin-transform-flow-strip-types这个插件而已,干活的是这个插件,打开源码,其实比较好理解,就是删除// @flow类型

类型自动检查

上面使用flow check来进行类型检查,不是很方便,我想babel的插件来进行类型检查,并在编辑器如vs code中自动检查,这样效率就会高很多,这就要用到插件babel-plugin-typecheck,它与预置flow的功能完全不一样,babel-plugin-typecheck是检查代码中的类型是否有错,babel-preset-flow是负责删除类型的,这样js代码在执行时就好象从来没有加过类型一样。

在vs code中配置类型

VS Code中搜索flow,发现有vscode-flow-ide、Flow-Language-Support两个插件,在这里以vscode-flow-ide为例
先安装vscode-flow-ide
条件:

项目根目录有配置文件.flowconfig

nodejs添加到了环境变量path中

全局或项目内安装了flow,推荐全局安装flow-bin

配置(默认就行)
VS Code左下角管理/设置/User Settings/Extensions/Flow-IDE Configurations(只有启用后才能配置,否则找不到这项),下面是文字版,实际上在面板中就可以设置

flowide.enable: 启用/关闭

flowide.pathToFlow: Absolute path to the Flow executable. Set it only if the default behaviour of the extension doesn"t work out for you. The extension will try first to read it from local node_modules/flow-bin or globally if not otherwise set here.

flowide.useCodeSnippetsOnFunctionSuggest - Add the function paramters when selecting a function to autocomple.

重启vs Code,就会发现可以报错了,现在可以去掉顶部的// @flow及传递不合要求的参数测试下。

如果在problem窗口有错误,[ts]"types" can only be used in a .ts file. 8010,请在扩展中找到typescript,找到"javascript.validate.enable": false

总结:

类型检查尽量在编辑器中设置

删除类型尽量在babel中自动完成

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/100755.html

相关文章

  • CI Weekly #3 | 关于微服务、Docker 实践与 DevOps 指南

    摘要:围绕软件工程效率提升进行一系列技术内容分享,包括国内外持续集成持续交付,持续部署自动化测试等实践教程工具与资源,以及一些工程师文化相关的程序员。划分了数据库日志安全监控配置管理云服务等个大类,个工具。 CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成、持续交付,持续部署、自动化测试、 DevOps 等实践教程、工具与资源,以及一些工程师文化相关...

    monw3c 评论0 收藏0
  • vue2.0项目配置flow类型检查

    摘要:在的项目中加入类型检查。当前项目是用写的,当项目越来越大,由于弱类型的特性,相比这种强类型的语言而言,后期维护会越来越困难。为了解决这个问题,决定使用加入类型检查。一了解是公布的静态类型检查器。中配置配置,使其支持语法。 在vue2.0的项目中加入flow类型检查。当前项目是用js写的,当项目越来越大,由于js弱类型的特性,相比ts(typescript)这种强类型的语言而言,后期维护...

    Rocko 评论0 收藏0
  • 深度学习

    摘要:深度学习在过去的几年里取得了许多惊人的成果,均与息息相关。机器学习进阶笔记之一安装与入门是基于进行研发的第二代人工智能学习系统,被广泛用于语音识别或图像识别等多项机器深度学习领域。零基础入门深度学习长短时记忆网络。 多图|入门必看:万字长文带你轻松了解LSTM全貌 作者 | Edwin Chen编译 | AI100第一次接触长短期记忆神经网络(LSTM)时,我惊呆了。原来,LSTM是神...

    Vultr 评论0 收藏0
  • 深度学习

    摘要:深度学习在过去的几年里取得了许多惊人的成果,均与息息相关。机器学习进阶笔记之一安装与入门是基于进行研发的第二代人工智能学习系统,被广泛用于语音识别或图像识别等多项机器深度学习领域。零基础入门深度学习长短时记忆网络。 多图|入门必看:万字长文带你轻松了解LSTM全貌 作者 | Edwin Chen编译 | AI100第一次接触长短期记忆神经网络(LSTM)时,我惊呆了。原来,LSTM是神...

    cncoder 评论0 收藏0
  • 深度学习

    摘要:深度学习在过去的几年里取得了许多惊人的成果,均与息息相关。机器学习进阶笔记之一安装与入门是基于进行研发的第二代人工智能学习系统,被广泛用于语音识别或图像识别等多项机器深度学习领域。零基础入门深度学习长短时记忆网络。 多图|入门必看:万字长文带你轻松了解LSTM全貌 作者 | Edwin Chen编译 | AI100第一次接触长短期记忆神经网络(LSTM)时,我惊呆了。原来,LSTM是神...

    BicycleWarrior 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<