Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/koriym/koriym.baracoa

A JavaScript server side rendering interface for PHP
https://github.com/koriym/koriym.baracoa

html javascript performance-boost php redux snapshot ssr template-engine v8js

Last synced: 11 days ago
JSON representation

A JavaScript server side rendering interface for PHP

Awesome Lists containing this project

README

        

# Baracoa

[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/koriym/Koriym.Baracoa/badges/quality-score.png?b=1.x)](https://scrutinizer-ci.com/g/koriym/Koriym.Baracoa/?branch=1.x)
[![Code Coverage](https://scrutinizer-ci.com/g/koriym/Koriym.Baracoa/badges/coverage.png?b=1.x)](https://scrutinizer-ci.com/g/koriym/Koriym.Baracoa/?branch=1.x)
[![Build Status](https://travis-ci.org/koriym/Koriym.Baracoa.svg?branch=1.x)](https://travis-ci.org/koriym/Koriym.Baracoa)

## A JavaScript server side rendering interface

**Bracoa** provides a simple interface for JavaScript server side rendering in PHP.

## Prerequisites

* php7.1
* [V8Js](http://php.net/v8js)

## Installation

```
composer require koriym/baracoa
```

## Basic

In a JS renderer application, implement `render` function which takes parameter(s) and return html string.

```javascript
const render = state => (
`Hello ${state.name}`
)
```

Call the `render()` method with JS app name and values to assign to redner.

```php
$baracoa = new Baracoa($jsDir, new ExceptionHandler());
$html = $baracoa->render('min', ['name' => 'World']);
echo $html; // Hello World
```

In this example, you need to place `min.bundle.js` JS file in `$jsDir ` directory.
Every page needs own JS view application which is bundled single file by bundler tool like [webpack](https://webpack.github.io/).

Typical entry file is like following code.

```
import render from './render';
global.render = render;
```

In next section we see the example of Redux with React applicaiton example.

## Redux React

### The Server Side

Inject an initial component HTML and initial state into a template to be rendered on the client side.
To pass along the state, we add a `` tag that will attach `preloadedState` to `window.__PRELOADED_STATE__`.
The preloadedState will then be available on the client side by accessing `window.__PRELOADED_STATE__`.

We also include our bundle file for the client-side application via a `<script>` tag.
This is whatever output your bundling tool provides for your client entry point.

### render.js

```javascript
import React from 'react';
import { renderToString } from 'react-dom/server';
import { Provider } from 'react-redux';
import escape from 'escape-html';
import serialize from 'serialize-javascript';
import App from '../containers/App';
import configureStore from '../store/configureStore';

const render = (preloadedState, metas) => {
const store = configureStore(preloadedState);
const root = renderToString(
<Provider store={store}>
<App />
</Provider>,
);
return `<!doctype html>
<html>
<head>
<title>${escape(metas.title)}</title>
</head>
<body>
<div id="root">${root}</div>
<script>
window.__PRELOADED_STATE__ = ${serialize(preloadedState)}