简短的回答是:不太可能。
唯一明智的方法是运行一个节点进程,PHP可以从中请求渲染。这并不是一个坏的解决方案,特别是对于经常缓存的页面。
我建议以非常动态的方式设置它:
<?php
function render_component_to_string($component, $data)
{
$url = "http://localhost:9000/components/"
. $component
. "?data="
. rawurlencode(json_encode($data));
return file_get_contents($url)
}
?>
<div id="myFilteredList">
<?= render_component_to_string("FilteredList",
array("items" => items, "title" => "My List")) ?>
</div>
在node.js中:
var app = require('express')();
var React = require('react');
var components = Object.create(null);
components.FilteredList = require('./components/filtered-list.js');
app.get('/component/:componentName', function(req, res){
var component = components[req.params.componentName];
if (!component) {
console.error("Invalid component", req.params.componentName);
return res.send(404);
}
try {
var data = JSON.parse(req.query.data);
}
catch (e) {
console.error("Invalid JSON", req.params.componentName, req.query.data);
return res.send(400);
}
try {
var result = React.renderComponentToString(component(data));
}
catch (e) {
console.error('Could not render', req.params.componentName,
'with props', data);
console.error(e.message, '\n', e.stack);
return res.send(400);
}
res.send(result);
});
app.listen(9000);
当然,这假设您的组件是在commonjs模块中。如果不是,这就是另一个原因去这样做!
我已经好几年没用 PHP 了,如果我有任何错误,请更新这个答案。