2016-01-08 21 views
8

Sto costruendo un'applicazione isomorfa React/React-Router/Redux/Webpack e sto tentando di implementare il rendering lato server.Alias ​​Webpack in Node JS Server code

mio elenco assomiglia:

/client 
    /actions 
    /components 
    /containers 
/server 
    /server.js 

Nel mio webpack config, ho alias impostati per tutte le cartelle all'interno del client:

var path_base = path.resolve(__dirname, '..'); 
const resolve = path.resolve; 
const base = function() { 
    var args = [path_base]; 
    args.push.apply(args, arguments); 
    return resolve.apply(resolve,args); 
}; 
const resolve_alias = base.bind(null, 'src/client'); 
const aliases = [ 
    'actions', 
    'components', 
    'constants', 
    'containers', 
    'middleware', 
    'reducers', 
    'routes', 
    'store', 
    'styles', 
    'utils', 
    'validation' 
]; 

in modo che all'interno del codice che viene fornito in bundle con webpack , Posso fare:

import { Widget } from 'components'; 

e che l'importazione viene risolta dal webpack.

Ora nel mio codice server, per eseguire il rendering, devo importare alcuni dei miei file client, come routes/index.js. Il problema che sto incontrando quando importare il mio file di rotte, è quello di utilizzare un alias di un pacchetto Web in un altro file, ad esempio components o containers quindi, in modo naturale, il nodo js richiede che il sistema non possa risolverlo.

Come aggiustare qualcosa del genere? Ho guardato su this question e si tratta essenzialmente di impostare gli stessi alias esistenti nel webpack con mock-require. Ma poi il problema diventa che il mio file di rotte importa tutti i miei componenti che poi importano cose come fogli di stile, immagini, ecc. Dovrei quindi usare qualcosa come webpack-isomorphic-tools?

Le guide che ho visto (this per esempio) sono tutte ottime per mostrare come viene eseguito il rendering lato server ma nessuno di loro parla realmente di come risolvere tutte le richieste e quant'altro.

+0

suona come ci sono diverse domande qui: (a) come faccio a utilizzare gli alias durante l'esecuzione sul lato server, e (b) Come si gestiscono le risorse inclusi come fogli di stile sul server. Una soluzione è eseguire anche il codice del server attraverso il webpack. Puoi usare 'target: node' nella tua configurazione e lo ottimizzerà per il nodo durante la compilazione (cioè non includerà i nodi inclusi). Lo faccio a volte per codice che usa Babel. A corto di fare una build, sicuramente non usare alias. Qualsiasi soluzione sarà hacky al meglio. –

+0

Perché non dovrei usare alias? – barndog

+0

Gli alias vanno bene quando si esegue * build * con webpack. Il tuo problema è che stai usando alias in una build del webpack e stai cercando di far funzionare lo stesso codice * al di fuori * di una build del webpack. Il mio punto era che per usare gli alias, è necessario creare anche il codice del server (il che farà sì che gli alias funzionino bene). Senza la build, l'unico modo per far funzionare gli alias è hackerarlo insieme, che è dove si trova il tuo problema. Gli hacker sono cattivi, quindi usa gli alias e costruisci anche il tuo codice server o semplicemente abbandoni gli alias. –

risposta

1

Se davvero li vuoi, esegui il tuo codice lato server tramite babel e usa questo plugin: https://www.npmjs.com/package/babel-plugin-module-alias che ti permetterà di fare la stessa cosa del webpack.

Edit: Questo funziona molto meglio: https://github.com/jagrem/babel-resolve-relative-module permette percorsi multipli

+0

Qual è il motivo dietro il non usarli? – barndog

+0

Sembra solo causare problemi, oltre a dover utilizzare almeno un plug-in sul server e probabilmente a eseguire l'intera base di codice tramite Babel. Il che credo sia soddisfacente, ma se l'unica ragione per cui si inserisce Babel è per gli alias, sembra un sacco di lavoro – zackify

+0

GRAZIE per averlo collegato a quel plugin Babel! Non avevo pensato di guardare al lato Babele delle cose per l'aliasing. Questo mi ha aiutato molto! – Kevin

1

tenta di utilizzare NODE_PATH. Il nodo cercherà sempre un modulo in questo percorso durante le chiamate richieste. Permette di abbreviare i percorsi relativi che desideri.

// turn this 
import {Widget} from '../../components'; 

// into this 
import {Widget} from 'components'; 

Vedere Node.js docs per ulteriori informazioni.

P.S. questa cosa è molto sensibile, quindi usala con attenzione. Ora il tuo codice dipende strettamente dall'ambiente e potrebbe rompersi da qualche parte.

2

Dopo aver combattuto con questo problema per 2 giorni, ho optato per babel-plugin-webpack-alias. What you need to do per risolvere i percorsi con ovvero:

  1. $ npm install --save-dev babel-plugin-webpack-alias
  2. Aggiungere il plugin per il vostro .babelrc
  3. Aggiungi gli alias al vostro webpack.config (assicuratevi di utilizzare path.join())
  4. Fare riferimento alla this post se avete problemi di caricamento stili

L'altra opzione che ho provato era universal-webpack ma ho trovato ad essere un po 'prolisso. Se vuoi vedere approssimativamente come funziona l'intero caricamento sul lato server, puoi dare un'occhiata a this video.