Code sharing
If you are using the player, a common desire is to share the code with your Remotion Preview and/or server-side rendering. With the correct setup, you can write the component once and use it for previewing, displaying and rendering.
Remotion and your React app use a different Webpack config. Therefore, if you want to override your Webpack configuration, you need to override both the Remotion one and the React app one.
Setup
Set up a React project with your preferred setup, such as Create React App or Next.JS.
When your project is setup, add the necessary Remotion dependencies:
- npm
- yarn
- pnpm
bash
bash
bash
bash
bash
bash
Afterwards, create a subfolder for Remotion within your project and add three files: An index file, a Video.tsx file for your list of compositions, and a file with your composition. It could look like this:
diff
diff
Your composition (remotion/MyComp.tsx in the example) could look for example like this:
tsxMyComp :React .FC <{text : string }> = ({text }) => {return <div >Hello {text }!</div >;};
tsxMyComp :React .FC <{text : string }> = ({text }) => {return <div >Hello {text }!</div >;};
Your list of videos (remotion/Video.tsx in the example) could look like this:
tsxReact from "react";import {Composition } from "remotion";import {MyComp } from "./MyComp";export constMyVideo = () => {return (<><Composition component ={MyComp }durationInFrames ={120}width ={1920}height ={1080}fps ={30}id ="my-comp"defaultProps ={{text : "World" }}/></>);};
tsxReact from "react";import {Composition } from "remotion";import {MyComp } from "./MyComp";export constMyVideo = () => {return (<><Composition component ={MyComp }durationInFrames ={120}width ={1920}height ={1080}fps ={30}id ="my-comp"defaultProps ={{text : "World" }}/></>);};
Your index file (remotion/index.tsx in the example) could look like this:
tsx
tsx
Don't move these statements together into one file, as you might break Fast Refresh.
Using Remotion Preview
You can open the Remotion Preview using the npx remotion preview command:
bash
bash
We recommend adding a new script into your package.json for easy access:
diff
diff
Adding <Player /> to your app
Anywhere in your app, import the <Player /> component and your Composition component.
tsxPlayer } from "@remotion/player";import {MyComp } from "./remotion/MyComp";export constApp :React .FC = () => {return (<Player component ={MyComp }inputProps ={{text : "World" }}durationInFrames ={120}compositionWidth ={1920}compositionHeight ={1080}fps ={30}style ={{width : 1280,height : 720,}}controls />);};
tsxPlayer } from "@remotion/player";import {MyComp } from "./remotion/MyComp";export constApp :React .FC = () => {return (<Player component ={MyComp }inputProps ={{text : "World" }}durationInFrames ={120}compositionWidth ={1920}compositionHeight ={1080}fps ={30}style ={{width : 1280,height : 720,}}controls />);};
Pass your React component directly to the component prop. Don't pass the list of compositions.
If everything worked, you can now run your webapp and preview your video.
Creating a bundle for server-side rendering
In any Node.JS context, you can call bundle() to bundle your video using Webpack and to server-side render the video. You need to add @remotion/bundler to your package.json for this.
server.tsxtspath from "path";import {bundle } from "@remotion/bundler";constbundled = awaitbundle (path .join (process .cwd (), "src", "remotion", "index.tsx"));
server.tsxtspath from "path";import {bundle } from "@remotion/bundler";constbundled = awaitbundle (path .join (process .cwd (), "src", "remotion", "index.tsx"));
See Server-side rendering for a full example.
When using Lambda, you don't need this, you can use the CLI or deploySite() which will bundle the video for you.