Node.js Web應用代碼熱更新

🙂實現思路:將啓動文件中的 router、proxy 文件分離出主文件,對分離出去的文件實現熱更新。關鍵問題點:node

  • 如何更新模塊代碼
  • 如何使用新模塊處理請求
  • 如何釋放老模塊的資源

如何更新模塊代碼

引入 chokidar 當監聽文件修改時,清除該模塊緩存,delete require.cache[path]git

如何使用新模塊處理請求

使用koa框架,app.use 操做會保存舊的 router.js 模塊,所以模塊更新了,請求依然會使用老模塊github

// 利用閉包的特性獲取最新的router對象,避免app.use緩存router對象
app.use((ctx, next) => router.routes()(ctx, next)).use(router.allowedMethods())

// 監聽文件修改從新加載代碼
const watcher = chokidar.watch(path.resolve(__dirname, '../www'), { ignored: /index\.js/ })
 watcher.on('ready', () => {
   logger.info(`will watching at '${path.resolve(__dirname, '../www')}`)
   watcher.on('all', (event, file) => {
     logger.info(`server-side hot-reload due to: ${file}`)
     Object.keys(require.cache).forEach((id) => {
       if (/\/www\//.test(id)) {
         cleanCache(id)
         try {
           if (file.endsWith('router.js')) {
             router = require('./router')
           }
           if (file.endsWith('proxies.js')) {
             proxies = require('./proxies')
           }
         } catch (ex) {
           console.error(`module ${file} update failed`)
         }
       }
     })
   })
 })

function cleanCache (module) {
   var path = require.resolve(module);
   delete require.cache[path];
}
複製代碼

如何釋放老模塊的資源

讓老模塊的代碼更新後,確保沒有對象保持了模塊的引用 ,Node.js 會自動爲全部模塊添加一個引用緩存

function cleanCache(modulePath) {
    var module = require.cache[modulePath];
    // remove reference in module.parent
    if (module.parent) {
        module.parent.children.splice(module.parent.children.indexOf(module), 1);
    }
    require.cache[modulePath] = null;
}
複製代碼

解決了 koa 熱更新問題。閉包


附上github: github.com/Jarryxin/mp…app


參考: fex.baidu.com/blog/2015/0…框架

相關文章
相關標籤/搜索