Installation
Requirements:
- TypeScript 5.4 or newer.
- Node.js 22.18 or newer, Deno, and Bun are supported.
Manual Installation
JavaScript runtimes
Follow these steps to create a new Effect project for Node.js, Bun, or Deno:
-
Create a project directory and navigate into it:
Terminal window mkdir hello-effectcd hello-effect -
Initialize a TypeScript project:
Terminal window npm init -ynpm install --save-dev typescriptTerminal window pnpm initpnpm add --save-dev typescriptTerminal window yarn init -yyarn add --dev typescriptTerminal window bun initTerminal window deno initThis creates a
package.jsonfile with an initial setup for your TypeScript project. For Bun, this also generates atsconfig.jsonfile. For Deno, this generates adeno.jsonfile.Make sure the
package.jsonfile contains the"type": "module"field, so that Node.js treats your source files as ES modules (bun initadds this automatically):{"type": "module"} -
Initialize TypeScript:
Terminal window npx tsc --initTerminal window pnpm tsc --initTerminal window yarn tsc --initbun inithas already generated atsconfig.jsonfile.Deno runs TypeScript out of the box, and
deno inithas already generated adeno.jsonfile withstrictmode enabled by default. No further configuration is needed.When running this command, it will generate a
tsconfig.jsonfile that contains configuration options for TypeScript. One of the most important options to consider is thestrictflag.Make sure to open the
tsconfig.jsonfile and verify that the value of thestrictoption is set totrue.{"compilerOptions": {"strict": true}} -
Install the necessary package as dependency:
Terminal window npm install effectTerminal window pnpm add effectTerminal window yarn add effectTerminal window bun add effectTerminal window deno add npm:effectThis package will provide the foundational functionality for your Effect project.
Let’s write and run a simple program to ensure that everything is set up correctly.
In your terminal, execute the following commands:
mkdir srctouch src/index.tsOpen the src/index.ts file and add the following code:
import { Effect, Console } from "effect"
const program = Console.log("Hello, World!")
Effect.runSync(program)Run the src/index.ts file. Node.js 22.18 or newer, Bun, and Deno can run TypeScript files directly, so no additional tooling is needed:
node src/index.tsnode src/index.tsnode src/index.tsbun src/index.tsdeno run src/index.tsIf you are using an older version of Node.js, run the file with tsx instead: npx tsx src/index.ts.
You should see the message "Hello, World!" printed. This confirms that the program is working correctly.
Vite + React
Follow these steps to create a new Effect project for Vite + React:
-
Scaffold your Vite project, open your terminal and run the following command:
Terminal window # npm 6.xnpm create vite@latest hello-effect --template react-ts# npm 7+, extra double-dash is needednpm create vite@latest hello-effect -- --template react-tsTerminal window pnpm create vite@latest hello-effect -- --template react-tsTerminal window yarn create vite@latest hello-effect -- --template react-tsTerminal window bun create vite@latest hello-effect -- --template react-tsTerminal window deno init --npm vite@latest hello-effect -- --template react-tsThis command will create a new Vite project with React and TypeScript template.
-
Navigate into the newly created project directory and install the required packages:
Terminal window cd hello-effectnpm installTerminal window cd hello-effectpnpm installTerminal window cd hello-effectyarn installTerminal window cd hello-effectbun installTerminal window cd hello-effectdeno installOnce the packages are installed, open the
tsconfig.jsonfile and ensure that the value of thestrictoption is set to true.{"compilerOptions": {"strict": true}} -
Install the necessary package as dependency:
Terminal window npm install effectTerminal window pnpm add effectTerminal window yarn add effectTerminal window bun add effectTerminal window deno add npm:effectThis package will provide the foundational functionality for your Effect project.
Now, let’s write and run a simple program to ensure that everything is set up correctly.
Open the src/App.tsx file and replace its content with the following code:
import { useState, useMemo, useCallback } from "react"import reactLogo from "./assets/react.svg"import viteLogo from "/vite.svg"import "./App.css"import { Effect } from "effect"
function App() { const [count, setCount] = useState(0)
const task = useMemo( () => Effect.sync(() => setCount((current) => current + 1)), [setCount] )
const increment = useCallback(() => Effect.runSync(task), [task])
return ( <> <div> <a href="https://vitejs.dev" target="_blank"> <img src={viteLogo} className="logo" alt="Vite logo" /> </a> <a href="https://react.dev" target="_blank"> <img src={reactLogo} className="logo react" alt="React logo" /> </a> </div> <h1>Vite + React</h1> <div className="card"> <button onClick={increment}>count is {count}</button> <p> Edit <code>src/App.tsx</code> and save to test HMR </p> </div> <p className="read-the-docs"> Click on the Vite and React logos to learn more </p> </> )}
export default AppAfter making these changes, start the development server by running the following command:
npm run devpnpm run devyarn run devbun run devdeno run devThen, press o to open the application in your browser.
When you click the button, you should see the counter increment. This confirms that the program is working correctly.