No se puede compilar una dependencia opcional de Node.js con el compilador Angular

Creé una biblioteca npm que contiene un código que se ve así:

let _Buffer: typeof Buffer;
let _require: NodeRequire;
let _readFile: (path: string, callback: (err: (NodeJS.ErrnoException | null), data: Buffer) => void) => void;

try {
  _Buffer = typeof Buffer !== undefined && Buffer;
  _require = typeof require !== undefined && require;

  if (_Buffer && _require)
    _readFile = _require('fs').readFile;
}
catch {}

Me las arreglé para hacer que partes del código anterior funcionen en otros proyectos, como la dependencia opcional de Buffer. El uso de requireno era algo que hubiera probado antes, y esto es lo que ahora me está causando dolor. Angular está decidido a tratar de resolver la dependencia de fs, sin importar cómo intente ocultarlo (incluidas cosas tontas como _require('f' + 's')), causando un error como este:

./node_modules/@tubular/astronomy/dist/fesm2015/index.js:3:300-4:1 - Error: Module not found: Error: Can't resolve 'fs' in '/Users/kshetline/programming_projects/svc-ng/node_modules/@tubular/astronomy/dist/fesm2015'

Lo que más me gustaría hacer es encontrar una manera de diseñar la biblioteca npm para que esto no sea un problema en absoluto.

Una solución menos satisfactoria sería encontrar una manera de decirle al compilador de Angular que ignore esta dependencia externa en particular. Sin embargo, ese es un tema difícil para Google, porque todas las búsquedas arrojan información sobre el sistema de inyección de dependencia Angular, no sobre este tipo de dependencia en tiempo de compilación.

El objetivo es permitir que la biblioteca tenga funciones adicionales de Node.js cuando se usa en un entorno de Node.js, pero aún así se ejecuta sin problemas en un navegador cuando esas funciones no están disponibles.

Answer

Interesante... mi código anterior en realidad funciona bastante bien para ocultar la fsdependencia.

Lo que sucedió es que un intento anterior no tuvo éxito y, de alguna manera, en algún lugar de node_modules o package-lock.json o en el sistema de caché de IntelliJ IDEA o el sistema de caché de Angular, la dependencia no deseada fsse bloqueó y simplemente se instaló la biblioteca npm actualizada que anteriormente tenía la dependencia no lo estaba cortando.

Después de eliminar todas las fuentes sospechosas anteriores de la memoria no deseada de la mala dependencia, finalmente mi código se compilaría y ejecutaría.

Con un poco más de esfuerzo, se me ocurrió una versión mejorada del código, que funciona mejor con rollup y webpack, evitando la necesidad de declararlo fscomo una dependencia externa.

let _Buffer: typeof Buffer;
let _readFile: (path: string, callback: (err: (NodeJS.ErrnoException | null), data: Buffer) => void) => void;

try {
  _Buffer = typeof Buffer !== undefined && Buffer;
  // eslint-disable-next-line no-new-func
  _readFile = !!_Buffer && (new Function('req', 'return req("fs").readFile'))(typeof require !== 'undefined' && require);
}
catch {}