2016-12-27 33 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