2016-12-27 64 views
0

我正在构建将存在于AWS Lambda中的REST API。我使用apex来部署它,因为我正在使用JavaScript实现它,所以我使用webpack和babel来获得我的ES6 +好吃的东西。我发现了一个与@providesModule名称有关的问题,我无法解决此问题。如何突破@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' 

当我编译拉姆达,输出指示MyConfig依赖不能得到解决,但Database可能。我试过用死简单的代码替换configuration.js的内容,以防在解析失败时出现基本的分析错误;没有运气。我应该补充说,我在同一个项目中有5个使用类似导入的lambda函数,并且它们都很好。

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

如何清除缓存?对于这个问题,哪一部分软件甚至可以处理这些解决方案?我尝试过在网上寻找,但是不清楚@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似乎对以这种方式声明模块名称脚本的一个术语:“标记模块”。 webpack源代码中有几个脚本处理带标签的模块,但我无法确定识别模块中标签的代码。我的假设是问题存在于填充模块注册表的系统部分,并且我发现的标记模块代码似乎都与访问(已填充的)注册表中的那些模块有关。

很难在webpack的源代码中进一步追踪这些内容,这很可理解,并且分布在bajillion文件中。

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

+0

我假设你正在使用[fbjs](https://www.npmjs.com/package/fbjs)。我对吗? –

+0

@fumi_hwh不是。 “我的项目既没有反应也没有反应,并且在构建过程中没有使用任何Facebook工具。”没有找到结果。 -iname“* fbjs *”'。 – Tom

+0

然后我不明白你如何使用'@ providesModule'。也许问题是为什么'import'Database''工作。 –

回答

0

这可能不会让大多数人感到意外,但是webpack不会(当前)授予@providesModule指令。

看起来,虽然它做的原因是,似乎的WebPack做文件名比较时趋于平缓的情况下,我的文件名通常匹配我给他们的标签:

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

我陷入困境的原因是,configuration.js!= @providesModule MyConfig

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

+0

然后你会使用fbjs吗?使用@providesModule会很方便,但是现在我不知道如何使它与Webpack一起工作。 – jrwm

+0

@jrwm不,我不会使用'fbjs'。我很想添加对webpack的支持,但我不确定它在这方面的行为可以通过现有的定制进行修改。现有的“解析器”引擎假定解析是将输入字符串与一组文件路径匹配的问题。看起来,做这项工作需要扫描监视树中的每个文件中的“@ providesModule”声明,然后在自定义解析器可以访问的地方注册找到的别名。可悲的是,我发现WP的组织太模糊,无法做出尝试。 – Tom