Deno es genial. Lo vi en la mañana y quiero migrar a deno ahora. Estaba tratando de mover mi script nodejs existente a deno. ¿Alguien puede ayudarme sobre cómo usar los módulos npm en deno. Necesito módulo esprima. Este tiene el paquete https://github.com/denoland/deno_third_party/tree/master/node_modules pero no puedo averiguar cómo usarlo.
A partir de la versión 1.15, Deno proporciona un modo de compatibilidad con Node que permite ejecutar un subconjunto de programas creados para Node.js directamente en Deno. El modo de compatibilidad se puede activar pasando el indicador --compat en CLI.
deno run --compat --unstable --allow-read test.jsActualmente, no todos los módulos integrados de node.js son compatibles y muchos son parcialmente compatibles.
Los siguientes módulos aún no están implementados:
Deno proporciona una biblioteca de compatibilidad de nodos , que permitirá usar algunos paquetes de NPM que no usan API de Node.js sin polirrelleno . Podrá require el paquete utilizando https://deno.land/std/node/module.ts
Lo siguiente funciona en deno 1.0.0
import { createRequire } from "https://deno.land/std/node/module.ts"; const require = createRequire(import.meta.url); const esprima = require("esprima"); const program = 'const answer = 42'; console.log(esprima.tokenize(program)) El código anterior usará esprima de node_modules/ .
Para ejecutarlo, necesitará --allow-read
deno run --allow-read esprima.js Puede restringirlo solo a node_modules
deno run --allow-read=node_modules esprima.jsQué salidas:
[ { type: "Keyword", value: "const" }, { type: "Identifier", value: "answer" }, { type: "Punctuator", value: "=" }, { type: "Numeric", value: "42" } ] Nota : muchas API utilizadas por std/ todavía son inestables , por lo que es posible que deba ejecutarlas con el indicador --unstable .
Aunque como todo ese proyecto ya está escrito en TypeScript y no usa ninguna dependencia, será muy fácil para ellos adaptarlo a Deno. Todo lo que necesitan hacer es usar la extensión .ts en sus importaciones . También puede bifurcar el proyecto y hacer los cambios.
// import { CommentHandler } from './comment-handler'; import { CommentHandler } from './comment-handler.ts'; // ...Una vez que lo hagan, podrás simplemente hacer:
// Ideally they would issue a tagged release and you'll use that instead of master import esprima from 'https://raw.githubusercontent.com/jquery/esprima/master/src/esprima.ts'; const program = 'const answer = 42'; console.log(esprima.tokenize(program)) También puede usar https://jspm.io/ que convertirá los módulos NPM en módulos ES
Todos los módulos en npm se convierten en módulos ES que manejan la compatibilidad completa con CommonJS, incluidas las conversiones de modo estricto.
import esprima from "https://dev.jspm.io/esprima"; const program = 'const answer = 42'; console.log(esprima.tokenize(program))Para los paquetes que usan módulos Node.js que no son compatibles con jspm, arrojará un error:
Uncaught Error: Node.js fs module is not supported by jspm core. Deno support here is tracking in https://github.com/jspm/jspm-core/issues/4, +1's are appreciated! Por ahora, puedes usar paquetes que solo usan Buffer , para eso tendrás que incluir std/node .
// import so polyfilled Buffer is exposed import "https://deno.land/std/node/module.ts"; import BJSON from 'https://dev.jspm.io/buffer-json'; const str = BJSON.stringify({ buf: Buffer.from('hello') }) console.log(str);En general, hay dos problemas con los paquetes npm en Deno:
import _ from "lodash" no funcionan, no hay resolución "mágica" de node_modules.ts , .js , etc.fs o path .La sección Módulos de terceros es la forma más rápida de descubrir paquetes compatibles.
También eche un vistazo a los proveedores de CDN , que pueden convertir automáticamente paquetes npm a módulos ES (ESM):
?module Skypack CDN puede entregar paquetes convertidos automáticamente que, por ejemplo, han establecido un punto de entrada de "módulo" en package.json . Para usuarios de TypeScript: obtiene definiciones de tipo .d.ts junto con archivos .js (a través de encabezados HTTP X-TypeScript-Types utilizados por Deno).
unpkg.com describe su marca ?module de la siguiente manera: "Expande todos los especificadores de importación 'básicos' en los módulos de JavaScript para desempaquetar las URL. Esta función es muy experimental".
import esprima from "https://cdn.skypack.dev/esprima@^4.0.1"; // Option 1: Skypack import esprima from "https://dev.jspm.io/esprima"; // Option 2: jspm // your program const tokens = esprima.tokenize("const foo = 'bar'"); // worksjspm sería una buena opción aquí: los tipos Skypack TS no funcionaron para mí en este caso particular.
También puede intentar importar una versión compatible con ESM directamente desde las fuentes del repositorio (por ejemplo, una rama de ESM). Aunque para Esprima no funcionará debido a la falta de extensiones de archivo en el código.
Snowpack y jspm reemplazan un enfoque más manual para convertir CommonJS → ESM. El complemento acumulativo @rollup/plugin-commonjs (usado internamente por Snowpack) es incluso una herramienta de nivel más bajo.
Deno proporciona una capa de compatibilidad de nodos, consulte la respuesta de Marcos Casagrande . Sin embargo, no todas las funciones integradas nativas de Node.js son totalmente compatibles.
Como Esprima no depende de las funciones integradas de Node, puede optar por la opción CDN más simple.