Introduction to dem

5e511bb6d01d856b4ec7a0e5b1f6a2f0?s=47 syumai
October 20, 2019

Introduction to dem

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

5e511bb6d01d856b4ec7a0e5b1f6a2f0?s=128

syumai

October 20, 2019
Tweet

Transcript

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

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

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

    のようなパッケージ管理システムが存在しない
  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 がそのまま使えます
  5. ES Modules でのモジュール管理の問題

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

    に 対して⼀つのURL しか存在しない 常に最新のmodule への参照しか持てないので、いつ壊れるかわからない
  7. バージョン管理の解決策 import するURL に直接module のバージョンを含むようにして固定する import * as dejs from

    "https://deno.land/x/dejs@0.3.3/mod.ts"; これで最新のmodule しか参照できない問題は解消されます
  8. 2. バージョンの更新が⾯倒 URL にmodule のバージョンを含んでいるファイルの数が増えてくるとどんどん更 新が困難になる Project 全体に対して、⽂字列での置換を⾏う必要がある dejs@0.3.3 =>

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

    from "https://deno.land/x/dejs@0.3.3/mod.ts"; export * as fs from "https://deno.land/std@v0.20.0/fs/mod.ts"; example.ts import { dejs } from "./deps.ts"; const body = await dejs.render(` ... deps.ts を更新すれば、 dejs , fs を使っている全ファイル内のmodule version が更新されることになります。
  10. 3. 不要なmodule への依存を持ってしまう deps.ts を使うようにすると、今度は、 dejs にしか依存しないはずの example.ts が fs

    に依存を持つようになってしまいました。 これでは、 example.ts のモジュールとしての独⽴性が失われ、プロジェクト単 位での依存管理に巻き込まれてしまいます。
  11. ここで、dem を紹介します

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

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

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

  15. 仕組みについて 使う側はvendor からimport すればOK です import するファイルにバージョンが含まれているので、使う側はバージョン を意識する必要がありません import *

    as dejs from './vendor/https/deno.land/x/dejs/mod.ts';
  16. インストール deno install dem https://deno.land/x/dem@0.2.0/cmd.ts --allow-read --allow-write

  17. 使い⽅

  18. プロジェクトの初期化 $ dem init # プロジェクトの初期化 successfully initialized a project.

    dem.json が作られます
  19. module の追加 バージョンを指定してmodule を追加します $ dem add https://deno.land/std@v0.15.0 successfully added

    new module: https://deno.land/std, version: v0.15.0
  20. ファイルの追加 追加したいファイルを 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/std@v0.15.0/fs/path.ts
  21. モジュールの更新 ⼀⾏でまとめて更新できます $ dem update https://deno.land/std@v0.20.0

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

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