簡體   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