繁体   English   中英

如何在DENO中使用npm模块?

[英]How to use npm module in DENO?

德诺超级酷。 早上看到了,现在想迁移到deno。 我试图将我现有的 nodejs 脚本移动到 deno。 任何人都可以帮助我了解如何在 deno 中使用 npm 模块。 我需要 esprima 模块。 这个有 package https://github.com/denoland/deno_third_party/tree/master/node_modules但我不知道如何使用它。

Deno 提供了一个Node Compatibility Library ,这将允许使用一些不使用非填充 Node.js API 的NPM 包。 您将能够通过使用https://deno.land/std/node/module.tsrequire package

以下适用于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))

上面的代码将使用来自esprima node_modules/的 esprima。

要运行它,您需要--allow-read标志

deno run --allow-read esprima.js

您只能将其限制为node_modules

deno run --allow-read=node_modules esprima.js

哪个输出:

[
 { type: "Keyword", value: "const" },
 { type: "Identifier", value: "answer" },
 { type: "Punctuator", value: "=" },
 { type: "Numeric", value: "42" }
]

注意std/使用的许多 API 仍然不稳定,因此您可能需要使用--unstable标志运行它。


尽管由于整个项目已经用 TypeScript 编写,并且没有使用任何依赖项,但他们很容易将其适应 Deno。 他们需要做的就是在他们的 imports上使用.ts扩展名。 您还可以分叉项目并进行更改。

// import { CommentHandler } from './comment-handler';
import { CommentHandler } from './comment-handler.ts';
// ...

一旦他们这样做,你就可以做到:

// 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))

选择

您还可以使用https://jspm.io/将 NPM 模块转换为 ES 模块

npm 上的所有模块都被转换为处理完全 CommonJS 兼容性的 ES 模块,包括严格的模式转换。

import esprima from "https://dev.jspm.io/esprima";

const program = 'const answer = 42';
console.log(esprima.tokenize(program))

对于使用 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!

现在,您可以使用仅使用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);

问题

总的来说,Deno 中的 npm 包有两个问题:

  1. 未给出 ES 模块 (ESM) 一致性。
  • import _ from "lodash"这样的导入不起作用 - 没有“魔术” node_modules分辨率
  • 所有导入说明符都需要包含文件扩展名 - .ts.js等。
  • CommonJS 模块系统在 Deno 中不可用
  1. npm package 使用原生 Node.js 内置函数,如fspath

问题 1 的解决方案

1.1:第三方模块

第三方模块部分是发现兼容包的最快方式。

1.2:ESM CDN 提供商

还可以查看CDN 提供商,它们可以自动将 npm 包转换为 ES 模块 (ESM):

Skypack CDN 可以提供自动转换的包,例如在package.json中设置了“模块”入口点。 对于 TypeScript 用户:它获取.d.ts类型定义以及.js文件(通过 Deno 使用的X-TypeScript-Types HTTP 标头)。

unpkg.com 描述其?module标志如下:“将 JavaScript 模块中的所有‘裸’导入说明符扩展到 unpkg URL。此功能非常实验性”。

Esprima 不依赖于 Node.js 内置函数,因此我们可以通过 CDN 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

jspm 在这里是一个不错的选择——在这种特殊情况下,Skypack TS 类型对我不起作用。

1.3:其他方法

您也可以尝试直接从存储库源(例如 ESM 分支)导入 ESM 兼容版本。 尽管对于 Esprima,由于代码中缺少文件扩展名,它无法工作。

Snowpackjspm代表了一种更手动的方法来转换 CommonJS → ESM。 rollup 插件@rollup/plugin-commonjs (Snowpack 内部使用)甚至是更底层的工具。


问题2的解决方案

Deno 提供了一个 Node兼容层,请参阅Marcos Casagrande 的回答 但是,并非完全支持所有原生 Node.js 内置插件。

由于 Esprima 不依赖 Node 内置,您可以使用更简单的 CDN 选项 go。

从 v1.15 开始,Deno 提供了Node 兼容模式,可以直接在 Deno 中运行为 Node.js 编写的程序子集。 可以通过在 CLI 中传递 --compat 标志来激活兼容模式。

deno run  --compat --unstable --allow-read test.js

目前,并非所有 node.js 内置模块都受支持,许多模块部分支持。

以下模块尚未实现:

  • 集群,dgram,http2,https,repl,tls,vm,lib

从 Deno 1.2.5 (今天发布)版本开始,deno 现在包含在实验性 npm 支持中。

// main.ts
import express from "npm:express";
const app = express();

app.get("/", function (req, res) {
  res.send("Hello World");
});

app.listen(3000);
console.log("listening on http://localhost:3000/");

您现在可以运行deno run --unstable --A main.ts并下载express

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM