rlidwka / node-hotswap Goto Github PK
View Code? Open in Web Editor NEWThis module enables code hotswapping in node.js
This module enables code hotswapping in node.js
My web application is written in TypeScript. Hotswap is used to swap out the generated JS on the app server. If I generate source maps as well as JS, it looks like Hotswap attempts to read/compile the source map files.
I've played with the configuration but couldn't work out a way to exclude ".js.map" files from hotswap.
Could I be doing something odd in my imports/requires to trigger this behaviour?
Example stack trace:
debugger listening on port 5858
NODE_ENV: development
/Users/laurence/digitalstack/generated/server/models/db/AccessToken.js.map:1
ction (exports, require, module, __filename, __dirname) { {"version":3,"file":
^
SyntaxError: Unexpected token :
at Module._compile (module.js:439:25)
at extension_js (/Users/laurence/digitalstack/node_modules/hotswap/hotswap.js:220:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at module.exports.Sequelize.import (/Users/laurence/digitalstack/node_modules/sequelize/lib/sequelize.js:621:63)
at /Users/laurence/digitalstack/generated/server/models/db/index.js:29:44
at Array.forEach (native)
at new DbContainer (/Users/laurence/digitalstack/generated/server/models/db/index.js:28:14)
at Object.<anonymous> (/Users/laurence/digitalstack/generated/server/models/db/index.js:43:10)
at Module._compile (module.js:456:26)
at extension_js (/Users/laurence/digitalstack/node_modules/hotswap/hotswap.js:220:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
Like ts-node
.
node version: v10.14.0
express
my router.js:
const a = require('../api/test.js');
router.get('/', (req, res, next) => new a(req, res, next).main() );
my test.js
module.change_code = 1;
class test {
constructor(req, res, next) {
this.req = req;
this.res = res;
// super(req, res, next);
}
main() {
const b = {
a: 1,
b: 2
}
this.res.render('index', { title: 'Express11' , ...b})
}
}
module.exports = test;
I tried to enable hotswap for every module (patching it), to see if it works in a real project.
I didn't test the reloading. Just tried to run it.
The app died with undefined is not a function
somewhere deep in the modules (under node_modules
).
I tried to move require('hotswap')
lower in the code, to exclude some modules, so the server actually started running, but then there was another error of the same kind.
To give a glimpse of what's happening:
undefined is not a function
at Object.<anonymous> (/js/javascript-nodejs/node_modules/image-size/lib/detector.js:7:7)
at Module._compile (module.js:460:26)
at extension_js (/js/javascript-nodejs/node_modules/hotswap/hotswap.js:220:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object.<anonymous> (/js/javascript-nodejs/node_modules/image-size/lib/index.js:7:16)
And here I paste the code from the image-size
module (from npm):
'use strict';
var typeMap = {};
var types = require('./types');
// load all available handlers
types.forEach(function (type) {
typeMap[type] = require('./types/' + type).detect;
});
module.exports = function (buffer, filepath) {
var type, result;
for (type in typeMap) {
result = typeMap[type](buffer, filepath);
if (result) {
return type;
}
}
};
Looks like the reason why doesn't work is types
being an array.
Occasionally, module._compile [line 221] throws a syntax error and crashes the app.
This happens when the watched file is streamed to disk.
I suggest to wrap the module._compile calls in a try-catch-block and emit an event if it fails.
The example on the read me only returns the following:
{ version: 0, prototype: undefined }
{ wow: 'thats working', prototype: undefined }
This module has been super helpful for me - thank you.
For my use case, I wanted to check each hotswapped file for syntax errors before requiring it. I implemented this here.
Would folks be interested in integrating this feature? Shall I make a PR?
Please see the project I've set up to reproduce the problem, here:
https://github.com/laurence-myers/hotswap-export-issue
(The project is written in TypeScript, but the JavaScript output is located in the "dist" directory.)
When "module.change_code = 1" is present in the module, a singleton instance, exported as "module.exports", will lose its inheritance chain.
This affects files using ES6 classes and inheritance. When using a custom extends function (like when targeting ES5), it works okay.
In TypeScript, using the syntax "export default instance;" will also fix the problem; presumably, this is because it actually generates the export like "module.exports = { default: instance };".
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.