【问题标题】:"Module not found" Flow error for autogenerated file自动生成文件的“未找到模块”流错误
【发布时间】:2017-01-12 14:01:19
【问题描述】:

我有三个 ES2015 模块:store.js、middleware-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.找不到所需的模块

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

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

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

禁止评论时出错。未使用的抑制

其次,我尝试将middleware-config.js 添加到.flowconfig 的[ignore] 部分。但后来我收到了来自store.js 的新错误消息:

./middleware/middleware-config.找不到所需的模块

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

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

所以我有两个问题:

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

    .flowconfig 文件中的 [ignore] 标题告诉 flow 在检查代码时忽略匹配指定正则表达式的文件。

【问题讨论】:

    标签: javascript ecmascript-6 flowtype es6-modules


    【解决方案1】:

    几个选项:

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

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

    【讨论】:

    • 感谢您的回答! 1. 我必须生成那个文件。 2. 该文件仅在不存在时才创建,然后每个用户都可以使用自己的值对其进行编辑(我真的不想再创建一个假文件) 3. 这比我想做的要难一些。我用另一种方法解决它。
    【解决方案2】:

    我通过导入middleware-config-settings.js 和require 并将模块名称存储在变量中(为了避免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);
    

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 2018-12-01
      • 1970-01-01
      • 2016-03-24
      • 2017-05-18
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 2018-11-05
      相关资源
      最近更新 更多