2016-05-09 20 views
8

Mam aplikację izomorficzną, która używa pakietu webowego 2 do kompilowania zasobów. Dodałem teraz chunking z System.import, który działa po stronie opakowania WWW, ale nie po stronie serwera z nieznalezioną funkcją.Reakcja po stronie serwera z pakietem webpack 2 System.import

Każdy pomysł, jak mogę to rozwiązać?

+0

używasz modułów CSS? dzieje się, gdy zaimportujesz swój CSS do swojego komponentu? – QoP

+0

Rzeczy mogą się przewrócić, gdy korzystasz z funkcji zależnych od sieci Web na serwerze. Stworzyłem uniwersalny kocioł reagujący, który wykorzystuje pakiet sieciowy do pakowania kodu serwera. W ten sposób możesz udostępniać więcej między serwerem a kodem klienta. [Sprawdź to tutaj.] (Https://github.com/ctrlplusb/react-universally) Może być przydatnym punktem odniesienia dla ciebie. Starałem się bardzo często komentować te rzeczy. – ctrlplusb

Odpowiedz

21

Istnieje kilka opcji dostępnych dla coraz System.import pracy z izomorficzna renderowania/server-side:

Funkcja wykrywania System i polyfill

Węzeł pozwala zadzwonić require() w szeregu Miejsca i przyciemnianie System.import w następujący sposób powinny działać:

if (typeof System === "undefined") { 
    var System = { 
    import: function(path) { 
     return Promise.resolve(require(path)); 
    } 
    }; 
} 

Jeśli szukasz bardziej niezawodnej implementacji, istnieje również es6-micro-loader, która implementuje polyfill System, który działa zarówno w przeglądarce, jak i w węźle.

Zastosowanie babel-plugin-system-import-transformer zastąpić System.import z równoważną UMD wzór

znaczy przyjmuje następującą postać:

System.import('./utils/serializer').then(function(module){ 
    console.log(module); 
}); 

i transformuje go do:

new Promise(function (resolve, reject) { 
    var global = window; 

    if (typeof global.define === 'function' && global.define.amd) { 
     global.require(['utilsSerializer'], resolve, reject); 
    } else if (typeof module !== 'undefined' && (module.exports && typeof require !== 'undefined') || 
       typeof module !== 'undefined' && (module.component && (global.require && global.require.loader === 'component'))) { 
     resolve(require('./utils/serializer')); 
    } else { 
     resolve(global['utilsSerializer']); 
    } 
}).then(function(module){ 
    console.log(module); 
}); 

lub

Build with Webpack targeting Node (który użyje wymagają załadowania fragmenty):

webpack --target node 
+0

Dla tych, którzy używają WebPacka v2 i reagują, utworzyłem bibliotekę, aby pomóc w tym. ['code-split-component'] (https://github.com/ctrlplusb/code-split-component) – ctrlplusb

2

Jedną z tych opcji mogą własnych potrzeb:

  1. kompilacji kodu przy użyciu WebPACK w/target 'node' i uruchomić pakiet po stronie serwera.
  2. Jeśli już kompilujesz się z babel, używając rejestru babel lub podobnego, możesz wypróbować coś takiego jak babel-plugin-remove-webpack (może być potrzebny PR, aby zadziałał z System.import oprócz require.ensure).
  3. Zdefiniuj globalną próbę dla System.import, która właśnie zwraca rozstrzygniętą obietnicę za pomocą modułu require() 'd.