Node Modules in Deno

Christian Russo
orbit-software

--

La última vez que presentamos Deno y discutimos cómo se compara con el nodo, como nodo, Deno es un entorno de ejecución de código del lado del servidor basado en tecnología web.

  • Node usa JavaScript con módulos commonjs y npm / yarn como administrador de paquetes.
  • Deno usa Typecript o JavaScript con declaraciones de importación de JavaScript modernas. No necesita un administrador de paquetes.

Para importar un módulo como de costumbre en deno, haga referencia a él por URL:

import { serve } from “https://deno.land/std/http/server.ts";

Puede encontrar muchos de los módulos que puede necesitar en la biblioteca estándar de Deno o en la lista de módulos de terceros de Deno, pero no tienen todo.

A veces es necesario utilizar un módulo que los encargados del mantenimiento solo han puesto a disposición a través del ecosistema npm. A continuación, se muestran algunos métodos, del más conveniente al menos:

1. Si el módulo ya utiliza la sintaxis de importación / exportación de módulos ES.

Las bibliotecas que usa de deno no tienen que provenir de los paquetes recomendados de Deno, pueden provenir de cualquier URL, siempre que utilicen la sintaxis de import moderna. El uso de unpkg es una excelente manera de acceder a estos archivos directamente desde un repositorio npm.

import throttle from https://unpkg.com/lodash@4.17.19/throttle.js

2. Si el módulo en sí no utiliza importaciones, pero el código fuente sí

Si el módulo está compilado o en el formato incorrecto a través de npm, es posible que aún tenga algo de suerte si echa un vistazo al código fuente. Muchas bibliotecas populares se han alejado del uso de commonjs en su código fuente a la sintaxis de import del módulo es compatible con los estándares.

Algunos paquetes tienen un directorio src / y dist / separados donde el código de estilo esmodule está en src / que no está incluido en el paquete disponible a través de npm. En ese caso, puede importar directamente desde la fuente.

import throttle from “https://raw.githubusercontent.com/lodash/lodash/master/throttle.js";

Obtuve esta URL haciendo clic en el botón “sin procesar” en github para obtener el archivo JS sin procesar. Probablemente sea mejor usar un cdn de github o ver si el archivo está disponible a través de las páginas de github, pero esto funciona.

NB: Algunas bibliotecas usan esmodules con webpack, o un cargador de módulos que les permite importar desde módulos de nodo como este:

Bad:import { someFunction } from “modulename”;import { someOtherFunction } from “modulename/file.js”;

El estándar para las importaciones es que deben comenzar con ./ o ser una URL para funcionar

Good:
import { someOtherFunction } from “./folder/file.js”;

En esa situación, pruebe el siguiente método:

3. Importación de módulos commonjs

Afortunadamente, existe un servicio llamado JSPM que resolverá los módulos de terceros y compilará los módulos commonjs para que funcionen como importaciones de esmodule. Esta herramienta es para usar módulos de nodo en el navegador sin un paso de compilación. Pero también podemos usarlo aquí.

En mi proyecto más reciente, quería hacer notificaciones push, lo que implica generar las credenciales para VAPID, hay una biblioteca deno criptográfica que puede cifrar, pero hacer el procedimiento completo es difícil y prefiero usar la popular biblioteca web push. Puedo importarlo usando JSPM CDN usando la URL como se muestra a continuación:

import webPush from “https://dev.jspm.io/web-push";

Ahora puedo usarlo como cualquier otro módulo en deno.

Esto casi funcionó al 100%, algunos de los bits que se basaban en comportamientos de nodos específicos, como hacer que las solicitudes de red fallaran en esta situación, tuve que solucionar esto para usar los usos estandarizados de fetch API de recuperación.

Hacer que funcionen los tipos de TypeScript

Una característica interesante de typescipt, que deno usa, es que proporciona un autocompletado realmente bueno para los módulos. La extensión deno para mi editor incluso puede autocompletarse para módulos de terceros si conoce las definiciones de tipo.

Esto no es esencial para que el código funcione, pero puede brindarle enormes beneficios para ayudarlo a mantener su código.

Cuando estaba importando otro módulo llamado fast-xml-parser cuando estaba mirando el código fuente, noté que tenía un archivo de definiciones de tipo que es un archivo que termina en .d.ts. Estos archivos describen las diversas interfaces e incluso funcionan incluso para archivos .js de JavaScript. A veces, también puede encontrar los archivos de definiciones de tipos en el repositorio @types \ somemodule.

El uso de este archivo mecanografiado puede completarse automáticamente en cosas importadas desde archivos JavaScript. Incluso para archivos importados con JSPM:

// Import the fast-xml-parser library
import fastXMLParser from
https://dev.jspm.io/fast-xml-parser";
// Import the type definition file from the source code of
fast-xml-parser
import * as FastXMLParser from “https://raw.githubusercontent.com/NaturalIntelligence/fast-xml-parser/master/src/parser.d.ts";
// Use the parser with the types
const
parser = fastXMLParser as typeof FastXMLParser;

Importo las definiciones de tipo de los archivos de definición como FastXMLParser (observe la F mayúscula), esto no contiene ningún código de trabajo, pero es un objeto que tiene el mismo tipo que el código que queremos importar.

Importo el código de JSPM como fastXMLParser (f minúscula) que es el código de trabajo pero no tiene tipos.

A continuación, los combino para hacer parser que sea fastXMLParser con el tipo de FastXMLParser.

Gracias por leer, espero que pruebes deno. La capacidad de usar cualquier módulo creado para la web e incluso algunos creados para node / npm realmente le da a este nuevo ecosistema de biblioteca del lado del servidor una buena base para comenzar. 🦕

--

--