1. ホーム
  2. javascript

[解決済み] DENOでnpmモジュールを使うには?

2023-06-07 04:23:19

質問

Denoは超カッコイイです。午前中に見て、今すぐdenoに移行したいです。私は既存のnodejsスクリプトをdenoに移行しようとしていました。誰かdenoでnpmモジュールを使用する方法について私を助けることができます。私はesprimaモジュールが必要です。 これは、パッケージが https://github.com/denoland/deno_third_party/tree/master/node_modules がありますが、それをどう使うのかがわかりません。

どのように解決するのですか?

デノでは ノード互換性ライブラリ を使用しないいくつかの NPM パッケージを使用できるようにします。 非ポリフィルドのNode.jsのAPI . これにより、以下のことが可能になります。 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))

上記のコードでは esprima から node_modules/ .

実行するには --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" }
]

注意 で使用される多くのAPIは std/ はまだ 不安定 で実行する必要があるかもしれません。 --unstable のフラグを立てて実行する必要があるかもしれません。


そのプロジェクト全体はすでにTypeScriptで書かれており、依存関係を使用していないので、Denoに適合させるのは非常に簡単でしょう。必要なのは .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上のすべてのモジュールは、ESモジュールに変換されます。 CommonJS互換で、ストリクトモードへの変換も可能です。

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