Nodejs代码热更新

Nodejs代码热更新

实现原理 使用代理的方式让所有类和实例能够在js文件更改后, 对被代理对象进行替换, 实现热更新.

作用 使用这个模块引入的js文件, 在修改后不需要重启服务器, 可以达到下列效果:

  1. require.cache更新了, 新的require使用新的js
  2. 原来旧的类对应的实例也更新了 具体就是: 绑定在prototype下的函数, 绑定在类上的函数等也更新了, 旧实例调用的是新的代码.

注意

  1. 因为代理会消耗一定资源, 所以建议只在逻辑js上使用.
  2. 目前建议开发环境中用, 因为还在完善

安装 npm install hot-require

引入 // app启动时候引入这个模块, 引入一次即可 require('hot-require');

示例 // 需要热更新js, 用下面方式代替原有的require函数 var yourJs = _require(__dirname, '[your js path]');

源码 github: https://github.com/rayosu/hot-require 欢迎大家给意见, 完善和扩展这个方案.


6 回复

Nodejs代码热更新

实现原理

使用代理的方式让所有类和实例能够在JS文件更改后, 对被代理对象进行替换, 实现热更新。

作用

使用这个模块引入的JS文件,在修改后不需要重启服务器,可以达到以下效果:

  1. require.cache 更新了,新的 require 使用新的JS。
  2. 原来的旧类对应的实例也更新了。具体来说,绑定在原型链下的函数、绑定在类上的函数等都更新了,旧实例调用的是新的代码。

注意

  1. 因为代理会消耗一定资源,所以建议只在逻辑JS上使用。
  2. 目前建议开发环境中使用,因为还在完善中。

安装

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 文件,在修改后无需重启服务器即可达到以下效果:

  1. require.cache 更新了,新的 require 使用新的 JS 文件。
  2. 原有的旧类对应的实例也更新了,包括绑定在原型下的函数和类上的函数,旧实例调用的是新的代码。

注意事项

  1. 由于代理会消耗一定的资源,建议仅在逻辑 JS 文件中使用。
  2. 目前建议仅在开发环境中使用,因为该方案还在不断完善中。

安装

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 上找到:

欢迎提出意见、完善和扩展这个方案。

回到顶部