Rehackt: React Server Components Hook Hider
Rehackt is an advanced utility library designed for JavaScript/TypeScript library developers working with Next.js and React Server Components (RSC). Its primary function is to invisibly wrap the `react` package, allowing shared imports that contain React hooks (e.g., `useState`, `useEffect`) to be used in server-side Next.js codebases without triggering static analysis errors from the Next.js build process. This prevents common build failures where RSC compilers erroneously flag client-side hooks in modules that are not intended for server-side execution but are imported into a server context. The package is currently at version `0.1.0` and appears to have an active, albeit niche, release cadence driven by changes in React's internal APIs related to RSC. Its key differentiator is solving a specific interop problem for libraries that need to expose both client and server functionalities and manage the RSC static analysis rules without extensive code splitting or dual packages. It does not enable actual hook execution on the server; it only circumvents build-time errors.
Common errors
-
ReactServerComponentsError: You're importing a component that needs useState. It only works in a Client Component but none of its parents are marked with "use client", so they're Server Components by default.
cause A module containing a client-side React hook (e.g., `useState`) is being imported into a server-side file or a module that is transitively imported by a server-side file, triggering a static analysis error by the Next.js build process.fixReplace the import of client-side React hooks (e.g., `import { useState } from "react";`) with `import { useState } from "rehackt";` in the shared module.
Warnings
- gotcha Rehackt is an advanced tool primarily intended for library developers to solve specific interop issues with Next.js Server Components. It is not generally recommended for application-level code.
- breaking React 19 Canary renamed internal fields `__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED` to `__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE` and `__SERVER_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE`. Older versions of `rehackt` might break when used with React 19 Canary.
- gotcha Using `rehackt` does NOT enable the usage of React hooks (like `useState` or `useEffect`) in server-only code. It solely prevents build-time errors caused by static analysis when a module containing a hook reference is imported into a server context.
Install
-
npm install rehackt -
yarn add rehackt -
pnpm add rehackt
Imports
- useState
const { useState } = require('rehackt');import { useState } from 'rehackt'; - useEffect
import React from 'rehackt'; React.useEffect(...)
import { useEffect } from 'rehackt'; - Fragment
import { Fragment } from 'react';import { Fragment } from 'rehackt';
Quickstart
import { useState } from "rehackt";
export const data = {
useForm: <T>(val: T) => {
useState(val)
},
name: "server"
}
// This shared module can now be imported into a server-side file (e.g., a Next.js server action)
// without triggering a React Server Components error, even though it contains a client-side hook reference.
// For example, in 'action.ts':
// "use server"
// import { data } from './shared-code';
// export default async function someAction() {
// return 'Hello ' + data.name;
// }