npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-wp-ssr

v0.0.3

Published

Server-side rendering for React-based WordPress plugins and themes.

Downloads

8

Readme

react-wp-ssr

Server-side rendering for React-based WordPress plugins and themes.

Requirements

react-wp-ssr works best when used with react-wp-scripts to handle the various build processes.

For local development, we recommend the v8js extension for Chassis.

Quick Start

You should already have a React-based WP project ready to adapt, using react-wp-scripts.

Step 1: Add backend library

Add this repository to your project, either with git submodules or Composer. You'll then need to load it into your project:

require_once __DIR__ . '/vendor/react-wp-ssr/namespace.php';

Step 2: Add backend render call

In PHP, call ReactWPSSR\render() wherever you want to render your app. (Do not include the container yourself.)

For themes, the best practice is to create a minimal index.php:

<?php

get_header();

ReactWPSSR\render( get_stylesheet_directory() );

get_footer();

Step 3: Add frontend library

Add react-wp-ssr to your node modules:

npm install --save react-wp-ssr

Step 4: Replace frontend render call

In your JavaScript file, replace your ReactDOM.render call with a call to react-wp-ssr's render:

import React from 'react';
import render from 'react-wp-ssr';

import App from './App';

render( () => <App /> );

Developing with react-wp-ssr

By default, react-wp-ssr does not render on the server during development (i.e. with WP_DEBUG set to true), as it uses your built script; during development, your built script will tend to be behind your live development script, and this will cause hydration errors.

When you do want to test, there are two constants you can use to control react-wp-ssr:

// Define as `true` to render on the server, even during development.
define( 'SSR_DEBUG_ENABLE', false );

// Define as `true` to only render on the server and skip loading the script.
// Useful to check the server is correctly rendering.
define( 'SSR_DEBUG_SERVER_ONLY', false );

Detecting the Environment

The callback you pass to render will receive the current environment as a parameter, allowing you to change what you render when you need to:

import { BrowserRouter, StaticRouter } from 'react-router-dom';

render( environment => {
	const Router = environment === 'server' ? StaticRouter : BrowserRouter;
	const routerProps = environment === 'server' ? { location: window.location } : {};

	return <Router { ...routerProps }>
		<App />
	</Router>;
} );

(Note that this should be used sparingly, as React's hydration will complain if the HTML does not match what it expects.)

You can also use the onFrontend and onBackend functions to run callbacks only in a single environment if you need.