2

Webpack熱重載(webpack-hot-middleware)爲客戶提供了極大的幫助;它會在文件發生更改時重建和更新客戶端上的資產。但對於服務器需要預渲染HTML響應的通用/同構服務器來說,這非常困難。webpack - 在服務器上重新加載熱模塊

天真的解決方案是重新啓動(例如,用nodemon)每當一個文件被改變的服務器,但是這將關閉所有的客戶端連接,並且對於大的服務器,這是非常慢的。

一個稍微好一點的解決方案是手動觀看資產(例如用chokidar),並且一旦文件被更改清除緩存/再次需要。但是當需要監視依賴性時,這需要額外的複雜性;文件必須被解析以確定他們需要什麼。

此外,如果代碼庫是用編譯到JS語言,最好是運行生產編譯服務器中(沒有更多的巴貝爾節點)。與編譯服務器,它不再能夠使用上述機制,這是因爲:

  • 的WebPack具有用於動態差支持需要:require(variable)而非require('./file.js')
  • 節點本身不能要求代碼

就我而言,我已經中提取出需要的功能放入使用babel-register版需要一個包(我以前使用的通天API,但它依賴於大量的無證節點源)。

這是我目前在https://github.com/edge/cyc,其中有些作品使用該解決方案,但它是雜亂無章,有很多需要注意的地方。一般來說,與webpack並行寫入的定製代碼越多,越偏離期望的行爲。

有沒有一個更強大的方法來更容易地複製webpack的行爲?

回答

1

我寫了一個package這可能會有所幫助。您可以在您的服務器代碼中使用if (module.hot) {...}

簡而言之,在一個webpack配置中,這個function創建一個服務器作爲分叉進程。如果源文件發生變化,webpack會重新編譯並向子進程發送一個信號。在您的服務器代碼中,您可以包含if (module.hot) {... module.hot.accept(...) ...}以接受或拒絕更新。

但是,如果您接受更新,請記住刪除所有可能的副作用。如果拒絕,服務器將重新啓動。

我仍然在學習......希望這有助於

相關問題