|
9 | 9 | var vm = require('vm');
|
10 | 10 | var webpack = require('webpack');
|
11 | 11 | var React = require('react');
|
| 12 | +var ReactDOM = require('react-dom/server') |
12 | 13 | var fs = require('fs');
|
13 | 14 | var yaml = require('js-yaml');
|
14 | 15 | var path = require('path');
|
@@ -76,7 +77,7 @@ function writeReact(writePath, file, fileData) {
|
76 | 77 | var { module, props } = getReactData(componentData);
|
77 | 78 | var componentPath = require.resolve(path.resolve(path.dirname(file.absPath), module));
|
78 | 79 | var component = require(componentPath);
|
79 |
| - var initialRender = React.renderToString(React.createElement(component, props)); |
| 80 | + var initialRender = ReactDOM.renderToString(React.createElement(component, props)); |
80 | 81 | var guid = `r${++id}`;
|
81 | 82 | if (!script) {
|
82 | 83 | script = `var React = require('react');\n`;
|
@@ -168,30 +169,41 @@ function writeScript(writePath, file, fileData) {
|
168 | 169 | var id = 100;
|
169 | 170 | var script;
|
170 | 171 | var context;
|
| 172 | + var renderHere; |
| 173 | + var relRequire; |
171 | 174 |
|
172 | 175 | var withInitialRenders = fileData.replace(SCRIPT_RX, function (_, scriptData) {
|
173 | 176 | if (!script) {
|
174 |
| - script = `var React = require('react'); |
175 |
| - var id = 100; |
| 177 | + script = `var id = 100; |
176 | 178 | function renderHere(element) {
|
177 |
| - React.render(element, document.getElementById('r' + (++id))); |
| 179 | + ReactDOM.render(element, document.getElementById('r' + (++id))); |
178 | 180 | }`;
|
179 |
| - var renderHere = function (element) { |
180 |
| - renders += `<div id="r${++id}">${React.renderToString(element)}</div>`; |
| 181 | + renderHere = function (element) { |
| 182 | + renders += `<div id="r${++id}">${ReactDOM.renderToString(element)}</div>`; |
181 | 183 | };
|
182 |
| - var relRequire = reqPath => require( |
| 184 | + relRequire = reqPath => require( |
183 | 185 | reqPath[0] === '.' ?
|
184 | 186 | path.resolve(path.dirname(file.absPath), reqPath) :
|
185 | 187 | reqPath
|
186 | 188 | );
|
187 |
| - context = { console, process, React, require: relRequire, renderHere }; |
188 |
| - context.global = context; |
189 |
| - context = vm.createContext(context); |
190 | 189 | }
|
191 | 190 | var es5 = require('babel-core').transform(scriptData).code;
|
192 |
| - script += `(function () {\n${es5}\n}());\n`; |
| 191 | + es5 = `(function () {\n${es5}\n}());\n`; |
| 192 | + script += es5; |
193 | 193 | renders = '';
|
194 |
| - var output = vm.runInContext(es5, context); |
| 194 | + var realRequire = require; |
| 195 | + global.require = relRequire; |
| 196 | + global.renderHere = renderHere; |
| 197 | + global.React = React; |
| 198 | + try { |
| 199 | + vm.runInThisContext(es5); |
| 200 | + } catch (e) { |
| 201 | + throw e; |
| 202 | + } finally { |
| 203 | + global.require = realRequire; |
| 204 | + delete global.renderHere; |
| 205 | + delete global.React; |
| 206 | + } |
195 | 207 | return renders;
|
196 | 208 | });
|
197 | 209 |
|
@@ -245,7 +257,8 @@ function writeScript(writePath, file, fileData) {
|
245 | 257 | resolve(
|
246 | 258 | withInitialRenders.replace(
|
247 | 259 | '</body></html>',
|
248 |
| - `<script src="//cdn.jsdelivr.net/react/0.13.3/react.js"></script>` + |
| 260 | + `<script src="//cdn.jsdelivr.net/react/15.3.1/react.js"></script>` + |
| 261 | + `<script src="//cdn.jsdelivr.net/react/15.3.1/react-dom.js"></script>` + |
249 | 262 | `<script src="${path.basename(writePath)}.${stats.hash}.js"></script></body></html>`
|
250 | 263 | )
|
251 | 264 | );
|
|
0 commit comments