Mientras experimentaba con reader , una aplicación que utilizo en la terminal para ver páginas web, quise intentar que tan difícil sería crear un ejecutable con la misma funcionalidad pero escrita con JavaScript.
Primero intente utilizar la opción de crear un archivo binario con la opción de Node “Single executable applications ”, el problema fueron las librerías, que no son 100% compatibles para ser utilizadas con este modelo, las librerías fueron creadas para otro ambiente.
Hace tiempo que le sigo la pista a Bun y Deno como reemplazos de Node, así que intente primero con Bun y tampoco, el mismo problema, algunas APIs de Node no están completamente soportadas al momento de crear un solo ejecutable. Luego llegó la hora de mi último intento con Deno y como por arte de magia, funcionó.
El código que utilice es el siguiente:
import { parseFlags } from "https://deno.land/x/cliffy@v1.0.0-rc.2/flags/mod.ts";
import { Readability } from "npm:@mozilla/readability";
import { DOMParser } from "https://deno.land/x/deno_dom/deno-dom-wasm.ts";
import TurndownService from "npm:turndown";
import { marked } from "npm:marked";
import TerminalRenderer from "npm:marked-terminal";
// Opciones de la cli
const { flags } = parseFlags(Deno.args, {
flags: [{
name: "help",
aliases: ["h"],
standalone: true,
}, {
name: "url",
aliases: ["u"],
type: "string",
}],
});
const { help, url } = flags;
if (help || !url) {
console.log("Usage:");
console.log(" readability -u <URL>");
Deno.exit(1);
}
// Descargar página web
const res = await fetch(url);
const body = await res.text();
// Convertir el texto a un DOM
const dom = new DOMParser().parseFromString(body, "text/html");
// Intentar obtener la parte legible
const reader = new Readability(dom);
const article = reader.parse();
// Convertir a Markdown
const turndownService = new TurndownService();
const markdown = turndownService.turndown(article?.content);
// Mostrar Markdown en pantalla
marked.setOptions({
mangle: false,
headerIds: false,
renderer: new TerminalRenderer(),
});
console.log(marked(markdown));
Para probar el código:
deno run --allow-read --allow-env --allow-net readability.ts -u https://abeestrada.com/post/deno-readability/
Para compilar el código:
deno compile --allow-read --allow-env --allow-net readability.ts
Esto va a generar un ejecutable de aproximadamente 100MB, en comparación con los 8MB de reader escrito en Go, nada viable ni óptimo, pero es un solo archivo y al menos existe esa opción.
Referencias: