Maison  >  Article  >  interface Web  >  Remix + Express + TS

Remix + Express + TS

WBOY
WBOYoriginal
2024-09-10 11:33:43325parcourir

Remix + Express + TS

Comment ajouter TypeScript à un projet Remix + Express

Bonjour ! Dans cet article, je vais vous guider à travers les étapes pour ajouter TypeScript à un projet passe-partout Remix + Express. À la fin de ce didacticiel, vous disposerez d'une application Remix entièrement fonctionnelle fonctionnant avec Express et Typescript. Vous pouvez trouver le code final ici.

Étape 1 : Cloner le démarreur express officiel

Tout d'abord, commençons par cloner le modèle de démarrage officiel de Remix Express :

npx create-remix@latest --template remix-run/remix/templates/express

Étape 2 : ajouter les dépendances requises

Ensuite, installez les dépendances supplémentaires nécessaires à la prise en charge de TypeScript :

npm install -D esbuild tsx

Étape 3 : Créer un fichier serveur TypeScript

Supprimez le fichier server.js existant et créez un nouveau fichier nommé server/index.ts.

Ensuite, copiez et collez le code suivant dans server/index.ts :

// server/index.ts
import { createRequestHandler } from "@remix-run/express";
import { type ServerBuild } from "@remix-run/node";
import compression from "compression";
import express from "express";
import morgan from "morgan";

const viteDevServer =
  process.env.NODE_ENV === "production"
    ? undefined
    : await import("vite").then((vite) =>
        vite.createServer({
          server: { middlewareMode: true },
        })
      );

const app = express();

app.use(compression());

// http://expressjs.com/en/advanced/best-practice-security.html#at-a-minimum-disable-x-powered-by-header
app.disable("x-powered-by");

// handle asset requests
if (viteDevServer) {
  app.use(viteDevServer.middlewares);
} else {
  // Vite fingerprints its assets so we can cache forever.
  app.use(
    "/assets",
    express.static("build/client/assets", { immutable: true, maxAge: "1y" })
  );
}

// Everything else (like favicon.ico) is cached for an hour. You may want to be
// more aggressive with this caching.
app.use(express.static("build/client", { maxAge: "1h" }));

app.use(morgan("tiny"));

async function getBuild() {
  try {
    const build = viteDevServer
      ? await viteDevServer.ssrLoadModule("virtual:remix/server-build")
      : // @ts-expect-error - the file might not exist yet but it will
        // eslint-disable-next-line import/no-unresolved
        await import("../build/server/remix.js");

    return { build: build as unknown as ServerBuild, error: null };
  } catch (error) {
    // Catch error and return null to make express happy and avoid an unrecoverable crash
    console.error("Error creating build:", error);
    return { error: error, build: null as unknown as ServerBuild };
  }
}
// handle SSR requests
app.all(
  "*",
  createRequestHandler({
    build: async () => {
      const { error, build } = await getBuild();
      if (error) {
        throw error;
      }
      return build;
    },
  })
);

const port = process.env.PORT || 3000;
app.listen(port, () =>
  console.log(`Express server listening at http://localhost:${port}`)
);

Étape 4 : Mettre à jour la configuration de Vite

Pour construire le serveur Express une fois que Remix a terminé sa construction, mettez à jour votre fichier vite.config.ts avec le contenu suivant :

import { vitePlugin as remix } from "@remix-run/dev";
import { defineConfig } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";
import esbuild from "esbuild";

export default defineConfig({
  plugins: [
    remix({
      future: {
        v3_fetcherPersist: true,
        v3_relativeSplatPath: true,
        v3_throwAbortReason: true,
      },
      serverBuildFile: 'remix.js',
      buildEnd: async () => {
        await esbuild.build({
          alias: { "~": "./app" },
          outfile: "build/server/index.js",
          entryPoints: ["server/index.ts"],
          external: ['./build/server/*'],
          platform: 'node',
          format: 'esm',
          packages: 'external',
          bundle: true,
          logLevel: 'info',
        }).catch((error: unknown) => {
          console.error('Error building server:', error);
          process.exit(1);
        });
      }
    }),
    tsconfigPaths(),
  ],
});

Étape 5 : Mettre à jour les scripts NPM

Maintenant, mettez à jour les scripts de démarrage et de développement dans votre package.json :

"scripts": {
  "build": "remix vite:build",
  "dev": "tsx server/index.ts",
  "lint": "eslint --ignore-path .gitignore --cache --cache-location ./node_modules/.cache/eslint .",
  "start": "cross-env NODE_ENV=production node ./build/server/index.js",
  "typecheck": "tsc"
}

Conclusion

C'est ça ! Vous pouvez maintenant continuer à écrire votre code Remix comme d'habitude. Mais vous vous demandez peut-être : pourquoi auriez-vous besoin de cette configuration ? En utilisant Express, chaque requête passe par le serveur Express, vous permettant d'utiliser des middlewares Express pour transmettre des données à Remix, telles que le contexte utilisateur lors de la mise en œuvre de l'authentification.

Dans un prochain article, je vous montrerai comment ajouter Lucia-Auth à ce modèle ?.

Restez à l'écoute ! ?

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn