Nodejs bearcat 热更新方案

Nodejs bearcat 热更新方案

热更新

本次升级主要是优化了热更新,热更新的原理还是基于bearcat IoC 动态替换 javaScript 对象的 prototype 里面的方法,之前热更新watch file是通过nodejs自带的fs.watch实现的,现在版本基于 chokidar 库实现,可以支持多层目录的监听热更新,而不是之前版本的只能监听一级文件夹下面的文件,因为可以直接指定源码文件夹即可(默认就是app目录),更新里面的代码,只要是松散耦合,并不存在引用依赖的,就可以热更新

使用

启动bearcat时传入两个参数

bearcat.createApp([contextPath], {
	BEARCAT_HOT: 'on',
	BEARCAT_HPATH: 'setup your hot reload source path'
})
  • BEARCAT_HOT: 传入 ‘on’ 来开启热更新,默认是关的
  • BEARCAT_HPATH: 设置热更新的扫描路径,默认是app文件夹

更多详情还请看官方文档 bearcat hot reload


6 回复

热更新

本次升级主要是优化了热更新,热更新的原理还是基于bearcat IoC 动态替换 javaScript 对象的 prototype 里面的方法,之前热更新watch file是通过nodejs自带的fs.watch实现的,现在版本基于 chokidar 库实现,可以支持多层目录的监听热更新,而不是之前版本的只能监听一级文件夹下面的文件,因为可以直接指定源码文件夹即可(默认就是app目录),更新里面的代码,只要是松散耦合,并不存在引用依赖的,就可以热更新

使用

启动bearcat时传入两个参数

bearcat.createApp([contextPath], {
	BEARCAT_HOT: 'on',
	BEARCAT_HPATH: 'setup your hot reload source path'
})
  • BEARCAT_HOT: 传入 ‘on’ 来开启热更新,默认是关的
  • BEARCAT_HPATH: 设置热更新的扫描路径,默认是app文件夹

更多详情还请看官方文档 bearcat hot reload


[@xieren58](/user/xieren58) 哈哈,改了一个repo的名字

Nodejs bearcat 热更新方案

热更新

本次升级主要是优化了热更新。热更新的原理还是基于 bearcat IoC 动态替换 JavaScript 对象的 prototype 里面的方法。之前热更新 watch file 是通过 Node.js 自带的 fs.watch 实现的,现在版本基于 chokidar 库实现,可以支持多层目录的监听热更新,而不是之前版本的只能监听一级文件夹下面的文件。因为可以直接指定源码文件夹即可(默认就是 app 目录),更新里面的代码,只要是松散耦合,并不存在引用依赖的,就可以热更新。

使用

启动 bearcat 时传入两个参数:

const bearcat = require('bearcat');

bearcat.createApp(['./src'], {
    BEARCAT_HOT: 'on',
    BEARCAT_HPATH: './src'
}).start();
  • BEARCAT_HOT: 传入 'on' 来开启热更新,默认是关的。
  • BEARCAT_HPATH: 设置热更新的扫描路径,默认是 app 文件夹。
示例代码

假设我们有一个简单的应用结构如下:

project/
├── src/
│   ├── app.js
│   └── services/
│       └── exampleService.js
└── index.js

index.js

const bearcat = require('bearcat');

bearcat.createApp(['./src'], {
    BEARCAT_HOT: 'on',
    BEARCAT_HPATH: './src'
}).start();

console.log('Bearcat App started with hot reloading enabled.');

src/app.js

const bearcat = require('bearcat');

bearcat.getBean('exampleService').doSomething();

src/services/exampleService.js

const bearcat = require('bearcat');

bearcat.define('exampleService', function() {
    return {
        doSomething: function() {
            console.log('Doing something...');
        }
    };
});

module.exports = bearcat;

当修改 exampleService.js 中的代码时,如果开启了热更新,bearcat 将会自动重新加载该模块,而不需要重启整个应用。

更多详情还请看官方文档 bearcat hot reload

要实现基于 bearcat 的 Node.js 热更新方案,可以通过配置 BEARCAT_HOTBEARCAT_HPATH 参数来启用和指定热更新的扫描路径。下面是一个具体的示例代码:

// 引入必要的库
const bearcat = require('bearcat');
const chokidar = require('chokidar');

// 启动 bearcat 并开启热更新功能
bearcat.createApp(null, {
    BEARCAT_HOT: 'on',
    BEARCAT_HPATH: './app' // 指定热更新扫描路径
});

// 使用 chokidar 监听文件变化
const watcher = chokidar.watch('./app', {
    ignored: /(^|[\/\\])\../, // 忽略隐藏文件
    persistent: true,
    ignoreInitial: true
});

// 文件发生变化时触发更新
watcher.on('all', (event, path) => {
    console.log(`File ${path} has been ${event}`);
    
    // 重新加载模块以进行热更新
    delete require.cache[require.resolve(path)];
    const module = require(path);
    
    // 更新对象的原型方法
    bearcat.refresh(module);
});

解释

  1. 引入库:首先需要引入 bearcatchokidar
  2. 启动 bearcat:使用 bearcat.createApp 方法启动应用,并传入 BEARCAT_HOTBEARCAT_HPATH 参数以启用热更新并设置扫描路径。
  3. 监听文件变化:使用 chokidar 监听指定路径下的文件变化。当文件发生变化时,触发事件处理器。
  4. 文件变化处理:在文件变化时,删除已加载的模块缓存,并重新加载模块。然后调用 bearcat.refresh 方法更新对象的原型方法。

这样就可以实现一个简单的热更新机制。注意这里的热更新仅适用于非依赖紧密耦合的松散代码结构。

回到顶部