-
-
Save esamattis/28c2dbcbe8109a0c5edb to your computer and use it in GitHub Desktop.
| <script charset="utf-8"> | |
| <% if ENV["RAILS_ENV"] == "production" %> | |
| var script = "/react-app-bundle.js"; | |
| <% else %> | |
| console.warn("Development mode. Make sure to start 'node devServer.js'"); | |
| var script = "http://" + (location.host || 'localhost').split(':')[0] + ":4000/react-app-bundle.js" | |
| <% end %> | |
| document.write('<script src="' + script + '"></' + 'script>'); | |
| </script> |
| var path = require("path"); | |
| var express = require("express"); | |
| var webpack = require("webpack"); | |
| var config = require("./webpack.config"); | |
| var app = express(); | |
| var compiler = webpack(config); | |
| app.use(require("webpack-dev-middleware")(compiler, { | |
| noInfo: true, | |
| publicPath: config.output.publicPath, | |
| })); | |
| app.use(require("webpack-hot-middleware")(compiler)); | |
| app.listen(4000, "0.0.0.0", function(err) { | |
| if (err) { | |
| console.log(err); | |
| return; | |
| } | |
| console.log("Listening at http://0.0.0.0:4000"); | |
| }); |
| var webpack = require("webpack"); | |
| // This must be the public address where the hot reload bundle is loaded in the | |
| // browser. Yeah it sucks to hard code it here. Let's hope for the better | |
| // future | |
| var PUBLIC_DEV_SERVER = "http://my-dev-server:4000/"; | |
| var ENTRY = "./index.js"; | |
| var NODE_ENV_PLUGIN = new webpack.DefinePlugin({ | |
| "process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV) | |
| }); | |
| var config = { | |
| entry: [ | |
| "webpack-hot-middleware/client?path=" + PUBLIC_DEV_SERVER + "__webpack_hmr", | |
| ENTRY | |
| ], | |
| output: { | |
| path: __dirname + "/public", | |
| filename: "react-app-bundle.js", | |
| publicPath: PUBLIC_DEV_SERVER | |
| }, | |
| devtool: "cheap-module-eval-source-map", | |
| module: { | |
| loaders: [ | |
| { | |
| test: /\.jsx?$/, | |
| exclude: /node_modules/, | |
| loader: "babel", | |
| query: { | |
| "env": { | |
| // Not active when NODE_ENV=production | |
| "development": { | |
| "plugins": ["react-transform"], | |
| "extra": { | |
| "react-transform": [{ | |
| "target": "react-transform-hmr", | |
| "imports": ["react"], | |
| "locals": ["module"] | |
| }] | |
| } | |
| } | |
| } | |
| } | |
| } | |
| ] | |
| }, | |
| plugins: [ | |
| NODE_ENV_PLUGIN, | |
| new webpack.HotModuleReplacementPlugin(), | |
| new webpack.NoErrorsPlugin(), | |
| ] | |
| }; | |
| // Drop all hot stuff for production! | |
| if (process.env.NODE_ENV === "production") { | |
| config.devtool = "source-map"; | |
| config.entry = ENTRY; | |
| delete config.output.publicPath; | |
| config.plugins = [NODE_ENV_PLUGIN]; | |
| } | |
| module.exports = config; |
This works great! The one problem that I was experiencing was I didn't specify the path.
This helped me too. To get it to work, I had to make sure my config.output.path was absolute (path.join(__dirname,'relative/path/to/app.js')), and my config structure was even a little different than @gugl's update above:
{
loader: 'babel-loader',
test: /\.(jsx?$)/,
exclude: /node_modules/,
query: {
"presets": ["es2015", "react"],
"plugins": [
'transform-class-properties',
'transform-decorators-legacy',
'transform-object-rest-spread',
'transform-object-assign',
'transform-async-to-generator'
],
"env": {
// this plugin will be included only in development mode, e.g.
// if NODE_ENV (or BABEL_ENV) environment variable is not set
// or is equal to "development"
"development": {
"plugins": [
// must be an array with options object as second item
["react-transform", {
// must be an array of objects
"transforms": [{
// can be an NPM module name or a local path
"transform": "react-transform-hmr",
// see transform docs for "imports" and "locals" dependencies
"imports": ["react"],
"locals": ["module"]
}]
}]
]
}
}
}
},
Last, to get hot module reload working with css while using postcss, I had to add postcss-import to my css config in webpack using the code at the bottom of this thread.
This worked perfectly for me. I changed this line however:
var PUBLIC_DEV_SERVER = "http://my-dev-server:4000/";Replaced it with so that it is agnostic of the devserver:
const os = require("os");
const PUBLIC_DEV_SERVER = `http://${os.hostname()}:4000/`;Tried the same setup.. but end up with "EventSource's response has a MIME type ("text/html") that is not "text/event-stream". Aborting the connection." error. Any idea about this.
It helped me so much! Thanks for your gist.
Also: The config structure changed a bit with babel-plugin-react-transform version 1.1.0. so it's
now. see https://github.com/gaearon/babel-plugin-react-transform/releases for more info on this change.