Vin*_*Sai 79 javascript node.js npm esprima deno
Deno 超级酷。我早上看到了,现在想迁移到 deno。我试图将我现有的 nodejs 脚本移动到 deno。任何人都可以帮助我了解如何在 deno.js 中使用 npm 模块。我需要 esprima 模块。这个有包https://github.com/denoland/deno_third_party/tree/master/node_modules但我不知道如何使用它。
Mar*_*nde 77
Deno 提供了一个Node Compatibility Library,它允许使用一些不使用非 polyfill Node.js API 的NPM 包。你将能够require
通过使用包https://deno.land/std/node/module.ts
以下工作在 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))
Run Code Online (Sandbox Code Playgroud)
上面的代码将使用esprima
from node_modules/
.
要运行它,你需要--allow-read
标志
deno run --allow-read esprima.js
Run Code Online (Sandbox Code Playgroud)
您只能将其限制为 node_modules
deno run --allow-read=node_modules esprima.js
Run Code Online (Sandbox Code Playgroud)
哪些输出:
[
{ type: "Keyword", value: "const" },
{ type: "Identifier", value: "answer" },
{ type: "Punctuator", value: "=" },
{ type: "Numeric", value: "42" }
]
Run Code Online (Sandbox Code Playgroud)
注意: 使用的许多 APIstd/
仍然不稳定,因此您可能需要使用--unstable
标志运行它。
尽管整个项目已经是用 TypeScript 编写的,而且它没有使用任何依赖项,但他们很容易将其适配到 Deno。他们需要做的就是.ts
在他们的进口上使用扩展。您还可以 fork 项目并进行更改。
// import { CommentHandler } from './comment-handler';
import { CommentHandler } from './comment-handler.ts';
// ...
Run Code Online (Sandbox Code Playgroud)
一旦他们这样做,你就可以做到:
// 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))
Run Code Online (Sandbox Code Playgroud)
您还可以使用https://jspm.io/
which 将 NPM 模块转换为 ES 模块
npm 上的所有模块都转换为 ES 模块,处理完整的 CommonJS 兼容性,包括严格模式转换。
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))
Run Code Online (Sandbox Code Playgroud)
对于使用 jspm 不支持的 Node.js 模块的包,它会抛出错误:
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!
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用仅使用 的包Buffer
,为此您必须包含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);
Run Code Online (Sandbox Code Playgroud)
for*_*d04 27
一般来说,Deno 中的 npm 包有两个问题:
import _ from "lodash"
不工作一样的裸进口- 没有“神奇”的node_modules
解决方案.ts
,.js
等等。fs
或path
。该第三方模块部分是发现兼容包的最快方式。
另请查看CDN providers,它可以将 npm 包自动转换为 ES 模块(ESM):
Skypack CDN可以提供自动转换的包,即如设置了“模块”的入口点package.json
。对于 TypeScript 用户:它.d.ts
随.js
文件一起获取类型定义(通过X-TypeScript-Types
Deno 使用的 HTTP 标头)。
unpkg.com 将其?module
标志描述如下:“将 JavaScript 模块中的所有‘裸’导入说明符扩展到 unpkg URL。此功能非常具有实验性”。
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'"); // works
Run Code Online (Sandbox Code Playgroud)
jspm 在这里是一个不错的选择 - 在这种特殊情况下,Skypack TS 类型对我不起作用。
您也可以尝试直接从存储库源(例如 ESM 分支)导入 ESM 兼容版本。尽管对于 Esprima 来说,它不会工作,因为代码中缺少文件扩展名。
Snowpack和jspm代表更手动的方法来转换 CommonJS 吗?无害化管理。rollup 插件@rollup/plugin-commonjs
(由 Snowpack 内部使用)甚至是一个更底层的工具。
Deno 提供了一个 Node兼容层,参见Marcos Casagrande 的回答。但是,并非所有原生 Node.js 内置程序都得到完全支持。
由于 Esprima 不依赖于 Node 内置函数,您可以使用更简单的 CDN 选项。