Tutorial básico de quickjs.
Qué es:
Quickjs es un entorno de ejecución (motor) de javascript que cumple en gran medida con el estandar de javascript.
Sirve para interpretar, ejecutar o compilar codigo javascript.
Cómo se compara a Node.js y a Chrome:
Quickjs es mucho más pequeño que node o v8. Se ejecuta de forma rápida sin esperar al cargar scripts y ocupa poco espacio, lo que lo hace ideal para crear pequeños scripts y utilidades para la consola de comandos de Linux, Windows o Termux.
Como se instala:
Puedes descargarlo de su página oficial, de github y compilarlo o utilizando apt-get install quickjs
A parte del javascript estandar que más trae:
Trae 2 librerías preinstaladas que podemos importar. std y os.
La librería std trae varias funciones del lenguaje de C y la librería os trae hilos, funciones para abrir procesos, y varias utilidades.
Al lio:
holaMundo.js
console.log("Hola mundo");
Puedes ejecutarlo con el comando qjs holaMundo.js
También puedes compilarlo con qjsc -o holaMundo holaMundo.js
correrCualquierComando.js
import * as std from "std";
let run = comando => {
let prog = std.popen(comando, "r");
let r, msg = "";
while ((r = prog.getline()) != null) {
msg += r + "\n";
}
return msg;
}
console.log( run("ls") );
console.log( run("ls && pwd") );
generadorDeArchivos.js
import * as std from "std";
console.log(`Generador de archivos 2021
Genera el esqueleto de archivos para no tener que escribir a mano partes recurrentes de archivos comunes.
1. Proyecto HTML
2. Reporte de Seguridad
Selecciona el número correspondiente a la opción que deseas.`);
let opcionUsuario = +std.in.getline();
if (opcionUsuario === 1) {
let fd = std.open("index.html", "w");
fd.puts(`<!DOCTYPE html>
<html lang="en">
<head prefix="og:http://ogp.me/ns#">
<meta charset="utf-8">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<title>Index.html</title>
<!--
<meta property="og:type" content="website">
-->
<link rel="stylesheet" href="./code.css">
<meta name="theme-color" content="#ffffff">
</head>
<body>
<script src="./main.js"></script>
</body>
</html>`);
fd.close();
fd = std.open("main.js", "w");
fd.close();
fd = std.open("code.css", "w");
fd.puts(`body {
margin: 0 0 0 0; /* Remove ugly left side border */
text-size-adjust: none; /* Fix Android Big Text */
text-rendering: optimizeLegibility; /* Improve text */
}
/* Media query */
@media (min-width: 0px) and (orientation:landscape) {
body {
font-size: 1.1vw;
}
}`);
fd.close();
} else if (opcionUsuario === 2) {
console.log("Esta opción se programará en el futuro");
}
scraper.js
import * as std from "std";
let run = comando => {
let prog = std.popen(comando, "r");
let r, msg = "";
while ((r = prog.getline()) != null) {
msg += r + "\n";
}
return msg;
}
let getTargetAndSelector = () => {
let returnValues = {};
for(let i in scriptArgs) {
if (scriptArgs[i] == "-t" || scriptArgs[i] == "--target") {
returnValues.target = scriptArgs[+i+1];
} else if (scriptArgs[i] == "-s" || scriptArgs[i] == "--selector") {
returnValues.selector = scriptArgs[+i+1];
}
}
if (returnValues.target && returnValues.selector) {
return [returnValues.target, returnValues.selector];
} else {
throw `Usage:
-t --target Url to download
-s --selector Selector to use
Example: qjs scraper.js -t https://example.com -s h1`;
}
}
let result = run(`curl ${getTargetAndSelector()[0]} -A "Mozilla/5.0" --silent | pup ${getTargetAndSelector()[1]}`);
console.log(result);
Puedes compilarlos y meterlos en bin y darle permisos para usarlos como cualquier otro comando sin necesidad de estar en la misma carpeta que el código.
qjsc -o scraper scraper.js && cp scraper ~/../usr/bin/ && chmod +775 ~/../usr/bin/scraper
scraper -t
https://example.com -s a
Documentación Official Quickjs:
https://bellard.org/quickjs/quickjs.htmlDocumentación Herramienta Pup para usar selectores en la linea de comandos:
https://github.com/ericchiang/pup