Nodejs代码热更新
Nodejs代码热更新
实现原理 使用代理的方式让所有类和实例能够在js文件更改后, 对被代理对象进行替换, 实现热更新.
作用 使用这个模块引入的js文件, 在修改后不需要重启服务器, 可以达到下列效果:
- require.cache更新了, 新的require使用新的js
- 原来旧的类对应的实例也更新了 具体就是: 绑定在prototype下的函数, 绑定在类上的函数等也更新了, 旧实例调用的是新的代码.
注意
- 因为代理会消耗一定资源, 所以建议只在逻辑js上使用.
- 目前建议开发环境中用, 因为还在完善
安装
npm install hot-require
引入
// app启动时候引入这个模块, 引入一次即可
require('hot-require');
示例
// 需要热更新js, 用下面方式代替原有的require函数
var yourJs = _require(__dirname, '[your js path]');
源码 github: https://github.com/rayosu/hot-require 欢迎大家给意见, 完善和扩展这个方案.
Nodejs代码热更新
实现原理
使用代理的方式让所有类和实例能够在JS文件更改后, 对被代理对象进行替换, 实现热更新。
作用
使用这个模块引入的JS文件,在修改后不需要重启服务器,可以达到以下效果:
require.cache
更新了,新的require
使用新的JS。- 原来的旧类对应的实例也更新了。具体来说,绑定在原型链下的函数、绑定在类上的函数等都更新了,旧实例调用的是新的代码。
注意
- 因为代理会消耗一定资源,所以建议只在逻辑JS上使用。
- 目前建议开发环境中使用,因为还在完善中。
安装
npm install hot-require
引入
// app启动时候引入这个模块,引入一次即可
require('hot-require');
示例
假设你有一个需要热更新的JS文件 example.js
,你可以使用 _require
函数来代替原来的 require
函数。
// 需要热更新的JS文件,用下面方式代替原有的require函数
const exampleModule = _require(__dirname, './example');
console.log(exampleModule.sayHello()); // 输出 "Hello, World!"
// 修改 example.js 文件中的 sayHello 函数
// 例如:将 'Hello, World!' 改为 'Hello, Hot Reload!'
在这个例子中,当你修改并保存 example.js
文件时,_require
会重新加载该模块,并且所有的变化都会反映到已存在的实例中。
源码
该项目托管在 GitHub 上: hot-require
欢迎大家给意见,完善和扩展这个方案。
通过这种方式,你可以显著提高开发效率,特别是在需要频繁修改代码的场景下。
看上去实现非常简单啊,有不少热更新的框架都比你这个要复杂。。。
Chrome 的 Workspace 功能也实现了 JS 的热替换
支持绑定在prototype下的函数变动的热更新, 并且不影响初始化后的实例对象的属性值
不太懂…
我理解热更新,就是不缓存到Module.cache 那么可以直接在需要的地方删除缓存
var some_thing = require('some_need_hot_require')
// delete cache
var Module = module.constructor
var filename = Module._resolveFilename(‘some_need_hot_require’,module)
delete Module._cache[filename]
可以封装一个方法 module.require
/*
require -> Module.prototype.require -> Module.load(request,module)
require.reslove -> Module._resolveFilename(request, module);
*/
var Module = module.constructor
Module.prototype._require = function(request) {
var res = this.require(request)
// delete cache
var filename = Module._resolveFilename(request, this);
delete Module._cache[filename]
return res;
};
需要热加载,使用 module.require(xxx) 即可,可以使用任何在 require 里面使用的东西 …
完整代码见gist https://gist.github.com/magicdawn/5d6f53e1d3020cec112f
有新版本了, 解决了一个bug, 原来以为是对动态return对象的实现有问题, 后来发现是我忘记了对非prototype绑定函数忘记了return~~~
Node.js 代码热更新
实现原理
热更新通过代理的方式,使得在 JavaScript 文件更改后,能够动态地替换类和实例,从而无需重启服务器即可加载最新的代码。
作用
使用这个模块引入的 JS 文件,在修改后无需重启服务器即可达到以下效果:
require.cache
更新了,新的require
使用新的 JS 文件。- 原有的旧类对应的实例也更新了,包括绑定在原型下的函数和类上的函数,旧实例调用的是新的代码。
注意事项
- 由于代理会消耗一定的资源,建议仅在逻辑 JS 文件中使用。
- 目前建议仅在开发环境中使用,因为该方案还在不断完善中。
安装
npm install hot-require
引入
在应用启动时引入这个模块,只需一次:
require('hot-require');
示例代码
需要热更新的 JS 文件,可以用 _require
函数替代原有的 require
函数:
const _require = require('hot-require')._require;
// 引入需要热更新的JS文件
var yourJs = _require(__dirname, './your-js-file');
console.log(yourJs.someFunction()); // 输出最新代码的结果
源码
源码可以在 GitHub 上找到:
欢迎提出意见、完善和扩展这个方案。