1. 程式人生 > >Nodejs 程式碼熱更新實現

Nodejs 程式碼熱更新實現

實現原理:利用node file system模組的watch介面監視資料夾的檔案變更事件事件觸發後,移除require.cache內的對應的快取使用vm模組編譯新載入的程式碼(基礎檢查語法,後續可在vm content內測試執行)成功後 使用require載入程式碼,新程式碼就會快取在 require.cache內如果失敗 恢復require.cache的快取資料程式碼如下:

const fs =require("fs");const path =require("path");const vm =require("vm");const handlerMap ={};const cacheMap 
={};/** * 載入檔案內的程式碼並監視更新熱載入 * [@return](/user/return) {Promise.<void>} */const loadHandlers = async function(){/// 檢視指定資料夾下的所有檔案const files = await newPromise((resolve, reject)=>{ fs.readdir(path.join(__dirname,'hots'),function(err, files){if(err){ reject(err);}else{ resolve
(files);}});});/// 遍歷載入檔案for(let f in files){if(/.*?\.js$/.test(files[f])){ handlerMap[files[f]]= await loadHandler(path.join(__dirname,'hots', files[f]));}}/// 監視檔案變動 watchHandlers();};/** * 監視檔案變動 */const watchHandlers =function(){ console.log('watching ', path.join(__dirname,'hots')); fs.watch(
path.join(__dirname,'hots'),{recursive:true},function(eventType, filename){if(/.*?\.js$/.test(filename)){/// 這裡先刪除舊的快取程式碼 防止記憶體洩漏if( cacheMap[require.resolve(path.join(__dirname,'hots', filename))])delete cacheMap[require.resolve(path.join(__dirname,'hots', filename))];/// 這裡快取現在執行的程式碼,熱載入失敗後恢復用,還有就是防止現有執行的程式碼非同步沒有返回就刪除會因為邏輯可能沒有執行完畢引起邏輯bug cacheMap[require.resolve(path.join(__dirname,'hots', filename))]=require.cache[require.resolve(path.join(__dirname,'hots', filename))];///重置require.cache快取require.cache[require.resolve(path.join(__dirname,'hots', filename))]=null; loadHandler(path.join(__dirname,'hots', filename)).then(function(data){if(data){ handlerMap[filename]= data;}else{delete handlerMap[filename];} console.log("熱更成功", filename,"當前程式碼", handlerMap);}).catch(function(err){ console.log("熱更失敗: 程式碼包含以下錯誤:", err,"當前程式碼:", handlerMap);require.cache[require.resolve(path.join(__dirname,'hots', filename))]= cacheMap[require.resolve(path.join(__dirname,'hots', filename))]; cacheMap[require.resolve(path.join(__dirname,'hots', filename))]=null;});}});};/** * 載入檔案 * [@param](/user/param) filename * [@return](/user/return) {Promise.<*>} */const loadHandler = async function(filename){const exists = await newPromise(resolve =>{/// 檢視程式碼檔案是否存在 fs.access(filename, fs.constants.F_OK | fs.constants.R_OK, err =>{if(err){ resolve(false);}else{ resolve(true);}});});if(exists){return await newPromise((resolve, reject)=>{ fs.readFile(filename,function(err, data){if(err){ resolve(null);}else{try{/// 使用vm script編譯熱載入的程式碼new vm.Script(data);//const script = new vm.Script(data);// const context = new vm.createContext({// require: require,// module: {}// });// script.runInContext(context);}catch(e){/// 語法錯誤,編譯失敗 reject(e);return;}/// 編譯成功的程式碼 resolve(require(filename));}});});}else{/// 檔案被刪除returnnull;}}; loadHandlers().then(function(){ console.log("run...");}).catch(function(e){ console.error(e);});

注意:使用這種方法被管理熱更新的程式碼 不能使用全域性的require的去單獨載入,如果不想統一管理 去除handleMap變數快取,在每一處使用被管理的程式碼時 使用require獲取程式碼(require會先從快取內檢查,然後才會去找檔案載入)

相關推薦

Nodejs 程式碼更新實現

實現原理:利用node file system模組的watch介面監視資料夾的檔案變更事件事件觸發後,移除require.cache內的對應的快取使用vm模組編譯新載入的程式碼(基礎檢查語法,後續可在vm content內測試執行)成功後 使用require載入程式碼,新

nodeJs 程式碼更新

在開發node過程中,每次修改程式碼都需要重新啟動服務,是一件很抓狂的事情 使用nodemon熱載入可以幫我們很好的解決這一問題 1. 安裝 npm install nodemon -g 2. 修改npm啟動項 "scripts": { "start": "nodemon

C++結合LUA實現程式碼更新

    最近寫一個檔案伺服器,是用C++寫的,功能基本都實現了,老大提到一個問題就是如果要往伺服器增加一個功能,那就得重新編譯程式,對於伺服器這7*24的執行程式是行不通的. 所以自己結合指令碼語言LUA實現了一個簡單的熱更新模板. 程式是這樣的. 主程式用C++實現,負責

Unity3D更新之LuaFramework篇[09]--資源更新程式碼更新的具體實現

前言 在上一篇文章 Unity3D熱更新之LuaFramework篇[08]--熱更新原理及熱更伺服器搭建 中,我介紹了熱更新的基本原理,並且著手搭建一臺伺服器。 本篇就做一個實戰練習,真正的來實現熱更新功能。 一、準備工作 1、製作一個用於熱更新的介面 此前我製作了

electron 更新實現方式

1、electron是一個外殼  +  html+js+css(資料包) 按照官方的邏輯,採用electron-builder的時候 會直接打包成asar  如果單單是打包html檔案也就算了,關鍵裡面還打包的node-module 整整100MB 

程式碼更新,本地服務

web前端的頁面以html為主,本地開啟html渲染伺服器。本文章內容建立在電腦上已安裝node的情況下。 1、http-server伺服器 npm i http-server -g 全域性安裝http-server 在專案根目錄,開啟cmd命令列,輸入http-se

C#單個程式集程式碼更新

有的時候我們想更新我們正在執行中的程式碼,而不想軟體重啟。  微軟提供的標準方法是通過應用程式域來實現程式碼熱更新,意思就是說,把自己想要進行熱更新的程式碼放到另外一個應用程式域中,在檢測到程式碼需要變更的時候,解除安裝掉那個程式域然後重新載入來實現程式碼熱更新。按照微軟

unity之程式碼更新

1,程式碼熱更新是解決什麼問題的? 縮短使用者取得新客戶端的流程,改善使用者體驗。 沒熱更新: 下載app--》安裝--》啟動--》等待載入--》玩 有熱更新: 啟動--》等待熱更新--》等待載入--

Android更新實現原理

最近Android社群的氛圍很不錯嘛,連續放出一系列的Android動態載入外掛和熱更新庫,這篇文章就來介紹一下Android中實現熱更新的原理。 ClassLoader 我們知道Java在執行時載入對應的類是通過ClassLoader來實現的,Clas

Unity程式碼更新解決方案測試結果總結

這幾天一直在研究熱更新方案 主要思路是: 1.先將程式碼打包成dll,然後用unity 打包成assetsbundle, 2.WWW載入進入主程式, 3使用System.Reflection.Assembly來建立程式集, 4.然後通過GetType(className)

【Ionic】Ionic實現iOS與Android端程式碼更新』與Android升級下載功能 ( v1.3.x版本 )

熱更新的好處 通常ionic原始碼可包括(HTML,JavaScript,CSS檔案和其他資源),往常我們必須通過提交程式到應用市場,經過漫長的稽核後才可讓使用者更新,每改動一個小地方都需要重新打新版本。 現在ionic通過使用cordova外掛cordov

webpack-dev-middleware 和 webpack-hot-middleware 實現express全棧更新

express 自動刷新 你在 fig evm inf targe target ddl 場景: node server.js 啟動後端服務器。 npm run dev 啟動前端服務器。 當你需要node的express框架和webpack結合的時候,就會用到題上的

nodejs更新

介紹 nodejs 服務 我們 開發 png 一個 clas code 如果你有 PHP 開發經驗,會習慣在修改 PHP 腳本後直接刷新瀏覽器以觀察結果,而你在開發 Node.js 實現的 HTTP 應用時會發現,無論你修改了代碼的哪一部份,都必須終止Node.js 再

用ECMAScript4 ( ActionScript3) 實現Unity的更新 -- 在腳本中使用MonoBehaviour

blog 腳本 tool urn 技術 build 右鍵 lan www. 繼上次分析了熱更新的Demo後,這次來介紹如何在熱更新代碼中使用MonoBehaviour。 MonoBehaviour掛載到GameObject對象上的腳本的基類。平常Unity開發時,簡單的做法

用ECMAScript4 ( ActionScript3) 實現Unity的更新 -- 使用原型鏈和EventTrigger

rip sta untiy poi lib stat package 匿名 對象 原型鏈是JS的必備,作為ECMAScript4,原型鏈也是支持的。 特別說明,ActionScript3是支持完整的面向對象繼承支持的,原型鏈只在某些非常特殊的情況下使用。 本文旨在介紹如何使

用ECMAScript4 ( ActionScript3) 實現Unity的更新 -- 使用FairyGUI (二)

src class 測試 資源 isp ola 物體 ddp onclick 上次講解了FairyGUI的最簡單的熱更新辦法,並對其中一個Demo進行了修改並做成了熱更新的方式。 這次我們來一個更加復雜一些的情況:Emoji. FairyGUI的 Example 04

Android 手動實現更新

前言 在上篇Android ClassLoader淺析中我們分析了安卓ClassLoader和熱更新的原理,這篇我們在上篇熱更新分析的基礎上寫個簡單的demo實踐一下。 概述 我們先回顧下熱更新的原理 PathClassLoader是安卓中預設的類載入器,載入類是通過fi

用ECMAScript4 ( ActionScript3) 實現Unity的更新 -- 更新Live2D

ini dma public lin img uil edi package module live2D是一個很強大的2D動畫組件。我們可以使用AS3腳本對它進行熱更新。 live2D在Unity中的使用請看這裏: 如何獲取Live2D 總得來說,我們可以先去live

nodejs學習(二)--express更新nodemon,自啟動項目

nbsp res 自啟 -- dev code nod 沒有效果 情況 一、說一下   每次修改文件,我們都需要重啟服務器npm start,很麻煩,所以使用引入nodemon插件,解決這個問題,實現保存文件,即自啟動刷新項目 二、直接開碼    npm install

ionic4.0 詳細更新 自動模式以及手動模式--秒殺網上一切更新因為網上沒有手動更新的詳細程式碼 測試無誤上線釋出了的東西.

ionic4.0 詳細熱更新 自動模式以及手動模式(全)–純手打,獨一無二,絕對好用. 網上一大堆ionic 熱更新,但是都是說的最基本的自動更新操作,安裝幾個外掛,改幾個配置檔案,就草草了事,讓我真的很煩躁,通過自己不斷的查詢,終於守得雲開見月明,找到了手動