SOLNM
  • Introduction
  • Technology
    • CMv3 & UI
    • Dapp
    • Wallet adapter
    • WebSockets
    • React app
    • Web3.js
    • Metaplex
    • Mpl Candy Machine
    • JSON-RPC
    • Geyser plugin postgres
  • Drops
    • Basic Drop
    • Plus Drop
    • Advanced Drop
  • NFT Tickets solution
  • NFT Payments
  • Collect Whitelists
  • NFT assets
  • Fees and Commission
  • SOLPAD PASS
  • SOLNM SPL Token
  • Airdrop
  • Whitepaper
  • Roadmap
  • FAQ
  • Terms
  • Privacy
  • Jobs
    • Affiliate Marketing
  • Linkedin
  • Twitter
  • Telegram
  • Discord
  • Github
Powered by GitBook
On this page
  • Requires
  • Quick Start
  • Usage
  • Customization
  • npm Private Packages
  • Troubleshooting
  • Version compatibility
  • Architecture 🏙
  1. Technology

React app

PreviousWebSocketsNextWeb3.js

Last updated 1 year ago

Requires

Quick Start

Ensure requirements are met, then execute the following in a terminal.

✏️ Replace $APP_NAME with the name for your unique app.

npx create-react-app@3.x $APP_NAME
cd $APP_NAME
heroku create $APP_NAME --buildpack mars/create-react-app
git push heroku master
heroku open

Once deployed, continue development 🌱

For explanation about these steps, continue reading the next section.

Usage

Generate a React app

✏️ Replace $APP_NAME with the name for your unique app.

npx create-react-app@3.x $APP_NAME
cd $APP_NAME
  • as of create-react-app v3, it automatically performs git init and an initial commit

Create the Heroku app

✏️ Replace $APP_NAME with the name for your unique app.

heroku create $APP_NAME --buildpack mars/create-react-app

This command:

Deploy ♻️

…or if you are ever working on a branch other than master:

✏️ Replace $BRANCH_NAME with the name for the current branch.

git push heroku $BRANCH_NAME:master

Visit the app's public URL in your browser

Visit the Heroku Dashboard for the app

Continue Development

Then, git commit your changes & git push heroku master ♻️

Push to Github

Testing

Minimal app.json

{
  "buildpacks": [
    {
      "url": "mars/create-react-app"
    }
  ]
}

Customization

Procfile

🚦 If replacing the default web process, please check this buildpack's Purpose to avoid misusing this buildpack (such as running a Node server) which can lead to confusing deployment issues.

Web server

The config file static.json should be committed at the root of the repo. It will not be recognized, if this file in a sub-directory

The default static.json, if it does not exist in the repo, is:

{
  "root": "build/",
  "routes": {
    "/**": "index.html"
  }
}

Changing the root

If a different web server "root" is specified, such as with a highly customized, ejected create-react-app project, then the new bundle location may need to be set to enable runtime environment variables.

Routing

🚥 Client-side routing is supported by default. Any server request that would result in 404 Not Found returns the React app.

HTTPS-only

Enforce secure connections by automatically redirecting insecure requests to https://, in static.json:

{
  "root": "build/",
  "routes": {
    "/**": "index.html"
  },
  "https_only": true
}

Strict transport security (HSTS)

⚠️ Do not set HSTS headers if the app's hostname will not permantly support HTTPS/SSL/TLS. Once HSTS is set, switching back to plain HTTP will cause security errors in browsers that received the headers, until the max-age is reached. Heroku's built-in herokuapp.com hostnames are safe to use with HSTS.

{
  "root": "build/",
  "routes": {
    "/**": "index.html"
  },
  "https_only": true,
  "headers": {
    "/**": {
      "Strict-Transport-Security": "max-age=31557600"
    }
  }
}
  • max-age is the number of seconds to enforce HTTPS since the last connection; the example is one-year

Proxy

Proxy URL prefix

To make calls through the proxy, use relative URL's in the React app which will be proxied to the configured target URL. For the example URL prefix of /api/, here's how the proxy would rewrite the requests:

/api/search-items
  → https://backend.example.com/search-items
  
/api/users/me
  → https://backend.example.com/users/me

You may choose any prefix and may have multiple proxies with different prefixes.

Proxy for deployment

Add "proxies" to static.json:

{
  "root": "build/",
  "routes": {
    "/**": "index.html"
  },
  "proxies": {
    "/api/": {
      "origin": "${API_URL}"
    }
  }
}

Then, point the React UI app to a specific backend API:

heroku config:set API_URL="https://backend.example.com"

Proxy for local development

Add "proxy" to package.json:

{
  "proxy": {
    "/api": {
      "target": "http://localhost:8000",
      "pathRewrite": {
        "^/api": "/"
      }
    }
  }
}

Replace http://localhost:8000 with the URL to your local or remote backend service.

Environment variables

🚫🤐 Not for secrets. These values may be accessed by anyone who can see the React app.

heroku config:set REACT_APP_HELLO='I love sushi!'

Set vars for local dev

Requires at least create-react-app 0.7. Earlier versions only support Compile-time.

Create a .env file that sets a variable per line:

REACT_APP_API_URL=http://api.example.com
REACT_APP_CLIENT_ID=XyzxYzxyZ

Compile-time vs Runtime

Requirement

never changes for a build

✓

✓

✓

✓

ex: REACT_APP_BUILD_VERSION (static fact about the bundle)

✓

✓

ex: REACT_APP_API_URL (transient, external reference)

✓

✓

Compile-time configuration

☝️🤐 Use secrets carefully. If these values are embedded in the JavaScript bundle, like with REACT_APP_ vars, then they may be accessed by anyone who can see the React app.

import React, { Component } from 'react';

class App extends Component {
  render() {
    return (
      <code>Runtime env var example: { process.env.REACT_APP_HELLO }</code>
    );
  }
}

♻️ The app must be re-deployed for compiled changes to take effect, because during the build, these references will be replaced with their quoted string value.

heroku config:set REACT_APP_HELLO='I love sushi!'

git commit --allow-empty -m "Set REACT_APP_HELLO config var"
git push heroku master

Only REACT_APP_ vars are replaced in create-react-app's build. To make any other variables visible to React, they must be prefixed for the build command in package.json, like this:

REACT_APP_HEROKU_SLUG_COMMIT=$HEROKU_SLUG_COMMIT react-scripts build

Runtime configuration

🚫🤐 Not for secrets. These values may be accessed by anyone who can see the React app.

npm install @mars/heroku-js-runtime-env --save

Then, require/import it to use the vars within components:

import React, { Component } from 'react';
import runtimeEnv from '@mars/heroku-js-runtime-env';

class App extends Component {
  render() {
    // Load the env object.
    const env = runtimeEnv();

    // …then use values just like `process.env`
    return (
      <code>Runtime env var example: { env.REACT_APP_HELLO }</code>
    );
  }
}

⚠️ Avoid setting backslash escape sequences, such as , into Runtime config vars. Use literal UTF-8 values only; they will be automatically escaped.

Custom bundle location

If the javascript bundle location is customized, such as with an ejected created-react-app project, then the runtime may not be able to locate the bundle to inject runtime variables.

To solve this so the runtime can locate the bundle, set the custom bundle path:

heroku config:set JS_RUNTIME_TARGET_BUNDLE=/app/my/custom/path/js/*.js

To unset this config and use the default path for create-react-app's bundle, /app/build/static/js/*.js:

heroku config:unset JS_RUNTIME_TARGET_BUNDLE

Add-on config vars

🚫🤐 Be careful not to export secrets. These values may be accessed by anyone who can see the React app.

  1. create .profile.d/000-react-app-exports.sh

  2. make it executable chmod +x .profile.d/000-react-app-exports.sh

  3. add an export line for each variable:

    export REACT_APP_ADDON_CONFIG=${ADDON_CONFIG:-}
  4. set-up & use Runtime configuration to access the variables

export REACT_APP_FILEPICKER_API_KEY=${FILEPICKER_API_KEY:-}

npm Private Packages

Private modules are supported during build.

  1. Set your secret in the NPM_TOKEN config var:

    heroku config:set NPM_TOKEN=xxxxx

Troubleshooting

  1. Confirm that your app is using this buildpack:

    If it's not using create-react-app-buildpack, then set it:

    heroku buildpacks:set mars/create-react-app

    …and deploy with the new buildpack:

    git commit --allow-empty -m 'Switch to create-react-app-buildpack'
    git push heroku master

    If the error still occurs, then at least we know it's really using this buildpack! Proceed with troubleshooting.

  2. Check this README to see if it already mentions the issue.

  3. Search the internet for mentions of the error message and its subject module, e.g. ENOENT "node-sass"

    • build log output

    • link to GitHub repo with the source code (if private, grant read access to @mars)

Version compatibility

This buildpack will never intentionally cause previously deployed apps to become undeployable. Using master as directed in the main instructions will always deploy an app with the most recent version of this buildpack.

heroku buildpacks:set https://github.com/mars/create-react-app-buildpack.git#v6.0.0

♻️ Then, commit & deploy to rebuild on the new buildpack version.

Architecture 🏙

    • installs node, puts on the $PATH

    • node_modules/ cached between deployments

    • production build for create-react-app

      • exposes all env vars to the build script

      • generates a production bundle regardless of NODE_ENV setting

    • sets default web server config unless static.json already exists

    • enables runtime environment variables

General-purpose SPA deployment

This buildpack can deploy any SPA [single-page app] as long as it meets the following requirements:

  • npm run build performs the transpile/bundling

  • the file build/index.html or the root specified in static.json exists at runtime.

comes with npm 5.2+ and higher, see

if is installed locally, the new app will use it instead of

sets the & its default URL https://$APP_NAME.herokuapp.com

sets the app to use this

configures the in the local repo, so git push heroku master will push to this new Heroku app.

Find the app on .

Work with your app locally using npm start. See:

Eventually, to share, collaborate, or simply back-up your code, , and then follow the instructions shown on the repo to push an existing repository from the command line.

Use or whatever testing library you prefer.

is supported with minimal configuration. The CI integration is compatible with npm & yarn (see ).

Heroku CI uses to provision test apps. To support Heroku CI, commit this minimal example app.json:

Heroku apps may declare what processes are launched for a successful deployment by way of the . This buildpack's default process comes from . (See: 🏙 Architecture). The implicit Procfile to start the static web server is:

To customize an app's processes, commit a Procfile and deploy. Include web: bin/boot to launch the default web process, or you may replace the default web process. Additional may be added to run any number of dynos with whatever arbitrary commands you want, and scale each independently.

The web server may be .

👓 See .

Prevent downgrade attacks with . Add HSTS "headers" to static.json.

Proxy XHR requests from the React UI in the browser to API backends. Use to prevent same-origin errors when is not supported on the backend.

The (see: 🏙 Architecture) provides to utilize Nginx for high-performance proxies in production.

create-react-app itself provides a built-in . This may be configured to match the behavior of proxy for deployment.

are fully supported with this buildpack.

Two versions of variables are supported. In addition to compile-time variables applied during the app supports variables set at runtime, applied as each web dyno starts-up.

support for

updates immediately when setting new

different values for staging & production (in a )

ex: REACT_APP_DEBUG_ASSERTIONS ()

ex: REACT_APP_FILEPICKER_API_KEY ()

Supports all config vars, including , NODE_, NPM_, & HEROKU_ prefixed variables.

Use Node's .

Supports only prefixed variables.

Install the :

✳️ Note this path is a * glob, selecting multiple files, because as of create-react-app version 2 the .

Use a custom to make variables set by other components available to the React app by prefixing them with REACT_APP_.

For example, to use the API key for the JS image uploader:

Setup your app with a .npmrc file following .

Search our to see if someone else has experienced the same problem.

File a new . Please include:

, so you can lock an app to a specific version, if that kind of determinism pleases you:

✏️ Replace v6.0.0 with the desired .

This buildpack combines several buildpacks, specified in , to support zero-configuration deployment on Heroku:

version specified in

; create-react-app default is react-scripts build

customize further with

web server

configure with static.json (see also )

🚀 The runtime web process is the 's default processes. heroku-buildpack-static uses to launch its Nginx web server. Processes may be customized by committing a Procfile to the app.

pointed out that this buildpack is not necessarily specific to create-react-app.

Fork from
Heroku
command-line tools (CLI)
a free account
git
Node.js
npx
instructions for older npm versions
yarn
npm
app name
buildpack
heroku git remote
your dashboard
create-react-app docs
create an empty repo at Github
create-react-app's built-in Jest testing
app.json
Procfile
heroku/static buildpack
process types
configured via the static buildpack
custom routing w/ the static buildpack
HTTP strict transport security
CORS
heroku/static buildpack
Proxy Backends configuration
proxy for development
REACT_APP_* environment variables
Set vars on Heroku
build
REACT_APP_
process.env object
REACT_APP_
runtime env npm package
bundle is split
.profile.d script
Filestack
npm's guide for CI/deployment
issues
issue
Releases are tagged
release tag
heroku/nodejs buildpack
package.json, engines.node
executes the npm package's build script
Node.js build configuration
mars/create-react-app-inner-buildpack
heroku/static buildpack
Nginx
all static web server config
last buildpack
bin/boot
Some kind feedback
Compile-time
Runtime
Add-on config vars
continuous delivery
config vars
pipeline
prune code from bundle
Heroku CI
bin/test
.buildpacks