Skip to content
GitHub

Installation

This guide covers how to install and configure Effectify SolidJS packages in your project.

We recommend using your preferred package manager. All examples use npm, but you can substitute with yarn, pnpm, or bun.

Effect integration with TanStack Query for SolidJS:

npm install @effectify/solid-query

Peer Dependencies:

npm install @tanstack/solid-query effect solid-js

UI component library with Kobalte and Tailwind CSS:

npm install @effectify/solid-ui

Peer Dependencies:

npm install solid-js tailwindcss @kobalte/core

Real-time chat components:

npm install @effectify/chat-solid

Peer Dependencies:

npm install @effectify/solid-query @effectify/chat-domain solid-js
  1. Create a new SolidJS project:
npm create solid@latest my-app
cd my-app
npm install @effectify/solid-query @tanstack/solid-query effect
  1. Configure TanStack Query in src/index.tsx:
import { render } from "solid-js/web"
import { QueryClient, QueryClientProvider } from "@tanstack/solid-query"
import App from "./App"

const queryClient = new QueryClient()

render(
  () => (
    <QueryClientProvider client={queryClient}>
      <App />
    </QueryClientProvider>
  ),
  document.getElementById("root")!,
)
  1. Create a new SolidStart project:
npm create solid@latest my-app -- --template solid-start
cd my-app
npm install @effectify/solid-query @tanstack/solid-query effect
  1. Create src/root.tsx:
// @refresh reload
import { Suspense } from "solid-js"
import { Body, ErrorBoundary, FileRoutes, Head, Html, Meta, Routes, Scripts, Title } from "solid-start"
import { QueryClient, QueryClientProvider } from "@tanstack/solid-query"

const queryClient = new QueryClient()

export default function Root() {
  return (
    <Html lang="en">
      <Head>
        <Title>SolidStart - With Effectify</Title>
        <Meta charset="utf-8" />
        <Meta name="viewport" content="width=device-width, initial-scale=1" />
      </Head>
      <Body>
        <Suspense>
          <ErrorBoundary>
            <QueryClientProvider client={queryClient}>
              <Routes>
                <FileRoutes />
              </Routes>
            </QueryClientProvider>
          </ErrorBoundary>
        </Suspense>
        <Scripts />
      </Body>
    </Html>
  )
}
  1. Add SolidJS to your Astro project:
npx astro add solid
npm install @effectify/solid-query @tanstack/solid-query effect
  1. Create a provider component:
// src/components/QueryProvider.tsx
import { QueryClient, QueryClientProvider } from "@tanstack/solid-query"
import type { ParentComponent } from "solid-js"

const queryClient = new QueryClient()

export const QueryProvider: ParentComponent = (props) => {
  return (
    <QueryClientProvider client={queryClient}>
      {props.children}
    </QueryClientProvider>
  )
}
  1. Use in your Astro pages:
---
// src/pages/index.astro
---

<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Astro + SolidJS + Effectify</title>
  </head>
  <body>
    <QueryProvider client:load>
      <App client:load />
    </QueryProvider>
  </body>
</html>

If you’re using @effectify/solid-ui, you’ll need to configure Tailwind CSS:

  1. Install Tailwind CSS:
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
  1. Configure tailwind.config.js:
/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./src/**/*.{js,ts,jsx,tsx}",
    "./node_modules/@effectify/solid-ui/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
  1. Add Tailwind directives to your CSS:
/* src/index.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
  1. Import the CSS in your entry file:
// src/index.tsx
import "./index.css"

Ensure your tsconfig.json includes proper configuration for SolidJS:

{
  "compilerOptions": {
    "target": "ESNext",
    "lib": ["DOM", "DOM.Iterable", "ESNext"],
    "allowJs": false,
    "skipLibCheck": true,
    "esModuleInterop": false,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "module": "ESNext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "preserve",
    "jsxImportSource": "solid-js",
    "types": ["vite/client"]
  },
  "include": ["src"],
  "references": [{ "path": "./tsconfig.node.json" }]
}

For optimal development experience, configure Vite:

// vite.config.ts
import { defineConfig } from "vite"
import solid from "vite-plugin-solid"

export default defineConfig({
  plugins: [solid()],
  server: {
    port: 3000,
  },
  build: {
    target: "esnext",
  },
})

Install the SolidJS DevTools browser extension for better debugging:

// src/App.tsx
import { DEV } from "solid-js"

function App() {
  // DevTools will automatically connect in development
  return <YourAppComponents />
}

Add query devtools for debugging queries:

import { SolidQueryDevtools } from "@tanstack/solid-query-devtools"

function App() {
  return (
    <QueryClientProvider client={queryClient}>
      <YourAppComponents />
      <SolidQueryDevtools initialIsOpen={false} />
    </QueryClientProvider>
  )
}

Create a simple component to verify everything is working:

// src/components/TestComponent.tsx
import { createResource } from "solid-js"
import { Effect } from "effect"

const testEffect = Effect.succeed("Effectify with SolidJS is working!")

export function TestComponent() {
  const [data] = createResource(() => Effect.runPromise(testEffect))

  return <div>{data()}</div>
}

Add it to your App:

// src/App.tsx
import { TestComponent } from "./components/TestComponent"

function App() {
  return (
    <div>
      <h1>My SolidJS + Effectify App</h1>
      <TestComponent />
    </div>
  )
}

export default App

If you see “Effectify with SolidJS is working!” rendered, your installation is successful!

Configure your bundler to tree-shake unused Effect modules:

// vite.config.ts
export default defineConfig({
  plugins: [solid()],
  build: {
    rollupOptions: {
      external: (id) => {
        // Externalize large dependencies if needed
        return false
      },
    },
  },
})

Use dynamic imports for large Effect modules:

import { lazy } from "solid-js"

const HeavyComponent = lazy(() => import("./HeavyComponent"))

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <HeavyComponent />
    </Suspense>
  )
}
  1. JSX Transform Issues: Make sure jsxImportSource is set to "solid-js" in tsconfig.json
  2. Hydration Mismatches: Ensure server and client render the same content
  3. Effect Import Errors: Check that all peer dependencies are installed
  4. Build Failures: Verify your Vite/bundler configuration supports SolidJS