🙂實現思路:將啓動文件中的 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