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

next-spaceace-wrapper

v0.13.0

Published

SpaceAce wrapper for Next.js

Downloads

12

Readme

SpaceAce wrapper for Next.js

Build status

Status

Seems to work fine with Next.js 4. Has problems with hot reloading in Next.js 5.

Forked from next-redux-wrapper

Usage

npm install next-spaceace-wrapper

Wrapper should be attached your page components (located in your project's /pages). For safety it is recommended that you wrap all pages, whether they use SpaceAce or not.

Here is an example minimal setup:

import React, {Component} from "react";
import withSpace from "next-spaceace-wrapper";

/**
* @param {object} initialState
* @param {boolean} options.isServer indicates whether it is a server side or client side
* @param {Request} options.req NodeJS Request object (if any)
* @param {boolean} options.debug User-defined debug mode param
* @param {string} options.spaceKey This key will be used to preserve the root space in global namespace for safe HMR
*/
const makeRootSpace = () => {
    return new Space({ env: process.env.NODE_ENV });
};

class Page extends Component {
    static getInitialProps({space, isServer, pathname, query}) {
        space.setState({ foo: bar }); // component will be able to read from space's state when rendered
        return { custom: 'custom' }; // you can also pass some additional custom props to components
    }
    render() {
        const { space } = this.props;
        const rootSpace = space.getRootSpace();
        return (
            <div>
                <div>Value from page’s Space {space.state.foo}</div>
                <div>Value from root space {rootSpace.state.env}</div>
                <div>Prop from getInitialProps {this.props.custom}</div>
            </div>
        )
    }
}

// It’s recommended to import `makeRootSpace` from a speparate module
// so that it can be shared between pages
Page = withSpace(makeRootSpace)(Page);

export default Page;

How it works

When you page component is wrapped by withSpace, it auto-creates the root space when getInitialProps is called by Next.js along with a sub-space dedicated to the page component (with the same name as the component). The page's space is passed down to the page's component as a prop called space. On the client side it also takes care of using same root space every time, whereas on server a new root space is created for each request, which is then set on the client.

The withSpace function accepts a makeRootSpace function as first argument. The makeRootSpace function will receive initial state as the first argument and should return a new instance Space each time when called, no memoization needed here, it is automatically handled by the withSpace wrapper. Pass the desired initial state for the page's space as the second parameter when calling withSpace.

withSpace also optionally accepts an object. In this case only 1 parameter is passed which can contain the following configuration properties:

  • createRootSpace (required, function) : the makeRootSpace function as described above
  • rootSpaceKey (optional, string) : the key used on window to persist the root space on the client
  • debug (optional, boolean) : enable debug logging

When makeRootSpace is invoked it is also provided a configuration object as the second parameter, which includes:

  • isServer (boolean): true if called while on the server rather than the client
  • req (Request): The next.js getInitialProps context req parameter
  • query (object): The next.js getInitialProps context query parameter

The object also includes all configuration as passed to withSpace if called with an object of configuration properties.

Use withSpace to wrap only top level pages! All other components should keep using subSpace(…)

Although it is possible to create server or client specific logic in both createRootSpace function and getInitialProps it is highly recommended to not have different behaviour. This may cause errors and checksum mismatches which in turn will ruin the whole purpose of server rendering.

I don't recommend to using withSpace in both top level pages and _document.js files, Next.JS does not provide a reliable way to determine the sequence when components will be rendered. So per Next.JS recommendation it is better to have just data-agnostic things in _document and wrap top level pages with another HOC that will use withSpace.

Async data in getInitialProps

function getInitialProps({space, isServer, pathname, query}) {
    const startingDataPromise = fetch(…).then(res => res.json());

    // once the data arrives we can resume and render the app
    return startingDataPromise.then((startingData) => {
        space.setState({ userId: startingData.userId });
        return {custom: 'custom'};
    });

}

Resources