概要
denoのv0.29.0がリリースされたため、変更点をまとめます。
xevalサブコマンドが削除された
deno xeval
は標準入力から受け取ったスクリプトを評価することのできるサブコマンドでしたが、
独自の規則等も多かったため、削除されたようです。
Deno.argv
にスクリプト名が含まれなくなった
console.log(Deno.args);
$ deno run ./cmd.ts
[ "./index.ts" ]
$ deno run ./cmd.ts
[]
スクリプト引数は--
以降に指定するように変更された
console.log(Deno.args);
$ deno run --allow-env ./cmd.ts -- arg1 arg2
[ "./index.ts", "--", "arg1", "arg2" ]
$ deno run --allow-env ./cmd.ts arg1 arg2
[ "./index.ts", "arg1", "arg2" ]
$ 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
フラグの前にスクリプトを指定できるようになっています。
console.log(Deno.env());
# v0.29.0より前のバージョンでは、下記実行時にエラーが発生します
$ deno run ./cmd.ts --allow-env
{ ... }
Deno.mkdir
の型定義が修正された
Deno.mkdir
がスタイルガイドに準拠するよう修正されました。
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
引数なし
下記のようなファイルを用意します。
import { hoge } from './hoge.ts';
console.log(hoge());
export function hoge(): string {
return 'hoge';
}
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
引数には、キーにモジュール名、値にそのモジュールのソースを設定したオブジェクトを渡します。
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.compile
やDeno.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にアップデートされた