2016-06-15 5 views
0

Ich habe ein universelles Projekt, bei dem Reagieren konfiguriert I Webpack verwenden Bündel sowohl für das und den Server Code Client zu erstellen.Supporting webpack abhängige Einfuhren des Knotens dev Server-Ausführung (ein Server React Rendering-Kontext)

Das funktioniert gut, wenn ich den Server direkt über das Targeting der gebündelten Ausgabe von Webpack ausführen.

Allerdings habe ich Probleme, wenn ich versuche, einen "Live" -Entwicklungsserver zu betreiben. In diesem Fall möchte ich die gebündelten Serverdateien nicht als Ziel auswählen, sondern ziele direkt auf die Quelldateien ab, wodurch ich die heiße Middleware des Webpacks für Live-Codeänderungen ausführen kann. Unten ist eine abgespeckte Version der Hauptdatei für den Server.


src/server/index.js

import express from 'express' 
import universalReactAppMiddleware from './middleware/universalReactApp' 

const server = express() 

// Get the client bundle webpack configuration. 
const webpackClientConfig = require('../../webpack.client.config.js') 

// If we are in development mode we will add the webpack hot 
// reloading middleware. 
if (process.env.NODE_ENV === 'development') { 
    const webpack = require('webpack') 
    const clientCompiler = webpack(webpackClientConfig) 
    const createWebpackMiddleware = require('webpack-dev-middleware') 
    const createWebpackHotMiddleware = require('webpack-hot-middleware') 
    server.use(
    createWebpackMiddleware(clientCompiler, { 
     noInfo: true, 
     publicPath: webpackClientConfig.output.publicPath, 
     stats: { 
     colors: true, 
     hash: false, 
     timings: true, 
     chunks: false, 
     chunkModules: true, 
     modules: false 
     } 
    }) 
) 
    server.use(
    createWebpackHotMiddleware(clientCompiler) 
) 
} 

// Configure static serving of our webpack bundled client files. 
server.use(
    webpackClientConfig.output.publicPath, 
    express.static(webpackClientConfig.output.path)) 

// Bind our universal react app middleware for all GET requests. 
server.get('*', universalReactAppMiddleware) 

server.listen(process.env.SERVER_PORT) 

Ein Beispiel Ausführung dieser nun sein:

NODE_ENV=development babel-node ./src/server 

Es startet in Ordnung, aber der Moment der universalReactAppMiddleware behandelt eine Anfrage, es wird versucht, Server-Rendering für eine aufgelöste durchzuführen Komponente. Dies fällt dann über, weil einige meiner Komponenten Bilder/CSS importieren, zum Beispiel:


src/shared/components/Foo

import './styles.css' 
import background from './background.jpg' 

function FooComponent() { 
    return <img src={background} /> 
} 

Computer sagt nein!

Nach der Ausführung gibt mein Express-Server eine Ausnahme aus, die eine unerwartete Syntax sagt. Es versucht grundsätzlich, den CSS- und Image-Import als Javascript zu analysieren. Diese Arten von Importen hängen davon ab, dass meine Webpack-Loader korrekt funktionieren.


So, jetzt versuche ich, das Webpack Verhalten von Spoofing für einen Mechanismus zu suchen, so dass ich diese Art von Komponenten ausführen kann. Ich untersuche Pete Hunts webpack-require, habe aber Schwierigkeiten damit.

Kennt jemand andere Ansätze, die für diesen Kontext funktionieren?


aktualisieren 2016/06/15

Boom! Ich habe es geschafft, das ohne irgendwelche 3rd-Party-Bibliotheken zu schaffen, um mir zu helfen. universal-webpack ist ziemlich cool und viel sauberer als die vorherigen webpack-isomorphic-tools, aber ich mag, dass ich eine minimale Konfiguration eingerichtet habe, in der so wenig wie möglich der universellen Webpack-Konfiguration in meinen Produktionscode blutet.

Ich bin ziemlich begeistert von den Ergebnissen.Das Client-Paket wird von der neuesten react-hot-loader v3-Beta unterstützt, was mir eine fantastische HMR-Erfahrung beschert, und mein Server-Bundle wird bei jeder Dateiänderung neu erstellt, so dass ich meinen Server auch nicht manuell neu starten muss. Making für eine ziemlich süße Entwicklungserfahrung.

Ich werde dies in ein Boilerplate werfen (ja ich weiß, noch ein anderes), aber vielleicht wird es für jemand anderen nützlich sein.

+1

https://github.com/halt-hammerzeit/universal-webpack – zerkms

+0

Dank war ich vor seinem 'webpack-isomorph-tools' verwenden, aber ich didn‘ t wie die Tatsache, dass ein Webpack-Compiler in meinem Server ausgeführt wurde. Mit Blick auf die Quelle ist das großartig, da ich sogar das Server-Bundle anvisieren kann, ohne diese Bibliothek zu benutzen. Ich bevorzuge es, den Produktionscode so sauber wie möglich zu halten. Vielen Dank. – ctrlplusb

+0

Also welche Art von Antwort Sie suchen? Wenn Sie möchten, dass sich Ihre Umgebung wie ein Webpack verhält (und Sie das wollen), benötigen Sie entweder ein Webpack oder Sie müssen etwas implementieren, das sich wie ein Webpack verhält. Es gibt keine 3. Option. – zerkms

Antwort

1

Ich schuf eine funktionierende Lösung, die alles, was ich von der Konfiguration wollte, erreichte.

Es ist alles im folgenden Text Repo: https://github.com/ctrlplusb/react-universally

+0

Ich habe es kurz überprüft und es sieht gut aus! Ich werde versuchen, es mit einem anderen kleinen Projekt zu verwenden, für das ich serverseitiges Rendering benötige. – zerkms

+0

Ich schätze das positive Feedback! :) Bitte lassen Sie mich wissen, wie Ihre Erfahrung verläuft und ob Sie fühlen, dass es Dinge gibt, die fehlen oder die besser erklärt werden könnten. Ich werde jetzt eine erweiterte Version des Boilerplate erstellen, die einen eigensinnigen Tech-Stack einführt. Es wird jedoch in einem separaten Repo sein. – ctrlplusb

+0

Ich habe tatsächlich übersehen, dass es webpack2 verwendet, die mich davon abhalten würde, für dieses Projekt zu verwenden :-( – zerkms

Verwandte Themen