2016-06-23 15 views
0

Ich arbeite an einer React/Redox-App, die lokal mit einem npm-piped hapi.js Backend auf Port: 3000 und einem Webpack-Dev-Server ausgeführt wird Hafen: 3001;Dev-Server nicht hot-reloading, nicht bauen

Ich habe ein paar API-Routen auf der Rückseite, um statische Dateien zu liefern, und dann habe ich Asset-Dateien aus meinem Build/Public-Verzeichnis mit einer {param *} Regel getroffen. Um das zu machen, habe ich einen Proxy auf dem WebpackDevServer, der Anfragen zurück an Port: 3000

Ich habe CSSModules Durchführung einer Build von. scss, und es gibt ein paar andere Lader an Ort und Stelle.

Als ich das zuerst aufstellte, funktionierte es wie erwartet. Ich könnte Dateien hinzufügen, Inhalt speichern, den Build durchführen und das HMR würde sein Ding tun und das Dom aktualisieren. Hat super funktioniert. Irgendwann hörte das sehr gut auf. Die Back-End-on: 3000 A nicht wieder aufbauen und neu geladen, während das vordere Ende auf: 3001 wird eine Fehlerempfang etwa so:

[HMR] Checking for updates on the server... 
bundle.js:26 GET http://localhost:3001/dist/ee2fe9b049ee40ff922c.hot-update.json 404 (Not Found)hotDownloadManifest @ bundle.js:26hotCheck @ bundle.js:245check @ bundle.js:8080(anonymous function) @ bundle.js:8138 
bundle.js:8095 [HMR] Cannot find update. Need to do a full reload! 
bundle.js:8096 [HMR] (Probably because of restarting the webpack-dev-server) 

merke ich, gibt es einen Verweis auf: 8080 in dort (der webpack-dev-Server Standard), aber meine Referenzen sind alle: 3000/1.

Wenn dieser Stack gut funktionierte - ich konnte die server.js speichern und der hapi Server würde sich selbst neu starten (wegen der npm-Pipeline), und der Webpack-Build würde wie erwartet laufen. Derzeit Build Fehler intermittierend von server.js, und ich bin manuell $ webpack und laden Sie den Browser neu, um den Build und erfolgreiche Aktualisierung auszulösen. Was offensichtlich den Punkt besiegt.

Die Wichtige Bits:

server.js

// ... hapi.js settings 

// Dev server/HMR 
const webpack = require('webpack'); 
const WebpackDevServer = require('webpack-dev-server'); 
const config = require('../../webpack.config.js'); 

if (!isProduction){ 
    new WebpackDevServer(webpack(config), { 
    publicPath: 'dist', 
    hot: true, 
    historyApiFallback: true, 
    proxy: { 
     "*": 'http://localhost:3000' 
    }, 
    quiet: false, 
    stats: { colors: true } 
    }).listen(3001, 'localhost', (err, result) => { 
    if (err){ 
     console.log(err); 
    } 
    console.log('WebpackDevServer[localhost::3001]'); 
    }); 
} 

webpack.config.js

// imports 
const webpack = require('webpack'); 
const ExtractTextPlugin = require('extract-text-webpack-plugin'); 
const validate = require('webpack-validator'); 
const path = require('path'); 

// paths 
const rootPath = path.resolve(__dirname, 'client', 'src'); 

// configger the almighty webpack 
const config = { 
    entry: [ 
    'webpack-dev-server/client?http://localhost:3001', 
    'webpack/hot/only-dev-server', 
    path.resolve(rootPath, 'index.jsx') 
    ], 
    resolve: { 
    extensions: ['', '.js', '.jsx'], 
    root: rootPath 
    }, 
    output: { 
    path: path.resolve(__dirname, 'public', 'dist'), 
    publicPath: '/dist/', 
    filename: 'bundle.js', 
    sourceMapFilename: 'bundle.map' 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /\.jsx?$/, 
     exclude: [path.resolve(__dirname, 'node_modules')], 
     loader: 'react-hot!babel', 
     include: rootPath 
     }, { 
     test: /\.scss$/, 
     loader: ExtractTextPlugin.extract('css?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!sass'), 
     include: rootPath 
     }, { 
     test: /\.(png|jpg|gif)$/, 
     loader: 'file?name=/images/[name].[ext]', 
     include: rootPath 
     } 
    ] 
    }, 
    devtool: '#source-map', 
    devServer: { 
    contentBase: '/public', 
    hot: true 
    }, 
    plugins: [ 
    new webpack.HotModuleReplacementPlugin(), 
    new webpack.NoErrorsPlugin(), 
    new ExtractTextPlugin('styles.css') 
    ] 
}; 

module.exports = validate(config); 

mit allen Einstellungen worden bastelt, so könnte ich munged von dem, was hatte habe gearbeitet. Aber es scheint, dass dies wie erwartet funktionieren sollte.

Jeder Einblick in diesen Config-Stack wäre willkommen. Projekt Quelle: github

Best -

Antwort

0

Welp. Ein bisschen Basteln, wenn jemand anderes dieses Problem hat.

Ich habe den Code server.js geändert, um alle Konfigurationen des Dev-Servers zu verarbeiten, was bedeutet, dass bei der Anzeige der Site unter :3001 die Speichervorgänge im Speicher neu erstellt werden und diese im laufenden Betrieb bereitgestellt werden. Was gut ist.

Wie ich es verstehe, die unten WebpackDevServer-Konfiguration wird nicht wirklich neue Dateien neu erstellen (wie die docs scheinen zu zeigen). Ich muss noch manuell $ webpack, um die Dateien tatsächlich zu erstellen. Ich bezweifle, dass dies das richtige Verhalten ist, aber wenn ich ein Live-Reload bekomme, dann ist das ziemlich gut. Ich muss nur auf :3001 bleiben.

server.js

// Dev server/HMR 
const webpack = require('webpack'); 
const WebpackDevServer = require('webpack-dev-server'); 
const config = require('../../webpack.config.js'); 
const compiler = webpack(config); 

new WebpackDevServer(compiler, { 
    port: 3001, 
    publicPath: '/dist/', 
    contentBase: 'dist/', 
    historyApiFallback: true, 
    inline: true, 
    hot: false, 
    quiet: false, 
    stats: { colors: true }, 
    proxy: { 
    '*': 'http://localhost:3000' 
    } 
}).listen(3001, 'localhost', (err, result) => { 
    if (err){ 
    console.log(err); 
    } 
    console.log('WebpackDevServer[localhost::3001]'); 
}); 

webpack.config.js

// imports 
const webpack = require('webpack'); 
const ExtractTextPlugin = require('extract-text-webpack-plugin'); 
const validate = require('webpack-validator'); 
const path = require('path'); 

// paths 
const rootPath = path.resolve(__dirname, 'client', 'src'); 

// configger the almighty webpack 
const config = { 
    entry: [ 
    'webpack-dev-server/client?http://localhost:3001', 
    'webpack/hot/only-dev-server', 
    path.resolve(rootPath, 'index.jsx') 
    ], 
    resolve: { 
    extensions: ['', '.js', '.jsx'], 
    root: rootPath 
    }, 
    output: { 
    path: path.resolve(__dirname, 'public', 'dist'), 
    publicPath: '/dist/', 
    filename: 'bundle.js', 
    sourceMapFilename: 'bundle.map' 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /\.jsx?$/, 
     exclude: [path.resolve(__dirname, 'node_modules')], 
     loader: 'react-hot!babel', 
     include: rootPath 
     }, { 
     test: /\.scss$/, 
     loader: ExtractTextPlugin.extract('css?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!sass'), 
     include: rootPath 
     }, { 
     test: /\.(png|jpg|gif)$/, 
     loader: 'file?name=/images/[name].[ext]', 
     include: rootPath 
     } 
    ] 
    }, 
    devtool: '#source-map', 
    plugins: [ 
    new webpack.HotModuleReplacementPlugin(), 
    new webpack.NoErrorsPlugin(), 
    new ExtractTextPlugin('styles.css') 
    ] 
}; 

module.exports = validate(config);