デノランドの冒険


今年先deno がリリースされました.
私が最初にそれについて聞いた時から、私はとても興奮していましたRyan Dahl's talk アットjsconf , 試してみなければならなかった.
この話は私の個人的なお気に入りの一つです、それは謙虚さのレッスンです.
ライアンは10年前に批判的なトーンで構築したものを見て面白いです.ノードが数百万人によって使用されているときでも、その創作者はまだその時点でいくつかの決定について悪い感じている.
ここに私をもたらしたものに戻ること.V 1の開始を聞いた後.0私はそれについてもっと学ぶために数時間かかった.文書は非常によく書かれていて、構造化されます.そして、それが彼らがマニュアルを呼ぶものに続くことによって、1つがそれを使用し始める方法の非常に良い理解を持つことができました.

ビル
ドキュメンテーションを読んだ後、理論上、それはすばらしく見えました.しかし、学ぶために私のデフォルトの方法は、通常それを何かを構築することです.それは通常私は私が実際のアプリケーションを構築する必要がある場合は、現実の世界で持っている痛みを識別することができます.
決定は、Twitterに接続し、5以上の好きなユーザーから15ツイートを返すAPIを構築することでした、私はそれが人気のつぶやきと呼ばれる.この小さなサーバはKubernetes環境で動作します.
あなたがコードにしたがっているならば、.
当初、私は失われて、APIを知りませんでした.私は、探検することに決めましたstandard library . 私は、コードがどれくらい接近可能かについて非常に感動しました.
それは私の心の後ろにこの考えを得ました.そして、それは将来の記事(例えば10年前にしたことと類似した)に至ります10 things I learned from the jquery source しかし、denoソースのために、実際にそれをするかもしれません!
基本を知った後にVSCode plugin そして、デコ、我々は冒険を開始する準備ができていた.
正直なところ、それは本当の冒険ではなかった、すべてがとても身近に見えたので、私はほとんど別のランタイムを使用していたことを忘れてしまった.

コードの取得
標準ライブラリの使用http server これは非常に簡単にサーバーを構築し、処理の要求を実行して取得した.
import { serve } from "./deps.ts";

const s = serve({ port: 8080 });

for await (const req of s) {
  req.respond({
    status: 200,
    body: "Hello world",
  });
}
ステップ2はTwitter APIに接続することでした.有するfetch 既に含まれるdeno それは非常に簡単で身近なこと.
fetch(
  "https://api.twitter.com/1.1/search/tweets.json&q=(from: ampsantos0 min_faves: 5)",
  { headers: new Headers([["content-type", "application/json"]]) }
)
DENOは、既存のWeb APIを模倣するためにオプティックスされた.Web標準でないAPIについてはDeno 名前空間が使用されます.これは私にとってスマートな選択のように見えます.そして、発見力を改善して、すでに既存のAPIを持っている知識開発者を再利用します.

走る
コードを実行するのは簡単だった.DENOのセールスポイントの一つはセキュリティです.そして、私はもっと同意できませんでした.プログラムを実行しようとしたのは初めてです.
$ deno run ./index.ts
この例では、ネットワークを使用して、エンドポイント( 8080 )を公開し、TwitterのAPIにアクセスします.
error: Uncaught PermissionDenied: network access to "0.0.0.0:8080", run again with the --allow-net flag
    at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11)
    at Object.sendSync ($deno$/ops/dispatch_json.ts:72:10)
    at Object.listen ($deno$/ops/net.ts:51:10)
    at listen ($deno$/net.ts:152:22)
これは非常に合理的かつ包括的なエラー、再びこれに良い仕事です!
これに対する良いアプローチは、旗を使用することによってホワイトリスト許可を可能にすることです--allow-net これは非常にシンプルで実用的な方法で行います.
$ deno run --allow-net=0.0.0.0:8080,api.twitter.com index.ts
コードを実行するとき--inspect フラグによって開発者はChromeの開発ツールを使用して、ノードと同じ方法でデバッグを行うことができます.

モジュールの解像度
ライアンが最初にdenoについて話したとき、そしてノードのデザインで作られた間違いが、ノードのimportモジュールの複雑さがあまりにも複雑で、エッジケースがたくさんあったことを述べた.
例:
const path = require("path")
インポートの依存性は、ノード標準ライブラリからのパスである可能性があります.同時に、それはノードモジュールから来ることができます、あるいは、あなたはパスという名前の依存関係をインストールすることができました?では、依存関係を見つけました.必要なファイルは何ですか?インデックスですか?JS ?パッケージの場合JSONは異なるメインファイルを定義していますか?
多くの未知数.
地元の輸入品はどうですか.するとき:
const add1 = require("./utils/math")
Is math ファイル?またはindex.js その中に?ファイル拡張子とは?そうです.ジェイ.TS?
あなたはポイントを得る.ノードのインポートは難しいです.
デコはgolang 絶対的なURLを持つ方法のように.それがあなたに奇妙に聞こえるならば、私と裸で.利点を見てみましょう.
  • 拡張モジュールを拡張してローカルインポートを解決します.
  • import { add1 } from "./utils/math.ts"
    
    あなたはそれを読んでから知っているmath.ts がファイルである.
  • それは、絶対URLを持つことによって第三者輸入を解決します
  • import { serve } from "https://deno.land/std/http/server.ts"
    
    これ以上の魔法モジュールの解像度.
    この絶対的なモジュールの解像度は何かのような楽しいものを有効にしました.
    注意: vscodeプラグインはサードパーティ製のインポートとよく機能しますcmd+click 依存性については、コードは通常通りです.

    依存関係の追跡
    依存関係の管理について話しましょう.denoがモジュールのimportを単純化したので、自動的に依存関係をキャッシュすることができました.
    最初にそれを実行しようとすると、依存関係をダウンロードし、キャッシュしたバージョンで実行します.
    モジュールを実行しないでキャッシングを強制するには、$ deno cache [module url] .
    おそらく、それは奇妙であり、エラーのすべてのURLの周りのコードの傾向がありますか?そうです.すべてのモジュールが現在絶対URLを持っているので、あなたはそれを管理できます.
    デコは、Aを持つことを勧めますdeps.ts ファイルは、あなたが欲しいものは何でも呼び出すことができますis in the documentation , 私は、このスタートが標準になるのを見ます.このファイルでは、すべての依存関係をURLからインポートし、使用するメソッドをエクスポートできます.
    // deps.ts
    export { serve } from "https://deno.land/std/http/server.ts"
    export { parseDate } from "https://deno.land/std/datetime/mod.ts"
    
    // index.ts
    import { serve } from "./deps.ts"
    
    シングルを持つdeps.ts ファイルをいくつかのキャッシュを行うことができますpackage.json ) Dockerビルドで.
    COPY deps.ts .
    RUN deno cache deps.ts
    
    こうすることでRUN コマンドはdeps.ts ファイル変更.これで、インストールのステップは自動的には、Dockerでそれを実行すると簡単になりました.
    DENOで面倒を見なければならないことが一つあります.
    CMD ["run", "--allow-net", "index.ts"]
    

    DENOバイナリ
    デコ提供install コマンド.しかし、以前に述べたように、自動的にプロジェクトに依存関係をインストールしません.
    その使い方はnpm install --global フラッグ、オフィシャルウェブサイトについての説明を引用install :
    このコマンドは、指定されたCLIフラグとメインモジュールを使用してdenoを呼び出す、実行可能なシェルスクリプトを作成します.インストールルートのbinディレクトリに置かれます.
    グローバルバイナリをインストールするときは、デフォルトで安全に動作するために必要なパーミッションを指定する必要があります.
    $ deno install --allow-net --allow-read https://deno.land/std/http/file_server.ts
    
    そして、あなたは$ file_server
    結論
    JS/TS界から来て、私はdenoが正しくたくさんのものを得たと言います.これは、より良い側に小さなねじれとJSとTSの親しみがあります.TSで書かれた標準ライブラリを持つことは大きなプラスです.
    標準ライブラリは素晴らしいです、それは両方とも読みやすく、よく考えます.引用符deno_std メインレポ

    deno_std is a loose port of Go's standard library. When in doubt, simply port Go's source code, documentation, and tests.


    これは面白いと面白いですが、Denoは、ゴロのコミュニティは、標準的なlibに自分自身を駆動するために置く努力を使用し、結果は素晴らしいです.
    許可システムは素晴らしいと直感的です.モジュールの解像度は簡単になり、ノードの土地で使用されたかなり多くのすべての魔法を削除します.
    現在、すべてのasync APIリターンは約束します.使用することawait and .then どこでも、コールバック地獄に陥らず、ツールを必要としないpromisify など.
    このすべてに加えて、Denoもメインバイナリで重要なツールの多くを出荷してゴランからインスピレーションを得た.バンドル、フォーマッタ、テストランナーについての議論はもはやものになりません.私はまだテストスイートとドキュメンテーションジェネレータを試みませんでした、私は後でそれについて書くかもしれません.
    それは非常に良いと直感的なアプリケーションを構築するの全体的な経験を言うことを得た.それをより現実的な何かを構築するのを待つことができない!
    私は、これがどのように進化するかについて見るために興奮していますsecond adventure in deno.land どこで、私はランタイムで少しより深い行きます.