[Deno] 開発環境構築 例 VSCode

1.インストール
・公式サイト https://deno.com/
・Deno自体は単一ファイル 約128MB
   deno 2.7.9 (stable, release, x86_64-pc-windows-msvc)
   v8 14.7.173.7-rusty
   typescript 5.9.2
・TypeScript/JavaScriptの開発ツール+実行環境+配布ツールというオールインワン
・Node.jsを作った人がNode.jsの設計ミスを悔やんで新しく作った

# Denoのインストール(システムグローバル)
## Linux / macOS
$ curl -fsSL https://deno.com/install.sh | sh

## Windows PowerShell
$ iwr https://deno.com/install.ps1 -useb | iex

# バージョン確認
$ deno --version

# Deno自身にアップデートがあるか確認
$ deno upgrade --dry-run

# deno自体を最新版にアップグレード
$ deno upgrade

# 指定したバージョンのDenoを取得する
$ mkdir bin
$ deno upgrade --version 2.5.6 --output .\bin\deno-2.5.6.exe

※Deno自体は単一の実行可能ファイルなので余計なパスを生成しないzipファイルをDLしてもよい。
 https://github.com/denoland/deno/releases
※複数バージョンを利用したい場合は環境切り替えツールを使うか、実行可能ファイルをリネームして使う(deno2.1.exe deno2.2.exeなど)
※キャッシュ(外部ライブラリ)自体はバージョン毎に保持されている。
※2024年以降、外部ライブラリは https://deno.land/x/ ではなく JSR (jsr:) を使うのが標準。

2.実行
deno.json のタスクを使う(推奨)
deno.json に以下のように記述しプロジェクト内のDenoを意識せず実行する。
{
    // プロジェクト内にライブラリを実体化し、オフライン/持ち運びを可能にする
    "nodeModulesDir": "auto",
    "vendor": true,

    "tasks": {
        "check-update": "./bin/deno.exe outdated",
        "update": "./bin/deno.exe outdated --update",
        "backup": "./bin/deno.exe run --allow-read --allow-write --allow-run scripts/backup.ts",

        "backup": "./bin/deno.exe run --allow-all scripts/backup.ts",
            "build": "deno run --allow-all scripts/build.ts",

        "dev": "./bin/deno.exe run --allow-all --watch main.ts",
        "release": "./bin/deno.exe run --allow-write --allow-run scripts/build.ts ./main.ts myprog",

        "dev-2_5_6": "./bin/deno-2.5.6.exe run --allow-all --watch main.ts",
        "release-2_5_6": "./bin/deno-2.5.6.exe run --allow-write --allow-run scripts/build.ts ./main.ts myprog2.5"
        }
}
$ deno task dev # システムグローバルのDenoから起動する $ ./bin/deno task dev # プロジェクト内のDenoから起動する ※tasksではプロジェクト内のDenoを使う記述なのでどちらで起動しても同じ ※deno task (引数なし) を実行すると deno.json に登録されているタスク名と実行内容の一覧が表示される。 3.VSCodeで使う方法 ・プロジェクトディレクト内で完結する持ち運び可能な構成 ・Deno自体を格納する(./bin/deno.exe) ・プロジェクトで使う実行時に必要なDeno関連の追加モジュール(./vendor or ./node_modules) ☆必須拡張機能 Deno (公式)   拡張機能 ID: denoland.vscode-deno   提供元: denoland (Deno公式チーム)   役割: 型チェック、補完、フォーマット(整形)、リント(構文チェック)、デバッグ、テスト実行など、Deno開発に必要なすべての機能が含まれている。  初期化  SHIFT+CTRL+P で Deno: Initialize Workspace Configuration 3.1.設定ファイルの書き方 プロジェクトディレクトリ配下 .vscode/settings.json
{
    "deno.enable": true,
    "deno.lint": true,
    "deno.cacheOnSave": true,

    "deno.path": "./bin/deno.exe",
    "terminal.integrated.env.windows": {
        "PATH": "${workspaceFolder}\\bin;${env:PATH}"
    }
}
・settings.json の "deno.path" は単一のパスしか保持できない。 ・エディタの補完(IntelliSense)に使うDeno本体を切り替えたい場合は deno.path を手動で書き換える必要がある。 3.2.推奨されるディレクトリ構成の例 my-project/ ├── .vscode/ │ ├── settings.json VS Code拡張機能・ターミナルの設定 │ └── launch.json F5デバッグの設定 ├── vendor/ 【自動生成】ここにライブラリの実体が展開される ├── node_modules/ 【自動生成】ここにライブラリの実体が展開される ├── bin/ │ └── deno.exe 特定バージョンのDeno本体 ├── scripts/ │ ├── build.ts リリース物生成 │ └── backup.ts 全体バックアップ ├── dist/ 【自動生成】リリース用生成物 ├── src/ ソースコード階層 │ ├── auth/ │ │ ├── mod.ts パッケージの玄関口 │ │ └── login.ts 内部ロジック │ └── utils/ 共通ユーティリティ │ ├── mod.ts パッケージの玄関口 │ └── logger.ts 内部ロジック ├── .gitignore git非対象パスの指定 ├── deno.json プロジェクト設定・タスク定義 ├── deno.lock 【自動生成】依存関係のバージョン固定ファイル └── main.ts エントリーポイント 3.3.インポートは相対パスで main.ts から auth パッケージを呼び出す場合は以下のように書く。
import { login } from "./src/auth/mod.ts";
3.4.mod.ts という慣習 Deno(およびRustなど)の世界では、ディレクトリ内の機能を外部に公開するファイル名を mod.ts とするのが一般的。Pythonの __init__.py と同じ役割で、そのディレクトリ内の「玄関口」になる。 3.5.deno.json でのパス解決(インポートマップ) 階層が深くなって ./../../ と書くのが面倒な場合は deno.json にエイリアス(別名)を設定する。
{
    "tasks": { ... },   // ここの詳細は上記を参照
    "imports": {
        // 外部ライブラリ
        "@deno-library/compress": "jsr:@deno-library/compress@^0.5.6",
        "@std/datetime": "jsr:@std/datetime@^0.225.7",
        "@std/path": "jsr:@std/path@^1.1.4",

        // 内部パッケージ
        "@auth": "./src/auth/mod.ts"
    } 
}
こうすると、どこからでも import { authenticate } from "@auth"; で呼び出せるようになり、Pythonのパッケージインポートに近い感覚になる。 ※外部モジュールは手動書き換えではなく、ターミナルで $ deno add jsr:@std/path と打つ。  これにより、最新の安定版が deno.json に自動登録されスペルミスやバージョン不整合を防げる。 3.6.gitを使う場合 この構成をGitで管理する場合は vendor/ と node_modules/ は絶対に .gitignore に入れる。 理由: キャッシュにはダウンロードされた膨大な外部ライブラリが含まれるため、Gitのリポジトリが巨大化する。 推奨される .gitignore
vendor/
node_modules/
dist/
4.実装のイメージ 4.1.内部ロジック (src/auth/login.ts)
export function authenticate(user: string): string {
    return `${user} は認証されました`;
}
4.2.玄関口 (src/auth/mod.ts) Pythonの from .login import authenticate に相当する
// 内部の必要な機能だけを選んで再エクスポート(Re-export)する
export { authenticate } from "./login.ts";
4.3.利用側(main.ts) インポートマップで定義したエイリアス、または mod.ts を直接指定して機能を呼び出す。
import { authenticate } from "@auth";

console.log(authenticate("Deno太郎"));
4.4.Denoならではのポイント 明示的な指定: Denoでは ./src/auth のようにディレクトリ名で止めることはできず、必ず mod.ts などのファイル名と .ts 拡張子まで書くのが基本ルール。 カプセル化: login.ts に関数が多数あっても、mod.ts で export しない限り外部からは見えない。これによりパッケージの独立性を保てる。 5.デバッグ 5.1.F5でデバックするための設定 プロジェクトディレクトリ配下 .vscode/launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "request": "launch",
            "name": "Launch Program",
            "type": "node",
            "program": "${workspaceFolder}/main.ts",
            "cwd": "${workspaceFolder}",
            "env": {},
            "runtimeExecutable": "${workspaceFolder}/bin/deno.exe",
            "runtimeArgs": [
                "run",
                "--unstable",
                "--inspect-wait",
                "--allow-all"
            ],
            "attachSimplePort": 9229
        }
    ]
}
設定のポイント 1.runtimeExecutable: ここにプロジェクト内の deno.exe をフルパス(変数を活用)で指定することで、システムのDenoではなく「そのプロジェクト専用のDeno」でデバッグが走る。 2.--inspect-wait: デバッガーが接続されるまでプログラムの実行を待機させるフラグ。これにより、最初の1行目からステップ実行が可能になる。 6.リリース 単一.tsファイルならそのままでもOK。 Windows以外の環境ならShebang(#!/usr/bin/env deno)が有効なので .ts ファイルで直接実行可能。 複数ファイル構造ならWindows環境を含めた配布を考えるなら deno compile によるバイナリ化が最適。 6.1.scripts/build.ts 実行可能モジュールとしてリリースする場合はコンパル用のバッチプログラムを作っておく。 ※Deno 2.x の compile は、npm: インポートを含むプロジェクトも単一バイナリに固めることができる。
import * as datetime from "@std/datetime";
import * as path from "@std/path";

// 1. 保存先ディレクトリの作成
const distDir = "./dist";
await Deno.mkdir(distDir, { recursive: true });

// 2. タイムスタンプ生成 (YYYYMMDD_hhmmss)
const now = new Date();
const timestamp = datetime.format(now, "yyyyMMdd_HHmmss");

// 3. 出力パスの組み立て
const extension = Deno.build.os === "windows" ? ".exe" : "";
const outputName = `myapp_v${timestamp}${extension}`;
const outputPath = path.join(distDir, outputName);

console.log(`Building to: ${outputPath}...`);

// 4. コンパイル実行
const command = new Deno.Command(Deno.execPath(), {
    args: [
        "compile",
        "--allow-all",
        "--output", outputPath,
        "main.ts"
    ],
});

const { success, stderr } = await command.output();

if(success) {
    console.log(`Successfully created: ${outputPath}`);
}
else {
    console.error("Compile failed:");
    console.error(new TextDecoder().decode(stderr));
}
7.プロジェクトのバックアップ (scripts/backup.ts) プロジェクト全体をZIPにまとめ、親ディレクトリへ退避させるスクリプト。 ※実行には最新の std/archive モジュールを利用する想定。 7.1.scripts/backup.ts の実装
/**
 * 使い方:
 * deno task build  
 * 例: deno task build src/main.ts my-app
 */
import * as datetime from "@std/datetime";
import * as path from "@std/path";

const [entryPoint, binName] = Deno.args;

if(!entryPoint || !binName) {
  console.error("Usage: deno task build  ");
  console.error("example: deno task build src/main.ts my-app");
  Deno.exit(1);
}

// 1. 保存先ディレクトリの作成
const distDir = "./dist";
await Deno.mkdir(distDir, { recursive: true });

// 2. タイムスタンプ生成 (YYYYMMDD_hhmmss)
const now = new Date();
const timestamp = datetime.format(now, "yyyyMMdd_HHmmss");

// 3. 出力パスの組み立て
const extension = Deno.build.os === "windows" ? ".exe" : "";
const outputName = `${binName}_v${timestamp}${extension}`;
const outputPath = path.join(distDir, outputName);

console.log(`Building to: ${outputPath}...`);

// 4. コンパイル実行
const command = new Deno.Command(Deno.execPath(), {
    args: [
        "compile",
        "--allow-all",
        "--output", outputPath,
        entryPoint
    ],
});

const { success, stderr } = await command.output();

if(success) {
    console.log(`Successfully created: ${outputPath}`);
}
else {
    console.error("Compile failed:");
    console.error(new TextDecoder().decode(stderr));
}

横書き to 縦書き

・横書きの文章を右上から左下へ流れる縦書きテキストに変換します。
・ロケール(日本語)のセグメンテーションに対応(Intl.Segmentation)
・半角文字は全角文字に変換(半角カタカナを除く)
・改行は1文字としてカウントする。

 注意
 ・あくまで 横書きフォントで縦書き風に変換するだけ のツール
 ・SNSによっては縦書き時の一番左側の空白は自動除去されるので注意
文字数: 0