carlo-cra v1.1.1
carlo-cra
Add carlo capabilities to any react app built with Create React App.
- Add OS capabilities to your react app using Node.
- Bundle your react app into a single executable. (Thanks to pkg)
Getting started
Install carlo-cra
yarn add carlo-cra
#npm i carlo-craEdit your package.json start script to run your app inside carlo instead of your system browser:
"scripts": {
- "start": "react-scripts start",
+ "start": "BROWSER=./node_modules/carlo-cra/start.js react-scripts start",
"build": "react-scripts build",
+ "bundle": "carlo-cra-bundle",Run yarn start and you'll see your react app running inside carlo:

Add Node capabilities to your app
Create a file in carlo/index.js, and export the functions you want to expose from node to your react app:
const backend = {
sum(a, b) {
// this sum runs in the node process
return a + b;
},
getEnv() {
// access to OS info
return process.env;
}
};
module.exports = backend;To access to backend from your react components, carlo-cra gives you a BackendContext. To use it, include the provider in your app:
+import Backend from "carlo-cra/backend-context";
-ReactDOM.render(<App />, document.getElementById('root'));
+ReactDOM.render(
+ <Backend.Provider>
+ <App />
+ </Backend.Provider>,
+ document.getElementById("root")
+);And use it in your components:
+import BackendContext from "carlo-cra/backend-context";
class App extends Component {
+ state = { env: null };
render() {
+ const { env } = this.state;
return (
<div className="App">
<header className="App-header">
@@ -19,6 +22,21 @@ class App extends Component {
>
Learn React
</a>
+ <BackendContext.Consumer>
+ {backend => (
+ <div>
+ <button
+ onClick={async () => {
+ const env = await backend.getEnv();
+ this.setState({ env });
+ }}
+ >
+ load env
+ </button>
+ {env && <pre>{JSON.stringify(env, null, 2)}</pre>}
+ </div>
+ )}
+ </BackendContext.Consumer>
</header>
</div>
);Or with react hooks:
const [env, setEnv] = useState(null);
const backend = useContext(BackendContext);
useEffect(() => {
backend.getEnv().then(env => {
setEnv(env);
});
}, []);You can even create a custom useEnv hook ;)

Bundle your app into a single executable file
yarn build
yarn bundleThis will generate an executable file with the name of your app:
./react-appConfig
By default carlo-cra will look for your node backend in carlo/index.js file, but you can configure this in your package.json:
"carlo-cra": {
"index": "carlo/index.js",
"srcDir": "carlo"
},index is the file that carlo-cra will expose to your client app.
srcDir is the directory where the backend code is. carlo-cra will watch file changes in this dir to reload the dev environment. We recommend index file to be inside srcDir folder.