Qualche giorno fa Rollup ha raggiunto la versione 3. Ho aggiornato alcuni miei progetti, ma non è stata una operazione indolore. Ci sono alcune modifiche da fare nel codice, e alcuni plugin da aggiornare. In questo post riporto i passi che ho seguito, sperando che possano essere utili anche a qualcun altro.

Per cominciare, in questo post uso come esempio un mio repository aggiornato più di un mese fa, MEMENTO - Svelte, Typescript & TailwindCSS, ma il processo è lo stesso per tutti i progetti che usano Rollup.

Per prima cosa controllo quali pacchetti sono da aggiornare, per questo uso il comando

npx npm-check-updates

In questo modo ottengo la lista dei pacchetti da aggiornare

Ora aggiorno i pacchetti

npx npm-check-updates -u
npm install

I primi problemi cominciano adesso. Ottengo una serie di messaggi di errore; estrapolando la parte importante posso ricavare 3 errori;

  • ERESOLVE overriding peer dependency
  • peer rollup@"1 || 2" from rollup-plugin-css-only@3.1.0
  • peer rollup@"^2.0.0" from rollup-plugin-terser@7.0.2

Sono collegati, perché ho due pacchetti che hanno come dipendenza rollup la versione 1 o 2. Per risolvere questo problema, devo aggiornare questi due pacchetti. Il problema è che al momento i due repository appaiono dormienti. Ho fatto per entrambi una pull request con una possibile soluzione. Spero che vengano aggiornati presto.

Nell’attesa ho creato due fork, con due pacchetti che dovrebbero risolvere il problema:

Quindi, disinstallo i due plugin problematici:

npm uninstall rollup-plugin-css-only rollup-plugin-terser

E li sostituisco con i miei fork

npm install @el3um4s/rollup-plugin-css-only @el3um4s/rollup-plugin-terser

Devo anche cambiare i riferimenti presenti nel file rollup.config.js:

import css from "@el3um4s/rollup-plugin-css-only";
import { terser } from "@el3um4s/rollup-plugin-terser";

invece di import css from "rollup-plugin-css-only"; e import { terser } from "rollup-plugin-terser";

Ora, se provo a lanciare il comando npm run dev ottengo un altro errore

[!] (plugin at position 8) ReferenceError: require is not defined
ReferenceError: require is not defined

In questo caso il problema è legato alla funzione serve:

function serve() {
  let server;

  function toExit() {
    if (server) server.kill(0);
  }

  return {
    writeBundle() {
      if (server) return;
      server = require("child_process").spawn(
        "npm",
        ["run", "start", "--", "--dev"],
        {
          stdio: ["ignore", "inherit", "inherit"],
          shell: true,
        }
      );

      process.on("SIGTERM", toExit);
      process.on("exit", toExit);
    },
  };
}

Devo sostituire require("child_process") con import { spawn } from "child_process":

import { spawn } from "child_process";

function serve() {
  let server;

  function toExit() {
    if (server) server.kill(0);
  }

  return {
    writeBundle() {
      if (server) return;
      server = spawn("npm", ["run", "start", "--", "--dev"], {
        stdio: ["ignore", "inherit", "inherit"],
        shell: true,
      });

      process.on("SIGTERM", toExit);
      process.on("exit", toExit);
    },
  };
}

Fatto questo posso usare npm run dev e npm run build senza problemi.

Bene, questo è tutto.