RedwoodJS

v0.21.0

# Assets and Files

There are two methods for adding assets to a Redwood app:

i) Webpack imports and ii) directly adding to the /public folder.

# Importing Assets

In general, it's best to import files directly into a template, page or component. This allows Webpack to include that file in the bundle, ensuring correct processing for the distribution folder while providing error checks and correct paths along the way.

# Example Asset Import with Webpack

Using import, we can do the following:

import React from 'react'
import logo from './my-logo.jpg'

function Header() {
  return <img src={logo} alt="Logo" />
}

export default Header

Webpack will correctly handle the file path and add the file to the distribution folder within /dist/media (created when Webpack builds for production).

Note: In this example, the file my-logo.jpg is located in the same directory as the component. This is recommended practice to keep all files related to a component in a single directory.

Behind the scenes, we are using Webpack's "file-loader" and "url-loader" (which transforms images less than 10kb into data URIs for improved performance).

# Directly Adding Assets using the "Public" Folder

Alternately, you can add files directly to the folder "web/public", effectively adding static files to your app. All included files and folders will be copied into the production build web/dist folder. They will also be available during development when you run yarn rw dev.

Because assets in this folder are bypassing the javascript module system, this folder should be used sparingly for assets such as favicons, robots.txt, manifests, libraries incompatible with Webpack, etc.

Note: files will not hot reload while the development server is running. You'll need to manually stop/start to access file changes.

Behind the scenes, Redwood is using Webpack's "copy-webpack-plugin".

# Example Use

Assuming public/ includes the following:

  • favicon.png
  • static-files/my-logo.jpg

Running yarn build will copy the file favicon.png to /dist/favicon.png. The new directory with file static-files/my-logo.jpg will be copied to /dist/static-files/my-logo.jpg. These can be referenced in your code directly without any special handling, e.g.

<link rel="icon" type="image/png" href="/favicon.png" />

and

<img src="/static-files/my-logo.jpg" alt="Logo" />

Note: because the directory dist/ becomes your production root, it should not be included in the path.