UNPKG

uncache

Version:

non-caching require() for live coding

148 lines (85 loc) 2.8 kB
uncache ======= Like `require()`, but do not put the required package into the cache to facilitate live coding (actually, it removes the required module from the cache!). What Can You Do? ---------------- * Create a web server that you don't have to restart when you change the code. Usage ----- ```javascript var live = require('uncache')(require) ``` Now, use `live('module')` instead of `require('module')`. It will load the file each time. ### When the module exports a function ```javascript var func = live.function('./module') ``` When `func()` is called, it will reload the module before calling it. Of course, this assumes that the module exports a function. Use Cases --------- ### Restartless Express Application One annoying thing when creating web applications with Node.js is that you have to restart the server when you change the code. Even with `nodemon` that restarts the server automatically, it's still annoying. Since [the app returned by `express()` is a function](http://expressjs.com/4x/api.html#app.listen) that can be passed to `http.createServer`, you can create a web server like this: ```javascript var live = require('uncache')(require) var http = require('http') http.createServer(live.function('./app')) .listen(3002, '127.0.0.1') ``` And `app.js` like this: ```javascript var express = require('express') var app = module.exports = express() app.get('/', function(req, res, next) { res.send('hello') }) ``` Each time you send a request to this server, a new application is created. That means when you change the code, for example, from `'hello'` to `'world'`, and then refresh the page. __Going live:__ when you want to go production, just change `live.function` to `require`, and it's done! What It Does Not Do ------------------- This module is only concerned about making `require()` clear the cache. It does not have these features: ### Switching between `live` and `require`. Create your own abstraction, such as: ```javascript function load(module) { return (process.env.NODE_ENV == 'production') ? require(module) : live(module) } ``` ### Do some cleanup when a module is reloaded. Maybe you can use a global variable for this. Here is a `cleanup` function: ```javascript function cleanup(module, fn) { var key = 'cleanup:' + module.id // If there is a cleanup function for this module, // this means the module is loaded, so, call it: if (global[key]) { global[key]() } // Register the cleanup function. global[key] = fn } ``` When `cleanup` is called the second time (when the module is reloaded), it will detect the cleanup function from the first load and run it. ```javascript console.log('Start up!') cleanup(module, function() { console.log('Shut down!') }) ```