デノって何? Node.jsとの違いは何ですか?

青灯夜游
リリース: 2021-06-28 11:15:45
転載
3107 人が閲覧しました

Deno は Node の固有の問題を解決するために作成されました。では、Node.js との違いは何ですか?次の記事では、Deno について詳しく説明し、Deno と Node.js の違いを紹介します。

デノって何? Node.jsとの違いは何ですか?

[推奨学習: 「nodejs チュートリアル 」]

Node.js の作者である Ryan Dahl は、過去に1 年半 彼らは皆、Node に固有の問題のいくつかを解決するために、新しい JavaScript 実行環境 Deno を構築しています。

しかし、誤解しないでください。JavaScript の巨大なコミュニティ エコシステムと使用範囲のおかげで、Node は非常に優れた JavaScript 実行環境です。ただし、Dahl 氏は、セキュリティ、モジュール メカニズム、依存関係管理など、Node にはより包括的に考慮する必要がある側面がいくつかあることも認めました。

彼の計画では、Deno が短期間でどれだけ大きなプラットフォームに成長できるかは予測していませんでした。もちろん、2009 年に遡ると、JavaScript はまだ誰もがからかうことのできる奇妙な小さな言語であり、現在ほど多くの言語機能はありませんでした。

Deno とは何ですか?またその主な機能は何ですか?

Deno は、Google V8 エンジン上に構築された安全な TypeScript ランタイム環境です。 以下は、Deno を構築するための資料の一部です:

  • Rust (Deno のコア モジュールは Rust で書かれ、Node のコア モジュールは C で実装されます)
  • Tokio (Rust で実装された非同期プログラミング)フレームワーク)
  • TypeScript (Deno はすぐに使える JavaScript と TypeScript の両方をサポートします)
  • V8 (Google によって作成された JavaScript ランタイム、主に Chrome と Node で使用されます)

次に、Deno が提供する機能を見てみましょう。

セキュリティ (権限管理)

Deno の最も重要な機能はセキュリティです。

Node と比較すると、Deno はデフォルトでサンドボックス環境を使用してコードを実行します。これは、実行環境には次のモジュールを操作する権限がないことを意味します:

  • ファイル システム
  • ネットワーク
  • 他のスクリプトの実行
  • システム環境変数

Deno の権限システムがどのように機能するかを見てみましょう。

(async () => {
 const encoder = new TextEncoder();
 const data = encoder.encode('Hello world\n');

 await Deno.writeFile('hello.txt', data);
 await Deno.writeFile('hello2.txt', data);
})();
ログイン後にコピー

このスクリプトは、hello.txthello2.txt という名前の 2 つのファイルをそれぞれ作成し、その中に Hello world## を書き込みます。ただし、このコードはサンドボックス環境で実行されるため、ファイル システムを操作する権限がありません。

また、上記のスクリプトでは、Node の

fs モジュールを使用するのとは異なり、ファイルの操作に Deno 名前空間を使用していることにも注目してください。 Deno 名前空間は、多くの基本的なメソッドを提供します。ただし、Deno 名前空間を使用すると、コードとブラウザーとの互換性が失われます。この問題については後ほど説明します。

次のコマンドを使用して上記のスクリプトを実行します:

$ deno run write-hello.ts
ログイン後にコピー

実行後、次のプロンプトが表示されます:

Deno requests write access to "/Users/user/folder/hello.txt". Grant? [a/y/n/d (a = allow always, y = allow once, n = deny once, d = deny always)]
ログイン後にコピー

実際には、上記のファイルでは、サンドボックス環境から 2 つの許可プロンプトを受け取ります。ただし、

allow always オプションを選択した場合、尋ねられるのは 1 回だけです。

deny を選択すると、PermissionDenied というエラーが発生し、エラー処理ロジックを記述しないと、この時点でプロセスが終了してしまいます。

次のコマンドでスクリプトを実行すると、

deno run --allow-write write-hello.ts
ログイン後にコピー

はプロンプトを表示せずにこれら 2 つのファイルを作成します。

Deno のファイル システム用コマンド ライン フラグには、

--allow-write に加えて、--allow-net/-- もあります。 allow-env/--allow-run は、それぞれネットワーク、システム環境変数、および動作中のサブプロセスの権限を有効にするために使用されます。

モジュールのメカニズム

Deno はブラウザと同じ方法を使用して、URL を通じてモジュールをロードします。サーバー上の import ステートメント内の URL を初めて見ると、多くの人は少し混乱するでしょうが、私にとっては非常に簡単に理解できます。

import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
ログイン後にコピー

導入するとどうなると思いますかURL 経由でモジュールを入手する? それは大したことですか?答えは実際には非常に簡単です: URL を使用してモジュールをロードすることで、Deno はパッケージを公開するための

npm のような集中型システムの導入を回避できます。npm は最近多くの苦情を受けています。## #。 URL を通じてコードを導入すると、パッケージ作成者は好みの方法でコードを保守および公開できます。 package.json

node_modules はもう必要ありません。 アプリケーションを開始すると、Deno はすべての参照ファイルをダウンロードし、ローカルにキャッシュします。参照がキャッシュされると、--relaod

フラグを使用して再ダウンロードをトリガーしない限り、Deno はそれらを再度ダウンロードしません。

議論する価値のある問題がまだいくつかあります:

万一存放引用的站点挂了咋办?

由于没有了一个中心化的包管理站点,那些存放模块的站点可能因为各种各样的原因挂掉。如果在开发甚至生产环境出现这种情况是非常危险滴!

我们在上一节提到,Deno会缓存好已下载的模块。由于缓存是存放在我们的本地磁盘的,Deno的作者建议将这些缓存提交到代码仓库里。这样一来,即使存放引用的站点挂了,开发者们还是可以使用已经下载好的模块(只不过版本是被锁住的啦)。

Deno会把缓存存储在环境变量$DENO_DIR所指定的目录下,如果我们不去设置这个变量,它会指向系统默认的缓存目录。我们可以把$DENO_DIR指定我们的本地仓库,然后把它们提交到版本管理系统中(比如:git

只能使用URL来引用模块吗?

总是敲URL显得有点XX,还好,Deno提供了两种方案来避免我们成为XX。

第一种,你可以在本地文件中将已经引用的模块重新export出来,比如:

export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";
ログイン後にコピー

假如上面这个文件叫local-test-utils.ts。现在,如果我们想再次使用test或者assertEquals方法,只需要像下面这样引用它们:

import { test, assertEquals } from './local-test-utils.ts';
ログイン後にコピー

看得出来,是不是通过URL来引用它们并不是最重要的啦。

第二种方案,建一个引用映射表,比如像下面这样一个JSON文件:

{
   "imports": {
      "http/": "https://deno.land/std/http/"
   }
}
ログイン後にコピー

然后把它像这样import到代码里:

import { serve } from "http/server.ts";
ログイン後にコピー

为了让它生效,我们还需要通过--importmap标志位让Deno来引入import映射表:

$ deno run --importmap=import_map.json hello_server.ts
ログイン後にコピー

如何进行版本管理

版本管理必须由包作者来支持,这样在client端可以通过在URL中设置版本号来下载:https://unpkg.com/liltest@0.0.5/dist/liltest.js

浏览器兼容性

Deno有计划做到兼容浏览器。从技术上讲,在使用ES module的前提下,我们不需要使用任何类似webpack的打包工具就能在浏览器上运行Deno代码。

不过呢,你可以使用类似Babel这样的工具可以把代码转化成ES5版本的JavaScript,这样可以兼容那些不支持所有最新语言特性的低版本浏览器中,带来的后果就是最终文件里有很多不是必须的冗余代码,增大代码的体积。

结果取决于我们的主要目的是啥。

支持TypeScript开箱即用

不需要任何配置文件就能在Deno中轻易地使用TypeScript。当然咯,你也可以编写纯JavaScript代码,并使用Deno去执行它。

总结

Deno,作为一个新的TypeScript和JavaScript的运行环境,是一个非常有趣的技术项目,并且至今已经稳定发展了一段时间。但是距离在生产环境中去使用它还有比较长的一段路要走。

通过去中心化(或者翻译成分布式?)的机制,把JavaScript生态系统从npm这样中心化的包管理系统中解放了出来。

Dahl希望在这个夏天快结束的时候能够发布1.0版本,所以如果你对Deno未来的新进展感兴趣的话,可以给它个star

最后还有一个日志系统的广告,大家可以去原文查看。

英文原文地址:https://blog.logrocket.com/what-is-deno/

更多编程相关知识,请访问:编程视频!!

以上がデノって何? Node.jsとの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:juejin.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!