Limenius / ReactBundle

Client and Server-side React.js rendering in a Symfony Bundle
MIT License
390 stars 53 forks source link

Using V8js(2.1.0) (with v8 6.4.388.41) on ReactBundle 2.1.0 throw error (while trying snapshooting ?) #29

Open grimpows opened 6 years ago

grimpows commented 6 years ago

as title say, i get an error here is the stack trace from php-fpm

[05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: "# Fatal error in ../../src/snapshot/startup-serializer.cc, line 125" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: "# Check failed: 0 == isolate->global_handles()->global_handles_count()." php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: "#" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: "" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: "==== C stack trace ===============================" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: "" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " /opt/v8/lib/libv8_libbase.so(v8::base::debug::StackTrace::StackTrace()+0x13) [0x7f4352a2ae53]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " /opt/v8/lib/libv8_libplatform.so(+0xc87b) [0x7f4352a4787b]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " /opt/v8/lib/libv8_libbase.so(V8_Fatal(char const, int, char const, ...)+0xdc) [0x7f4352a270ec]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " /opt/v8/lib/libv8.so(+0x8e7c1a) [0x7f434859ac1a]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " /opt/v8/lib/libv8.so(v8::SnapshotCreator::CreateBlob(v8::SnapshotCreator::FunctionCodeHandling)+0x77a) [0x7f4347f6a9ea]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " /opt/v8/lib/libv8.so(v8::V8::CreateSnapshotDataBlob(char const*)+0x12b) [0x7f4347f6b0cb]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " /usr/local/lib/php/extensions/no-debug-non-zts-20170718/v8js.so(+0xcdc7) [0x7f43487d7dc7]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " php-fpm: pool www(execute_ex+0x8008) [0x55cd1230f8f8]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " php-fpm: pool www(zend_execute+0x124) [0x55cd1230ff54]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " php-fpm: pool www(zend_execute_scripts+0xd3) [0x55cd1225f563]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " php-fpm: pool www(php_execute_script+0x2a8) [0x55cd121fab48]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " php-fpm: pool www(+0x14a41a) [0x55cd11ec241a]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf1) [0x7f434ff9b2b1]" php_1 | [05-Feb-2018 13:25:06] WARNING: [pool www] child 5 said into stderr: " php-fpm: pool www(_start+0x2a) [0x55cd11ec325a]"

you can saw the v8 source code who throw the error here https://github.com/v8/v8/blob/6.4.388/src/snapshot/startup-serializer.cc at line 125

note that i revert back my reactBundle version to 0.14.1 and my app now work well with v8js, but note that the react_render_array isnt present in 0.14.1 :(

i also tryed to run the symfony_react_sandbox on sf 4 who also use 2.1.0 and the same error is throw

the symfony_react_sandbox on sf 3 use ReactBundle 0.14.1 and working well

if you have a specific version of V8 for using 2.1.0 plz ignore this issue and describe it on doc 👍

note that i cant really test all v8 version as this take something like an hour to compile my V8js on my docker

jeremy-richard commented 6 years ago

Hi, there. I'm dealing with the same issue when using Limenius/ReactBundle to do SSR with my Symfony 4 + Create React App. The problem occurs only with Webpack development build. Everything works fine with the production build.

An exception has been thrown during the rendering of a template ("Warning: V8Js::createSnapshot(): Failed to create V8 heap snapshot. Check $embed_source for errors.").

Here's some info :

The index.js looks like this

import ReactOnRails from 'react-on-rails';
import App from './App';

ReactOnRails.register({ App });

And App.jsx

import React from 'react';

function App() {
  return <h1>Hello, world!</h1>;
}

export default App;

Do you need more info to solve this issue ?

jeremy-richard commented 6 years ago

As a workaround, how do you force phpexecjs to use node cli instaed of v8js? I can't figure out how to configure this.

grimpows commented 6 years ago

as i'm using docker i just use a image without v8js enabled, but you can aslo disable v8js from php extension config, normaly reactRenderer autodectect if v8js is enabled and use node if not (node should be installed) if none are installed phpExecJs throw a error

Quicksaver commented 6 years ago

For me the problem came from Create-React-App's hot reloading module injection. I fixed it by commenting out this line in config/webpack.config.dev.js in my react project (ejected):

require.resolve('react-dev-utils/webpackHotDevClient'),

I also had issues trying to import css files directly in my react app, through import './index.css';, so had to remove that as well; didn't check if this works in production builds though.

IkeLutra commented 6 years ago

For reference I had this same issue. I narrowed it down to babel-polyfill I had import "babel-polyfill" in my entrypoint file which must have broken the server side bundle by modifying the globals?

To fix I moved babel-polyfill to the webpack entrypoint so it was only on the client side where it is needed.

Using encore

Encore.addEntry("js/entrypoint", ["babel-polyfill", "./assets/js/entrypoint.js"])
grimpows commented 6 years ago

look like remove babel-polyfill from serverside config solved my prob too :) Thx a lot ^^

@nacmartin could you precise this somewhere on doc or/and maybe remove your babel-polyfill from the symfony react sandbox serverside config ?

in case you dont faced this prob with v8js and babel-polyfill can you tell us wich v8 version you use ? ^^

makivlach commented 6 years ago

I've got the same problem and it seems it's not affected by the babel configuration inside webpack. I'll keep digging and keep you updated.

Edit: Oh Okay... didn't get it on first thought. So, the solution really seems to be: in webpack.config.js change .addEntry('server-bundle', ['babel-polyfill', './assets/js/entryPoint.js']) to .addEntry('server-bundle', './assets/js/entryPoint.js')

gempir commented 6 years ago

Quick debugging tip: Do node yourgenerated.js and you should either see and error or no output at all (which is want you want).