Hot Code Push NodeJS

后端 未结 2 1798
礼貌的吻别
礼貌的吻别 2021-02-06 10:05

I\'ve been trying to figure out this \"Hot Code Push\" on Node.js. Basically, my main file (that is run when you type node app.js) consists of some settings, config

2条回答
  •  独厮守ぢ
    2021-02-06 10:31

    Deleting require's cache doesn't actually "unload" your old code, nor does it undo what that code did.

    Take for example the following function:

    var callbacks=[];
    registerCallback = function(cb) {
        callbacks.push(cb);
    };
    

    Now let's say you have a module that calls that global function.

    registerCallback(function() { console.log('foo'); });
    

    After your app starts up, callbacks will have one item. Now we'll modify the module.

    registerCallback(function() { console.log('bar'); });
    

    Your 'hot patching' code runs, deletes the require.cached version and re-loads the module.

    What you must realize is that now callbacks has two items. First, it has a reference to the function that logs foo (which was added on app startup) and a reference to the function that logs bar (which was just added).

    Even though you deleted the cached reference to the module's exports, you can't actually delete the module. As far as the JavaScript runtime is concerned, you simply removed one reference out of many. Any other part of your application can still be hanging on to a reference to something in the old module.

    This is exactly what is happening with your HTTP app. When the app first starts up, your modules attach anonymous callbacks to routes. When you modify those modules, they attach a new callback to the same routes; the old callbacks are not deleted. I'm guessing that you're using Express, and it calls route handlers in the order they were added. Thus, the new callback never gets a chance to run.


    To be honest, I wouldn't use this approach to reloading you app on modification. Most people write app initialization code under the assumption of a clean environment; you're violating that assumption by running initialization code in a dirty environment – that is, one which is already up and running.

    Trying to clean up the environment to allow your initialization code to run is almost certainly more trouble than it's worth. I'd simply restart the entire app when your underlying files have changed.

提交回复
热议问题