Denoのインストールと使い方の模索

こんなにも家から出ないGWは初めてだったエンジニアリングチームの川合(@Ricckn)です。
写真はその中でも数少ない成果物で、先日ようやく一応の完成となったパンチェッタで、ちょっとスパイシーな感じにはなりましたが美味しくできました。
次のタスクはカルボナーラ作りとなります!!

さて、今回は存在は知りつつ触っていなかったdenoについて、先日とある記事を拝見し興味を持ったため少し触ってみることにしました。

DenoとNode.jsの大きな違い – keroxpのScrapbox https://scrapbox.io/keroxp/Deno%E3%81%A8Node.js%E3%81%AE%E5%A4%A7%E3%81%8D%E3%81%AA%E9%81%95%E3%81%84

DenoはNode.jsと同様、V8で動くランタイムでTypeScriptのコードを実行時にコンパイル、キャッシュして動かしてくれるスグレモノです。Node.jsやTypeScript周りの設定は結構面倒に感じていたので、少し期待しています。

例えばDenoはTypeScriptでコードを記述し、そのまま実行できることから型安全に保つことができますし、テストコードも設定等をもりもり書かなくても簡単に実行することができます。deno testというコマンドで*_test.tsのファイルをテストしてくれる組み込みっぷり。
deno fmtを使うことで、コードフォーマッターも行えることから、定期実行するようなスクリプトを今後Denoで動かすような使い方は、実は良いんじゃないかと思ったため検証してみます。

Denoのインストール方法

インストールはbrew、または ShellScriptでインストールできます。
詳しくは公式サイトを確認してください。
https://deno.land/

インストールされたDenoは以下のバージョンです。
今後のコードはmacOS Catarina 10.15.4(19E287)のこちらの環境で動かしたものになります。

% deno --version
deno 0.42.0
v8 8.2.308
typescript 3.8.3

というか、せっかくVersion 1.0がでたのにv0.42ですね・・・!

MySQLに接続する

import { Client } from "https://deno.land/x/mysql/mod.ts";

const getFullName = (userObj: { last_name: string; first_name: string }) => {
  const name = `${userObj.last_name} ${userObj.first_name}`;
  return name;
};

(async function () {
  const client = await new Client().connect({
    hostname: "192.168.xxx.xxx",
    username: "crmuser",
    db: "frevocrm",
    password: "p@SSW0RD",
  });

  const users = await client.query(
    "select first_name, last_name from ?? where status = ?",
    ["vtiger_users", "Active"],
  );
  await client.close();

  for (const i in users) {
    if (users.hasOwnProperty(i)) {
      const name = getFullName(users[i]);
      console.log(name);
    }
  }
})();

試しに、F-RevoCRMのユーザー名を一覧出してみました。

こちらに対して、getFullName関数のテストコードを簡単に書いてみます。

import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
import { getFullName } from './sample.ts'

Deno.test("氏名出力チェック 姓と名の並び順", () => {
  const userObj = {first_name: '五郎', last_name: '井上'};
  const actual = getFullName(userObj);
  const expected = '井上 五郎';
  assertEquals(actual, expected);
});

このファイルを samle_test.tsとして保存して、deno testを実行すると

% deno test --allow-net
Compile file:///Users/remicck/Coding/deno/samle_test.ts
INFO connecting 192.168.xxx.xxx:3306
running 1 tests
test 氏名出力チェック 姓と名の並び順 ... ok (5035ms)

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out (5035ms)

このような形で結果が出力されます。

試してみて

環境を作ってからTypeScriptでコードの実行、テストコードの作成までが非常にスムーズで、特にShellScriptでも環境が構築できるのは良いと感じます。
また、npmに依存しないパッケージ管理の仕組みがある為、長期的に使う際にもnpmの一時期の不安のようなものを感じずに済むかもしれません。

F-RevoCRM自体がPHPで作られていることと、F-RevoCRMにある定期実行周りの仕組みを組み合わせ、直接Modelを操作したほうが楽なことが多いため、積極的にF-RevoCRMのコードを実行するために使うかはわかりませんが、サーバーで動かすバッチ処理関係で、一部をdenoで作成するという可能性は検討しても良い気がしています。

お付き合いいただきありがとうございました。
次回のエンジニアリングチームBlogもお楽しみに!

ご質問・お問い合わせはこちら

メールフォームへ