Правильно, поэтому я пытаюсь решить изломы в моем коде для работы с рендерингом кода JSX реакции на стороне сервера.
Когда мой test.js
как следует:
var CommentBox = React.createClass({displayName: 'CommentBox',
render: function() {
return (
React.createElement(
'div',
{className: "commentBox"},
"Hello, world! I am a CommentBox.")
);
}
});
Следующий код работает:
$react_source = implode("\n", [
file_get_contents(\Yii::getAlias("@bower").'/react/react.js'),
file_get_contents(\Yii::getAlias("@bower").'/react/react-dom-server.js'),
]);
$react_app = implode("\n", [
file_get_contents(\Yii::getAlias("@app").'/web/test/test.js')
]);
$react = array();
// stubs, react
$react[] = "var console = {warn: function(){}, error: print}";
$react[] = "var global = global || this, self = self || this, window = window || this";
$react[] = $react_source;
$react[] = "var React = global.React";
$react[] = "var ReactDOMServer = global.ReactDOMServer";
$react[] = $react_app;
$concatenated = implode(";\n", $react);
$v8 = new \V8Js();
$v8->executeString($concatenated);
$js = $v8->executeString(sprintf("ReactDOMServer.renderToString(React.createElement(%s))", 'CommentBox'));
return $this->render('index', [
'js' => $js
]);
Но когда мой test.js
выглядит следующим образом:
var CommentBox = React.createClass({
render: function() {
return (
<div className="commentBox">
Hello, world! I am a CommentBox.
</div>
);
}
});
Я получаю следующую ошибку: V8Js::compileString():18861: SyntaxError: Unexpected token <
Теперь я предполагаю, что это потому, что код JSX должен быть скомпилирован в код javascript (рабочая версия), но как мне сделать это на стороне сервера с PHP?
УСПЕХ … Вид
Так что мне удалось заставить это работать. Я использовал babel для преобразования файла из jsx в обычный js, который выглядит как мой оригинальный рабочий код. Все это прекрасно работает с рендерингом на стороне PHP. Тем не менее, сейчас у меня возникают проблемы с корректной работой связанного кода веб-пакета, но это еще одна проблема, поэтому я собираюсь это закрыть.
Некоторые процессоры требуют использования .jsx
расширение.
Попробуйте переименовать test.js
в test.jsx
когда вы используете угловую скобку.
РЕДАКТИРОВАТЬ: И переименовать в вашем коде, очевидно,
Других решений пока нет …