Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introduction to dem

syumai
October 20, 2019

Introduction to dem

Deno向けのmodule version manager dem の紹介です
https://github.com/syumai/dem

syumai

October 20, 2019
Tweet

More Decks by syumai

Other Decks in Programming

Transcript

  1. Introduction to dem - module manager for Deno
    @__syumai

    View full-size slide

  2. Deno
    2018
    年6
    ⽉にNode.js
    の作者のRyan Dahl
    から発表されました
    Node.js
    の設計のよくなかった所を⾒直して、ゼロから再実装を⾏うことを⽬的と
    したプロジェクトです

    View full-size slide

  3. Deno
    のモジュールシステム
    ES Modules
    のみしかない
    Web
    互換を⽬指しているため
    独⾃のモジュールシステムを提供しない
    Node.js
    におけるnpm
    のようなパッケージ管理システムが存在しない

    View full-size slide


  4. import * as dejs from "https://deno.land/x/dejs/mod.ts";
    const body = await dejs.render(`
    <% for (let i = 0; i < 3; i++) { %>
    Hello, deno!
    <% } %>
    `, {});
    await Deno.copy(Deno.stdout, body);
    URL
    指定でimport
    したmodule
    がそのまま使えます

    View full-size slide

  5. ES Modules
    でのモジュール管理の問題

    View full-size slide

  6. 1.
    バージョンの管理が困難
    npm
    などは、⼀つのpackage
    に対して、package.json
    などでバージョンの指定が出
    来る
    Deno
    は、そのURL
    に存在するファイルをそのまま解決するため、⼀つのmodule

    対して⼀つのURL
    しか存在しない
    常に最新のmodule
    への参照しか持てないので、いつ壊れるかわからない

    View full-size slide

  7. バージョン管理の解決策
    import
    するURL
    に直接module
    のバージョンを含むようにして固定する
    import * as dejs from "https://deno.land/x/[email protected]/mod.ts";
    これで最新のmodule
    しか参照できない問題は解消されます

    View full-size slide

  8. 2.
    バージョンの更新が⾯倒
    URL
    にmodule
    のバージョンを含んでいるファイルの数が増えてくるとどんどん更
    新が困難になる
    Project
    全体に対して、⽂字列での置換を⾏う必要がある
    [email protected] => [email protected]
    など

    View full-size slide

  9. バージョン更新の解決策
    deps.ts
    などといったファイルに依存モジュールをまとめて、そこからexport

    るようにする
    deps.ts
    export * as dejs from "https://deno.land/x/[email protected]/mod.ts";
    export * as fs from "https://deno.land/[email protected]/fs/mod.ts";
    example.ts
    import { dejs } from "./deps.ts";
    const body = await dejs.render(`
    ...
    deps.ts
    を更新すれば、 dejs , fs
    を使っている全ファイル内のmodule
    version
    が更新されることになります。

    View full-size slide

  10. 3.
    不要なmodule
    への依存を持ってしまう
    deps.ts
    を使うようにすると、今度は、 dejs
    にしか依存しないはずの
    example.ts
    が fs
    に依存を持つようになってしまいました。
    これでは、 example.ts
    のモジュールとしての独⽴性が失われ、プロジェクト単
    位での依存管理に巻き込まれてしまいます。

    View full-size slide

  11. ここで、dem
    を紹介します

    View full-size slide

  12. dem
    Deno
    向けのmodule
    管理ツール

    View full-size slide

  13. dem
    の特徴
    特定のバージョンのモジュールへのエイリアスのファイルを⽣成する
    module
    管理がCLI
    で完結する

    View full-size slide

  14. 仕組みについて
    vendor
    ディレクトリ配下に下記のようなファイルが⽣成されます
    内容は、特定のバージョンのモジュールへのエイリアスになる
    vendor/https/deno.land/x/dejs/mod.ts
    export * from 'https://deno.land/x/[email protected]/mod.ts';

    View full-size slide

  15. 仕組みについて
    使う側はvendor
    からimport
    すればOK
    です
    import
    するファイルにバージョンが含まれているので、使う側はバージョン
    を意識する必要がありません
    import * as dejs from './vendor/https/deno.land/x/dejs/mod.ts';

    View full-size slide

  16. インストール
    deno install dem https://deno.land/x/[email protected]/cmd.ts --allow-read --allow-write

    View full-size slide

  17. プロジェクトの初期化
    $ dem init #
    プロジェクトの初期化
    successfully initialized a project.
    dem.json
    が作られます

    View full-size slide

  18. module
    の追加
    バージョンを指定してmodule
    を追加します
    $ dem add https://deno.land/[email protected]
    successfully added new module: https://deno.land/std, version: v0.15.0

    View full-size slide

  19. ファイルの追加
    追加したいファイルを vendor
    からimport
    するようにTS
    のファイルを書き換えま

    dem ensure
    すると、⾃動で依存先へのエイリアスを作成します
    下記の例では、 fs/path.ts
    へのエイリアスを作成しています
    example.ts
    import * as path from './vendor/https/deno.land/std/fs/path.ts';
    console.log(path.join(Deno.cwd(), 'example'));
    Resolve module files used in project.
    $ dem ensure
    successfully created alias: https://deno.land/[email protected]/fs/path.ts

    View full-size slide

  20. モジュールの更新
    ⼀⾏でまとめて更新できます
    $ dem update https://deno.land/[email protected]

    View full-size slide

  21. dem
    の課題
    依存先の依存先を固定できない
    default export
    に対応できていない (keroxp
    さんのdink
    は対応済みです)

    View full-size slide

  22. 感想
    モジュールの更新がとても簡単になりました!
    ぜひ使ってみてください

    View full-size slide