Bridging React With Other Popular Web Languages

Datetime:2016-08-22 23:24:47          Topic: React           Share

React is a view library written in JavaScript, and so it is agnostic of any stack configuration and can make an appearance in practically any web application that is using HTML and JavaScript for its presentation layer.

As React works as the ‘V’ in ‘MVC’, we can create our own application stack from our preferences. So far in this guide we have seen React working with Express, a Node ES6/JavaScript-based framework. Other popular Node-based matches for React are the Meteor framework and Facebook’s Relay.

If you want to take advantage of React’s excellent component-based JSX system, the virtual DOM and its super-fast rendering times with your existing project, you can do so by implementing one of the many open-source solutions.

PHP

As PHP is a server-side scripting language, integration with React can come in several forms:

Server-Side Rendering

For rendering React components on the server, there is a library available on GitHub .

For example, we can do the following in PHP with this package:

<?php
// the library
$react_source = file_get_contents('/path/to/build/react.js');
// all custom code concatenated
$app_source = file_get_contents('/path/to/custom/components.js');

$rjs = new ReactJS($react_source, $app_source);
$rjs->setComponent('MyComponent', array(
  'any'   =>  1,
  'props' =>  2
  )
);

// print rendered markup
echo '<div id="here">' . $rjs->getMarkup() . '</div>';

// load JavaScript somehow - concatenated, from CDN, etc
// including react.js and custom/components.js

// init client
echo '<script>' . $rjs->getJS("#here") . '</script>'; 

// repeat setComponent(), getMarkup(), getJS() as necessary
// to render more components

The power of combining React with any server-side scripting language is the ability to feed React with data, and apply your business logic on the server as well as the client side. Renovating an old application into a Reactive app has never been easier!

Using PHP + Alto Router

For an example application, take a look at this repository on GitHub .

Configure your AltoRouter as so:

<?php
// Router setup
require_once 'include/AltoRouter/AltoRouter.php';
$router = new AltoRouter();
$viewPath = 'views/';

// Router matches
//---
// Manual
$router->map('GET', '/', $viewPath . 'reactjs.html', 'reactjs');

$result = $viewPath . '404.php';

$match = $router->match();
if($match) {
	$result = $match['target'];
}

// Return route match 
include $result;

?>

With the AltoRouter setup serving your application’s pages for the routes specified, you can then just include your React code inside the HTML markup and begin using your components.

JavaScript:

"use strict";

var Comment = React.createClass({
  displayName: "Comment",

  render: function render() {
    var rawMarkup = marked(this.props.children.toString(), { sanitize: true });
    return React.createElement(
      "div",
      { className: "comment" },
      React.createElement(
        "h2",
        { className: "commentAuthor" },
        this.props.author
      ),
      React.createElement("span", { dangerouslySetInnerHTML: { __html: rawMarkup } })
    );
  }
});

Ensure you include the React libraries and also place the HTML inside the body tag that will be served from your PHP AltoRouter app, for example:

<!DOCTYPE html>
<html>
  <head>
    <title>React Example</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.0/react.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.13.0/JSXTransformer.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/0.3.2/marked.min.js"></script>
  </head>
  <body>
    <div id="myContent"></div>
    <script type="text/jsx;harmony=true" src="assets/js/main.js"></script>
  </body>
</html>

Laravel Users

For the highly popular PHP framework Laravel, there is the react-laravel library, which enables React.js from right inside your Blade views.

For example:

@react_component('Message', [ 'title' => 'Hello, World' ], [ 'prerender' => true ])

The prerender flag tells Laravel to render the component on the server side and then mount it to the client side.

Example Laravel 5.2 + React App

Look at this excellent starter repository for an example of getting Laravel + React working by Spharian.

To render your React code inside your Laravel, set your React files’ source inside the index.blade.php body tag, by adding the following for example:

<script src="{{ asset('js/my-react-code.js') }}"></script>

.NET

Using the ReactJS.NET framework, you can easily introduce React into your .NET application.

Install the ReactJS.NET package to your Visual Studio IDE via the NuGET package manager for .NET.

Search the available packages for ‘ReactJS.NET (MVC 4 and 5)’ and install. You will now be able to use any .jsx extension code in your asp.net app.

Add a new controller to your project to get started with React + .NET, and select “Empty MVC Controller” for your template. Once it is created, right click on return View() and add a new view with the following details:

  • View name: Index
  • View Engine: Razor (CSHTML)
  • Create a strongly-typed view: Unticked
  • Create as a partial view: Unticked
  • Use a layout or master page: Unticked

Now you can replace the default code with the following:

@{
    Layout = null;
}
<html>
<head>
    <title>Hello React</title>
</head>
<body>
    <div id="content"></div>
    <script src="https://fb.me/react-15.0.1.js"></script>
    <script src="https://fb.me/react-dom-15.0.1.js"></script>
    <script src="@Url.Content("~/Scripts/Example.jsx")"></script>
</body>
</html>

Now we need to create the Example.jsx referenced above, so create the file in your project and add your JSX as follows:

var CommentBox = React.createClass({
  render: function() {
    return (
      <div className="commentBox">
        Hello, world! I am a CommentBox.
      </div>
    );
  }
});
ReactDOM.render(
  <CommentBox />,
  document.getElementById('content')
);

Now if you click Play in your Visual Studio IDE, you should see the Hello World comment box example.

Here’s a detailed tutorial on writing a component for asp.net.

Rails

By using react-rails , you can easily add React to any Rails (3.2+) application. To get started, just add the gem:

gem 'react-rails', '~> 1.7.0'

and install:

bundle install

Now you can run the installation script:

rails g react:install

This will result in two things:

  • A components.js manifest file in app/assets/javascripts/components/ ; this is where you will put all your components code.
  • Adding the following to your application.js :
//= require react
//= require react_ujs
//= require components

Now .jsx code will be rendering, and you can add a block of React to your template, for example:

<%= react_component('HelloMessage', name: 'John') %>
<!-- becomes: -->
<div data-react-class="HelloMessage" data-react-props="{"name":"John"}"></div>

Ruby JSX

Babel is at the heart of the Ruby implementation of the react-rails gem, and can be configured as so:

config.react.jsx_transform_options = {
  blacklist: ['spec.functionName', 'validation.react', 'strict'], # default options
  optional: ["transformerName"],  # pass extra babel options
  whitelist: ["useStrict"] # even more options
}

Once react-rails is installed into your project, restart your server and any .js.jsx files will be transformed in your asset pipeline.

For more information on react-rails , go to the official documentation .

Python

To install python-react , use pip like so:

pip install react

You can now render React code with a Python app by providing the path to your .jsx components and serving the app with a render server. Usually this is a separate Node.js process.

To run a render server, follow this easy short guide .

Now you can start your server as so:

node render_server.js

Start your python application:

python app.py

And load up http://127.0.0.1:5000 in a browser to see your React code rendering.

Django

Add react to your INSTALLED_APPS and provide some configuration as so:

INSTALLED_APPS = (
    # ...
    'react',
)

REACT = {
    'RENDER': not DEBUG,
    'RENDER_URL': 'http://127.0.0.1:8001/render',
}

Meteor

To add React to your meteor project, do so via:

meteor npm install --save react react-dom

Then in client/main.jsx add the following for example:

import React from 'react';
import { Meteor } from 'meteor/meteor';
import { render } from 'react-dom';
 
import App from '../imports/ui/App.jsx';
 
Meteor.startup(() => {
  render(<App />, document.getElementById('render-target'));
});

This is instantiating an App React component, which you will define in imports/ui/App.jsx , for example:

import React, { Component } from 'react';

import Headline from './Headline.jsx';

// The App component - represents the whole app
export default class App extends Component {
  getHeadlines() {
    return [
      { _id: 1, text: 'Legalisation of medical marijuana goes worldwide!' },
      { _id: 2, text: 'Matt Brown goes inside the cult of scientology' },
      { _id: 3, text: 'The deep web: A criminals dream or fascinating freedom?' },
    ];
  }
 
  renderHeadlines() {
    return this.getHeadlines().map((headline) => (
      <Headline key={headline._id} headline={headline} />
    ));
  }
 
  render() {
    return (
      <div className="container">
        <header>
          <h1>The latest headlines</h1>
        </header>
 
        <ul>
          {this.renderHeadlines()}
        </ul>
      </div>
    );
  }
}

Inside the Headline.jsx , you use the following code:

import React, { Component, PropTypes } from 'react';
 
// Headline component - this will display a single news headline item from a iterated array
export default class Headline extends Component {
  render() {
    return (
      <li>{this.props.headline.text}</li>
    );
  }
}
 
Headline.propTypes = {
  // This component gets the headline to display through a React prop.
  // We can use propTypes to indicate it is required
  headline: PropTypes.object.isRequired,
};

Meteor is ready for React and has official documentation .

No More {{handlebars}}

An important point to note: When using Meteor with React, the default {{handlebars}} templating system is no longer used as it is defunct due to React being in the project.

So instead of using {{> TemplateName}} or Template.templateName for helpers and events in your JS, you will define everything in your View components, which are all subclasses of React.component .

Conclusion

React can be used in practically any language which utilises an HTML presentation layer. The benefits of React can be fully exploited by a plethora of potential software products.

React makes the UI View layer become component-based. Working logically with any stack means that we have a universal language for interface that designers across all facets of web development can utilise.

React unifies our projects’ interfaces, branding and general contingency across all deployments, no matter the device or platform restraints. Also in terms of freelance, client-based work or internally inside large organisations, React ensures reusable code for your projects.

You can create your own bespoke libraries of components and get working immediately inside new projects or renovate old ones, creating fully reactive isometric application interfaces quickly and easily.

React is a significant milestone in web development, and it has the potential to become an essential tool in any developer’s collection. Don’t get left behind.





About List