"Module not found" 自动生成文件的流程错误

"Module not found" Flow error for autogenerated file

我有三个 ES2015 模块:store.jsmiddleware-config.js 和带有一些逻辑和导入的自动生成的 middleware-config-settings.js

当应用程序以 npm start 开始时,模块 middleware-config-settings.js 是从 webpack.config.js 生成的。

store.js:

// @flow
...
import middlewareConfigs from './middleware/middleware-config';
...

middleware-config.js:

// @flow
...
import defaultSettings from './middleware-config-settings';
...

模块 middleware-config-settings.js 很简单 JSON:

// @flow
export default {
  profilingMiddlewareConfig: {
    isActive: true,
  },
  reduxDiffStateMiddlewareConfig: {
    isActive: true,
    params: {
      ignoredActionTypes: [],
      approvedActionTypes: []
    }
  }
};

当我使用 flow 检查项目时,出现错误:

./middleware-config-settings. Required module not found

首先, 我尝试忽略该行的流程检查:

// @flow
...
// @FlowFixMe: ignore
import defaultSettings from './middleware-config-settings';
...

如果 middleware-config-settings.js 不存在,该方法工作正常。否则我会遇到另一个问题:在 npm start middleware-config-settings.js 文件创建后,下一个 flow 执行失败并出现另一个错误:

Error suppressing comment. Unused suppression

其次, 我尝试将 middleware-config.js 添加到 .flowconfig[ignore] 部分。但是后来我从 store.js:

收到了新的错误信息

./middleware/middleware-config. Required module not found

之后我也将 store.js 添加到 [ignore] 部分并且 flow 执行得很好,但我认为这是不正确的方式。

第三种方法 与第二种方法类似 - 我只是从 middleware-config.js 中删除了 // @flow 并且 flow 执行得很好。而且这种方法也不太好(我所有的模块都应该 flowed)。

所以我有两个问题:

  1. 如何才能在不从 flow 检查中排除任何文件的情况下无错误地执行 flow
  2. 为什么当我将 middleware-config.js 添加到 [ignore] 部分时出现关于 store.js 的错误?如果我对 documentation 的理解是正确的,那么这不是正确的行为:

    The [ignore] heading in a .flowconfig file tells flow to ignore files matching the specified regular expressions when type checking your code.

几个选项:

  • 避免自动生成文件(我假设您已经考虑过并决定反对)。
  • 创建一个包含原型配置的永久性 middleware-config-settings.js.flow,并将其签入版本控制。然后,Flow 将查看该文件而不是查找 .js 文件,它会进行类型检查,但实际值将在每个 运行 上生成。这种方法的主要缺点是确保 .js.flow 文件的结构在您进行更改时与生成的 .js 文件的结构相匹配。
  • 引入生成所需文件的显式构建步骤,而不是在 npm start 脚本中隐式包含该步骤。然后,只需确保 运行 在使用 Flow 之前构建步骤。

关于你的第二个问题,我相信如果你在 [ignore] 部分添加一些东西,Flow 只会假装它根本不存在。因此,如果您从已检查的文件中导入被忽略的文件,Flow 会报错。

我通过使用 require 导入 middleware-config-settings.js 并将模块名称存储在变量中(避免 Required module not found 错误)和添加 @FlowFixMe 来解决这个问题(为了避免 The parameter passed to require() must be a literal string. 错误):

let moduleName = './middleware-config-settings';
// @FlowFixMe: import autogenerated file.
let defaultSettings = (require(moduleName): any);