如何破解@providesModule缓存

时间:2016-12-27 03:35:41

标签: javascript webpack

我正在构建一个将存在于AWS Lambda中的REST API。我正在使用apex来部署它,因为我在javascript中实现它,所以我使用webpack和babel来获取我的ES6 +好东西。我发现@providesModule名称存在问题,但我无法解决这个问题。

我刚刚创建了一个新的lambda函数,当我编译它时,我可以从输出中看到无法找到一个模块 - 但另一个模块可以。这是文件系统的草图:

functions
   ├─ database.js        @providesModule Database -- this works
   ├─ configuration.js   @providesModule MyConfig -- this does not work
   ├── entity-post
          ├── index.js   imports both 'Database' & 'MyConfig'

当我编译lambda时,输出表明MyConfig依赖关系无法解析,但Database可能是。{1}}。我尝试用死简单代码替换configuration.js的内容,以防解析基本解析错误失败;没运气。我应该补充说,我在同一个使用类似导入的项目中有5个其他lambda函数,它们都运行良好。

我认为这是某种缓存问题:模块解析系统没有注意到@providesModule内的configuration.js

如何清除缓存?就此而言,哪一款软件甚至可以处理这些决议?我已经尝试过在线查看,但是不清楚@providesModule的识别是webpack事物,还是babel事物,webpack-babel-loader事件,或者只是节点v5事件。

我已经在网上和项目的代码库中进行了大量的挖掘工作。这是我学到的东西:

您在网上看到的关于@providesModule的几乎所有链接都是关于反应或反应原生的项目。这是因为Facebook的工具 - 特别是HasteMap(我认为),反应原生包装套件的一部分 - 明确增加了对@providesModule的支持。我的项目既不反应也不反应原生,并且它在构建过程中不使用任何Facebook工具。我的项目使用webpack v1.14和babel v6.22来构建源代码。

我在webpack的源代码中找到了错误消息,./node_modules/webpack/lib/dependencies/WebpackMissingModule.js

exports.moduleCode = function(request) {
    return "var e = new Error(" + JSON.stringify("Cannot find module \"" + request + "\"") + "); " +
        "e.code = 'MODULE_NOT_FOUND'; " +
        "throw e;";
};

Webpack似乎有一个术语,用于以这种方式声明模块名称的脚本:'Labeled Modules'。 webpack的源代码中有几个脚本处理标记的模块,但我无法确定识别模块中标签的代码。我的假设是,填充模块注册表的系统部分存在问题,我发现的标记模块代码似乎都与访问(已填充的)模块有关。注册表中。

很难在webpack的源代码中进一步追踪这一点,这可以理解为非常元,并且分布在bajillion文件中。

任何有关此问题的帮助,或者指向显示如何处理@providesModule的相关文档或框架代码的链接,我们表示赞赏。我想了解为什么我的新模块没有解决,所以我可以解决这个问题。如果我的缓存理论偏离基础,那很好。

1 个答案:

答案 0 :(得分:0)

这对大多数人来说可能并不令人感到意外,但是webpack并没有(目前)尊重@providesModule指令。

它出现的原因似乎是webpack似乎在进行文件名比较时扁平化,而且我的文件名通常与我给它们的标签相匹配:

  • database.js == @providesModule Database
  • assemble.js == @providesModule Assemble

我遇到麻烦的原因是configuration.js!= @providesModule MyConfig

这也意味着我原来问的问题是非基础的,因为我认为解决方案失败了,因为标签被缓存,而事实上标签被忽略了。 Facebook的HasteMap确实可以使用缓存,但它不是罪魁祸首。