0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

deno v0.29.0の変更点

Last updated at Posted at 2020-01-11

概要

denoのv0.29.0がリリースされたため、変更点をまとめます。

xevalサブコマンドが削除された

deno xevalは標準入力から受け取ったスクリプトを評価することのできるサブコマンドでしたが、

独自の規則等も多かったため、削除されたようです。

Deno.argvにスクリプト名が含まれなくなった

cmd.ts
console.log(Deno.args);
v0.28.1
$ deno run ./cmd.ts
[ "./index.ts" ]
v0.29.0
$ deno run ./cmd.ts
[]

スクリプト引数は--以降に指定するように変更された

cmd.ts
console.log(Deno.args);
v0.28.1
$ deno run --allow-env ./cmd.ts -- arg1 arg2
[ "./index.ts", "--", "arg1", "arg2" ]

$ deno run --allow-env ./cmd.ts arg1 arg2
[ "./index.ts", "arg1", "arg2" ]
v0.29.0
$ deno run --allow-env ./cmd.ts -- arg1 arg2
[ "arg1", "arg2" ]

$ deno run --allow-env ./cmd.ts arg1 arg2
error: Found argument 'arg1' which wasn't expected, or isn't valid in this context

また、本修正にともない、--allowフラグの前にスクリプトを指定できるようになっています。

cmd.ts
console.log(Deno.env());
# v0.29.0より前のバージョンでは、下記実行時にエラーが発生します
$  deno run ./cmd.ts --allow-env
{ ... }

Deno.mkdirの型定義が修正された

Deno.mkdirスタイルガイドに準拠するよう修正されました。

v0.28.1以前では下記のようにオプションを指定していましたが、

v0.28.1
// 再帰的にディレクトリを作成する
await Deno.mkdir('a/b', true);

// パーミッションを指定してディレクトリを作成する
await Deno.mkdir('a/b', true, 0o755);

v0.29.0では下記のようにオブジェクトを渡すことができます。

// 再帰的にディレクトリを作成する
await Deno.mkdir('a/b', { recursive: true });

// パーミッションを指定してディレクトリを作成する
await Deno.mkdir('a/b', { recursive: true, mode: 0o755 });

Deno.createが追加された

Deno.open(filename, 'w+')と同様の挙動をします。

const file = await Deno.create('hoge.txt');
try {
  const encoder = new TextEncoder();
  const data = encoder.encode('Hello');
  await file.write(data);
} finally {
  file.close();
}

コンパイラAPIが実装された

denoに組み込まれているTypeScriptにアクセスするためのAPIが追加されました。

Deno.compile(rootName, sources, options)

rootNameで指定されたファイルをコンパイルし、結果をキャッシュします。(Linux環境で確認したところ、コンパイル結果は ~/.cache/deno/genディレクトリにキャッシュされているようです)

sources及びoptions引数の指定は必須ではありません。

options引数にはDeno.CompilerOptions型(TypeScriptのコンパイラオプションのサブセット)のデータを渡せます。

sourcesオプションの有無によって挙動が異なります。

sources引数なし

下記のようなファイルを用意します。

mod.ts
import { hoge } from './hoge.ts';

console.log(hoge());
hoge.ts
export function hoge(): string {
  return 'hoge';
}
index.ts
const [diagnostics, emitMap] = await Deno.compile('./mod.ts');
console.log(diagnostics); // コンパイルエラー等に関する情報. コンパイルに成功した際は`null`が返却されます。
console.log(JSON.stringify(emitMap, null, 2)); // コンパイル結果

index.tsを実行すると、mod.ts及びそこから再帰的にimportされているTypeScriptファイルがコンパイルされます。

$ deno run ./index.ts
null
{
  "file:///home/uki00a/work/hoge.js.map": "{\"version\":3,\"file\":\"hoge.js\",\"sourceRoot\":\"\",\"sources\":[\"hoge.ts\"],\"names\":[],\"mappings\":\"AAAA,MAAM,UAAU,IAAI;IAClB,OAAO,MAAM,CAAC;AAChB,CAAC\"}",
  "file:///home/uki00a/work/hoge.js": "export function hoge() {\n    return 'hoge';\n}\n//# sourceMappingURL=hoge.js.map",
  "file:///home/uki00a/work/mod.js.map": "{\"version\":3,\"file\":\"mod.js\",\"sourceRoot\":\"\",\"sources\":[\"mod.ts\"],\"names\":[],\"mappings\":\"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC\"}",
  "file:///home/uki00a/work/mod.js": "import { hoge } from './hoge.ts';\nconsole.log(hoge());\n//# sourceMappingURL=mod.js.map"
}
sources引数あり

sources引数で指定された内容を元に、コンパイル時のモジュールの解決を行います。

sources引数には、キーにモジュール名、値にそのモジュールのソースを設定したオブジェクトを渡します。

index.ts
const [diagnostics, emitMap] = await Deno.compile('/mod.ts', {
  '/mod.ts': `
      import { piyo } from "./piyo.ts";
      console.log(piyo());
    `,
  '/piyo.ts': 'export const piyo = () => "piyo";'
});
console.log(diagnostics);
console.log(JSON.stringify(emitMap, null, 2));
$ deno run ./index.ts
null
{
  "/piyo.js.map": "{\"version\":3,\"file\":\"piyo.js\",\"sourceRoot\":\"\",\"sources\":[\"piyo.ts\"],\"names\":[],\"mappings\":\"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC\"}",
  "/piyo.js": "export const piyo = () => \"piyo\";\n//# sourceMappingURL=piyo.js.map",
  "/mod.js.map": "{\"version\":3,\"file\":\"mod.js\",\"sourceRoot\":\"\",\"sources\":[\"mod.ts\"],\"names\":[],\"mappings\":\"AACQ,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC\"}",
  "/mod.js": "import { piyo } from \"./piyo.ts\";\nconsole.log(piyo());\n//# sourceMappingURL=mod.js.map"
}

Deno.bundle(rootName, sources, options)

引数の形式はDeno.compileと同様です。

Deno.bundleはモジュールのバンドルを行い、その結果を単一の文字列として返却します。

(async () => {
  const [diagnostics, emit] = await Deno.bundle('/mod.ts', {
    '/mod.ts': `
        import { piyo } from "./piyo.ts";
        console.log(piyo());
      `,
    '/piyo.ts': 'export const piyo = () => "piyo";'
  });
  console.log(diagnostics);
  console.log(emit); // バンドル後のプログラム(文字列)
})();

Deno.transpileOnly(sources, options)

sources引数で渡された内容を元にトランスパイルを行い、その結果をソースファイル名をキー、トランスパイル結果を値として持つオブジェクトとして返却します。

型チェックやモジュールの依存解決は行われません。

sources及びoptions引数は、Deno.compileDeno.bundleと同様の形式で指定します。

const result = await Deno.transpileOnly({
  '/mod.ts': `
      import { piyo } from "./piyo.ts";
      console.log(piyo());
    `,
  '/piyo.ts': 'export const piyo = () => "piyo";'
});
console.log(JSON.stringify(result, null, 2));
/*
  {
    "/piyo.ts": {
      "source": "export const piyo = () => \"piyo\";\r\n//# sourceMappingURL=piyo.js.map",
      "map": "{\"version\":3,\"file\":\"piyo.js\",\"sourceRoot\":\"\",\"sources\":[\"piyo.ts\"],\"names\":[],\"mappings\":\"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC\"}"
    },
    "/mod.ts": {
      "source": "console.log(piyo());\r\n//# sourceMappingURL=mod.js.map",
      "map": "{\"version\":3,\"file\":\"mod.js\",\"sourceRoot\":\"\",\"sources\":[\"mod.ts\"],\"names\":[],\"mappings\":\"AAEQ,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC\"}"
    }
  }
*/

その他修正点

WebSocketサーバに接続する際に、クエリパラメータが空であれば?が送信されないように修正された(std/ws)

std/encoding/yaml.tsからparseAllがエクスポートされた

TextEncoderのパフォーマンス向上

UTF-8文字列のエンコーディングがおよそ4.5倍程向上したようです。

libdenoがrusty_v8に置き換えられた

C++で実装されていたlibdenoがrusty_v8に置き換えられました。

v8のバージョンが8.1.108にアップデートされた

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?