• Stars
    star
    171
  • Rank 217,744 (Top 5 %)
  • Language
    JavaScript
  • Created about 9 years ago
  • Updated over 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A webpack loader to hot reload JavaScript modules

monkey-hot-loader

A webpack loader which adds live updating functionality to a JavaScript system. View this post for gory technical details.

Summary

This loader acts similarly to react-hot-loader in that it uses webpack's HMR infrastructure to be notified when a module has changed. When it changes, it takes the new module's code and monkey-patches the live running system automatically, so all you have to do is edit a file and save it.

As described in my post, currently this only supports updating top-level functions in a module. That means given this code:

function foo() {
  return 5;
}

function bar() {
  return function() { 
    // ...
  }
}

module.exports = function() {
  // ...
}

only foo and bar will update in the live system when changed. Editing the function within bar will reload bar entirely; we have no support for patching arbitrary functions like closures.

Turns out this is still incredibly valuable, and much easier to rationalize about.

In the future, this could patch methods on classes as well which would cover the majority of JavaScript code.

Usage

See the gulpfile in backend-with-webpack to see a full setup. This is a bit confusing right now. If you check out backend-with-webpack, run npm install and gulp run you should have a full setup running.

1- Install the loader

npm install monkey-hot-loader

2- Add the loader to your webpack config, for example:

  module: {
    loaders: [
      {test: /\.js$/, exclude: /node_modules/, loaders: ['monkey-hot', 'babel'] },
    ]
  }

3a- For the frontend, you need to run the Webpack Dev Server to serve your assets. It will create a socketio server that your frontend uses to receive notifications. You can see an example of using the API in react-hot-loader's same code to fire up the server. Make sure to load your assets from this server (i.e. http://localhost:3000/js/bundle.js).

3b- In your webpack config, add 2 more files to load, which connect and listen to the dev server. Additionally, add the HotModuleReplacementPlugin to plugins.

Make sure that the adress & port of the webpack-dev-serve query points to the dev server instance.

var frontendConfig = config({
  entry: [
    'webpack-dev-server/client?http://localhost:3000',
    'webpack/hot/only-dev-server',
    './static/js/main.js'
  ],
  output: {
    ...
  },
  plugins: [
    new webpack.HotModuleReplacementPlugin()
  ]
});

4a- For the backend, do the same as the frontend except add only webpack/hot/signal.js file to your entry point. Also make sure to give a path to recordsPath.

var backendConfig = config({
  entry: [
    'webpack/hot/signal.js',
    './src/main.js'
  ],
  target: 'node',
  output: {
    ...
  },
  recordsPath: path.join(__dirname, 'build/_records'),
  plugins: [
    new webpack.HotModuleReplacementPlugin()
  ]
});

The signal.js file instruments your app to check for updates when it receives a SIGURS2 signal. This is the same signal that nodemon uses to signal a restart, but signal.js overrides this behavior. Instead of restarting, your app will simply patch itself.

4b- For now, this setup requires nodemon, but in the future there could be multiple ways to talk to your running app. If you are using gulp, start your app with nodemon like this:

nodemon({
  execMap: {
    js: 'node'
  },
  script: path.join(__dirname, 'build/backend'),
  ignore: ['*'],
  watch: ['nothing/'],
  ext: 'noop'
});

We tell nodemon to watch no files, since we don't care about that.

4c- Now, when webpack is done running, call nodemon.restart(). You will need to call webpack via that API. You should probably be doing all of this through gulp anyway.

webpack(backendConfig).watch(100, function(err, stats) {
  nodemon.restart();
});

I know it's confusing, but remember, this restart just sends the signal which our app captures and actually just does an update.

I recommend just checking out backend-with-webpack, installing with npm install and running with gulp run and playing with it there.

More Repositories

1

absurd-sql

sqlite3 in ur indexeddb (hopefully a better backend soon)
JavaScript
4,062
star
2

transducers.js

A small library for generalized transformation of data (inspired by Clojure's transducers)
JavaScript
1,726
star
3

blog

All the sources for my (not powered by React anymore) blog
CSS
1,223
star
4

electron-with-server-example

An example Electron app with a backend server all wired up via IPC
JavaScript
1,002
star
5

crdt-example-app

A full implementation of CRDTs using hybrid logical clocks and a demo app that uses it
JavaScript
576
star
6

css-animations.js

A library to work with CSS3 keyframe animations from javascript
JavaScript
479
star
7

backend-with-webpack

A simple server using webpack as a build tool
JavaScript
459
star
8

unwinder

An implementation of continuations in JavaScript
JavaScript
304
star
9

canvas-game-bootstrap

A starting point & tutorial for basic 2d canvas games
JavaScript
237
star
10

es6-macros

A collection of sweet.js macros that implement ES6 features for ES5
JavaScript
237
star
11

outlet

Outlet is a simple Lisp-like programming language
JavaScript
161
star
12

jsx-reader

A JSX reader for JavaScript, powered by sweet.js.
JavaScript
149
star
13

lively

Components & state
JavaScript
145
star
14

emojiscript

EmojiScript: emotion literals, emotional algebra, and more for JavaScript
JavaScript
138
star
15

dom3d

Rendering 3d with CSS3
JavaScript
111
star
16

gambit-iphone-example

An example iphone app which uses Gambit Scheme.
Scheme
103
star
17

farmageddon

The raw, unedited source for the iOS game I wrote in Gambit Scheme back in 2010.
C
102
star
18

dcpu-lisp

A Lisp-like language that compiles to DCPU-16 assembly code
JavaScript
77
star
19

redux-experiments

A few customizations for my own projects
JavaScript
64
star
20

lljs-cloth

Cloth simulation as a large-scale test for LLJS development
JavaScript
47
star
21

sweetjs-loader

A webpack loader for sweetjs
JavaScript
47
star
22

swank-gambit

Gambit swank backend for SLIME
Scheme
40
star
23

learning-clojurescript

All the apps I'm making to learn ClojureScript (and also have fun)
JavaScript
40
star
24

absurd-example-project

A project to show everything needed to use absurd-sql
JavaScript
38
star
25

grunt-nunjucks

A grunt plugin for nunjucks.
JavaScript
38
star
26

steps

A little hack that allows you to step through JavaScript code (only in Firefox for now)
JavaScript
30
star
27

jlongster-rebuild

A rebuild of my blog w/react, CSP, and more
JavaScript
29
star
28

gulp-sweetjs

A gulp loader for sweet.js
JavaScript
26
star
29

sweet.js-tutorials

All the sweet.js tutorials from my blog and a working sweet.js environment
JavaScript
26
star
30

play-react-native-opengl

An example of using React Native to control OpenGL (terrible hacky code)
JavaScript
25
star
31

webfighter

An r-type inspired 2d game for the web
JavaScript
24
star
32

live-css-layout

A live editor for css-layout
JavaScript
20
star
33

configure-iphone

A utility shell script to help build libraries for iPhone devices.
19
star
34

objective-c-csv-parser

Objective-C CSV Parser
18
star
35

shade

A simple but optimal 3d engine
JavaScript
16
star
36

construct.js

Simple sugar for establishing prototype-based inheritance
JavaScript
15
star
37

mozlando-react-workshop

Lessons for learning React.
JavaScript
15
star
38

genetic-canvas

Implements a genetic algorithm for drawing 2d pictures
Scheme
14
star
39

tcomb-immutable-experiment

An experiment with immutable.js-backed tcomb types
JavaScript
14
star
40

outlet-machine

A register-based virtual machine for a basic Lisp
JavaScript
13
star
41

autoffi

FFI generator for Gambit Scheme
Scheme
13
star
42

ftgles

FTGL, a font rendering library, ported to OpenGLES.
C++
12
star
43

struct.js

Struct datatypes for JavaScript with a few sweet.js macros
JavaScript
12
star
44

gambit-ffi-generator

Generating Gambit-C Scheme FFI's from C header files
12
star
45

schemeray

A simple raytacer written in Gambit Scheme, and ported to other implementations
Scheme
11
star
46

fp-workshop

A workshop to introduce functional-style programming in JavaScript
10
star
47

mozilla.com

Battlegrounds for mozilla.com work (mirror of http://svn.mozilla.org/projects/mozilla.com/)
PHP
10
star
48

reason-http-server-example

A simple HTTP server in Reason using cohttp and built with Rebel.
10
star
49

devrepl

A REPL for the Firefox debugger client/server
JavaScript
9
star
50

weatherme

A simple weather web app
JavaScript
8
star
51

macro-editor

An embeddable sweet.js macro editor
JavaScript
8
star
52

flame

An experimental tile-based game
JavaScript
7
star
53

mozilla.org

A copy of the mozilla.org PHP site.
JavaScript
7
star
54

grime3d

A proof of concept for something special.
Scheme
6
star
55

perf-deets

Get those perf deets
JavaScript
6
star
56

OMGBUGS

Experimental nodejs-powered bugzilla interface. See the demo site at this repo's url.
JavaScript
6
star
57

game-engine-studies

Implementing various game engines in javascript
JavaScript
6
star
58

lljs-minecraft

Port of notch's minecraft demo to LLJS
JavaScript
5
star
59

ahoy

This is nothing.
JavaScript
5
star
60

tilt-this

A web-based builder for 3d Tilt objects (viewable by Firefox's Tilt devtool)
JavaScript
5
star
61

actual-automoto

JavaScript
5
star
62

ftgles-gambit

Gambit Scheme bindings to the FTGLES library
Scheme
4
star
63

webui

Using csuwldcat's WebComponent project to build some UI tools for webapps
JavaScript
4
star
64

relnotes

Release notes generator for Firefox releases
Python
4
star
65

lljs-editor

An experiment with live-editing LLJS code in the browser.
JavaScript
4
star
66

ff-devtools-libs

A quick experiment to help migrate to HTML
JavaScript
4
star
67

demo-cloth

A floating cloth demo with JavaScript/WebGL
JavaScript
4
star
68

channel-debugger

a firefox devtool addon for debugging channels
JavaScript
4
star
69

YPS

Yield Passing Style
JavaScript
4
star
70

entity.js

A little game experiment
JavaScript
3
star
71

spidermonkey-graphics

spidermonkey for 3d graphics and user interfaces
C
3
star
72

strangeloop2015

Slides for my talk "Cleaning the Tar: Using React in Firefox DevTools"
JavaScript
3
star
73

tweetness

A twitter Open Web App
JavaScript
3
star
74

js-lljs-c-benchmarks

Benchmarks comparing js, lljs, and c compiled with emscripten
JavaScript
3
star
75

octave-utility

my utility code for using octave
Objective-C
3
star
76

jlongster-django

My personal site: jlongster.com
Python
3
star
77

writing-webapps

My presentation at the Mozillas Apps Summit
JavaScript
3
star
78

django-basic-site

Python
3
star
79

fiber-modal-error

JavaScript
2
star
80

mozilla-product-details

git svn clone http://svn.mozilla.org/libs/product-details/json/
JavaScript
2
star
81

gollumdoc

Patches the gollum wiki to host documentation better
Ruby
2
star
82

servable-branches

Manifest git branches on the filesystem to be served on the web
JavaScript
2
star
83

persona.org

NodeJS project
JavaScript
2
star
84

my-react-native-babel-preset

JavaScript
2
star
85

voloweb

A site for volo
JavaScript
2
star
86

libgrowth

A tiny web site that estimates the growth of your node libraries over time
JavaScript
2
star
87

build-docker-mochitest

Making mochitests OK.
Makefile
2
star
88

xpcshell-unit-test

A basic xpcshell test runner that can be used outside of Firefox
JavaScript
2
star
89

onGameStart-2013

My presentation for onGameStart 2013, using websockets to connect everybody
JavaScript
2
star
90

devtool-prototype

An experiment with making a new devtool
CSS
2
star
91

actual-docs

markdown content
JavaScript
2
star
92

cordova-firefoxos-plugins

A place for Mozilla to track our Cordova work
Java
2
star
93

rn-android-input-pan

Repro for Android's panning behavior when focusing an input
Objective-C
2
star
94

jlongster.com

TypeScript
2
star
95

bugzillersearch

A quick experiment in hating iOS for nefarious research purposes.
Objective-C
2
star
96

php-product-details

Mozilla's PHP product-details library (mirror of https://svn.mozilla.org/libs/product-details)
PHP
2
star
97

services

services that I run on my computer & servers
Ruby
1
star
98

tmp-node-inspector

JavaScript
1
star
99

jlongster.github.io

HTML
1
star
100

noodleconfware

The conference software for noodleconf
JavaScript
1
star