deno 使ってみました
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ 結構いい感じ
◆ 完全ではないものの基本的にブラウザ互換
◆ URL 指定でモジュールをインポートできる
◆ npm に置く必要ない
◆ npm にまとまってないと探すのつらそう
◆ 完全ではないものの基本的にブラウザ互換
◆ URL 指定でモジュールをインポートできる
◆ npm に置く必要ない
◆ npm にまとまってないと探すのつらそう
1.0 が無事予定どおり記念日にリリースされました
1.0 が出たことですし 使ってみました
~/.deno/bin/deno に 1 ファイルが配置されるだけです
ファイルがいっぱいあるよりは 1 ファイルにまとまってる方が扱いやすくていいと思います
その分 1 ファイルが 50MB ほどあります
ブラウザ互換というだけあってグローバルは window でアクセスできました
__proto__ は使えませんでした
結構不便です
window のプロパティを見ると Event や fetch があります
最後の p は上で代入したものなのでデフォルトのものではないです
DOMException や FormData はあるものの DOM 自体はなさそうです (Element とか Node とか Document とか DOMParser とか)
fetch とかで使う用でしょう
閉じるのは window.close です
open や close は window. いらなくてもついつけてしまうのですよね
fish の場合 終了後のプロンプトになにかエスケープらしいのが残りました
今のところは Ctrl-C で終わったほうが良いかもしれません
bash の場合は特に何も残りませんでしたが 見えないだけでエスケープの効果が出てるようです
文字を打っても表示されないですし エンターで実行すると構文エラーって言われます
また 改行が反映されなかったり色々おかしくなります
まだ 1.0 ですし Node.js と比べるとツール自体の完成度は低いです
タブキーで補完できないですし 色も付きません
.exit や .help みたいなのはなさそうです
ブラウザと同じ感じで使えます
lodash の escape だけ使いました
ブラウザと違って mime type のチェックはないので Github のページから raw ボタンを押して開いたページの URL を指定できます
npm でインストールしなくていいのは便利ですね
お手軽にモジュール単位でロードできるので上の例みたいに lodash がまた活躍するかもしれません
URL を指定すると 初回だけダウンロードされます
2 回目以降はキャッシュが使われます
キャッシュの場所は
です
上の escape.js の場合は deps フォルダの中にこういうパスで保存されていました
コンパイル済みのバイナリではなく そのままの JavaScript ファイルです
run というサブコマンドが必要です
[test.js]
[a.ts]
1 回目は JavaScript へのコンパイルが実行されます
2 回目以降は同じファイルなら行われません
JavaScript にコンパイルした結果もキャッシュされていて
以下に保存されます
.meta ファイルの中身はハッシュ値が入った JSON でした
[a.ts.meta]
コンパイル済み .js ファイルは
でした
実行前にユーザがプリプロセスとして変換がいらないのは大きいですね
内部的には変換しているものの 使う側が意識する必要はないです
基本 変更がないようなライブラリ部分だけ使って引数と返り値がわかるようにしておけば少し便利かなと思って軽く試して見ました
[module.ts]
[main.js]
ですが これって JavaScript から呼び出すときにはチェックはないですし強制力はないです
[main.js]
bigint じゃなくても 通ります
呼び出す側まで TypeScript でないとダメならたいした魅力もないですし 結局 JavaScript 実行環境として使いそうです
ところで 引数に型指定しないとエラーでした
暗黙的な any にはしてくれないみたいです
TypeScript の設定ファイルを使うことはできそうに思いますが 詳しくないので TypeScript はこの辺にしておきます
bundle や fmt や test が標準であるのはいいですね
self upgrade 機能もついてます
まだ バージョン 1.0 なのでそういう意味での不満点はありますが これから実装されていく部分でしょうし 変わらない根本的な方針みたいなところでイマイチと思うところは今のところなかったです
あえて言うなら URL の読み込みでしょうか
便利な一方 パッケージは npm の一箇所で管理されるわけではなくなります
上に書いたようなインポートもできるので Github に置くだけやホームページなど静的サイトのホスティングサービス上に .js や .ts ファイルを置くだけで十分です
公開する側や使う側はすごく楽になりました
しかし ◯◯するツールを探したいという場合は どこかでまとめて管理されてる方が楽です
一箇所で探すだけですし
あとは 基本同じ名前で重複できないので同じ名前のツールがいっぱい作られないというのも npm 管理の良いところでしょうか
ブラウザの良くも悪くもある部分を組み込んでしまったのが今後どうなるかですね
その他言語を見ても URL 指定するだけで動的にパッケージやモジュールをダウンロードして実行するなんて聞かないですし 問題点も出てきそうな気はします
ただ一番の心配点のセキュリティは deno では実行時に許可制になってるのでそこに致命的なバグでもなければブラウザ同様サンドボックスで守られてるはずです
1.0 が出たことですし 使ってみました
インストール
https://github.com/denoland/deno_install にそって⇩のコードを shell に貼り付けますcurl -fsSL https://deno.land/x/install/install.sh | sh
~/.deno/bin/deno に 1 ファイルが配置されるだけです
ファイルがいっぱいあるよりは 1 ファイルにまとまってる方が扱いやすくていいと思います
その分 1 ファイルが 50MB ほどあります
REPL
deno コマンドだけで実行すると REPL が使えますuser1@server ~ [127]> deno
Deno 1.0.0
exit using ctrl+d or close()
> 1 + 1
2
ブラウザ互換というだけあってグローバルは window でアクセスできました
> window === globalThis
true
__proto__ は使えませんでした
結構不便です
> class A {}
undefined
> const a = new A()
undefined
> a.__proto__
undefined
> p = Object.getPrototypeOf
[Function: getPrototypeOf]
> p(window)
{}
> p(p(window))
{}
> p(p(p(window)))
null
> p(p(window)) === Object.prototype
true
window のプロパティを見ると Event や fetch があります
> Object.getOwnPropertyNames(window).forEach(x => console.log(x))
Object
Function
Array
Number
parseFloat
parseInt
Infinity
NaN
undefined
Boolean
String
Symbol
Date
Promise
RegExp
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
globalThis
JSON
Math
console
ArrayBuffer
Uint8Array
Int8Array
Uint16Array
Int16Array
Uint32Array
Int32Array
Float32Array
Float64Array
Uint8ClampedArray
BigUint64Array
BigInt64Array
DataView
Map
BigInt
Set
WeakMap
WeakSet
Proxy
Reflect
decodeURI
decodeURIComponent
encodeURI
encodeURIComponent
escape
unescape
eval
isFinite
isNaN
Deno
queueMicrotask
bootstrap
SharedArrayBuffer
Atomics
FinalizationRegistry
WeakRef
WebAssembly
atob
btoa
clearInterval
clearTimeout
fetch
setInterval
setTimeout
AbortController
AbortSignal
Blob
ByteLengthQueuingStrategy
CountQueuingStrategy
crypto
File
CustomEvent
DOMException
ErrorEvent
Event
EventTarget
URL
URLSearchParams
Headers
FormData
TextEncoder
TextDecoder
ReadableStream
TransformStream
Request
Response
performance
Worker
WritableStream
addEventListener
dispatchEvent
removeEventListener
window
self
onload
onunload
close
closed
_
_error
p
最後の p は上で代入したものなのでデフォルトのものではないです
DOMException や FormData はあるものの DOM 自体はなさそうです (Element とか Node とか Document とか DOMParser とか)
fetch とかで使う用でしょう
閉じるのは window.close です
> window.close()
undefined
open や close は window. いらなくてもついつけてしまうのですよね
fish の場合 終了後のプロンプトになにかエスケープらしいのが残りました
今のところは Ctrl-C で終わったほうが良いかもしれません
bash の場合は特に何も残りませんでしたが 見えないだけでエスケープの効果が出てるようです
文字を打っても表示されないですし エンターで実行すると構文エラーって言われます
また 改行が反映されなかったり色々おかしくなります
まだ 1.0 ですし Node.js と比べるとツール自体の完成度は低いです
タブキーで補完できないですし 色も付きません
.exit や .help みたいなのはなさそうです
インポート
良い部分が URL からのインポートですブラウザと同じ感じで使えます
> import("https://raw.githubusercontent.com/lodash/lodash/master/escape.js").then(
module => console.log(module.default("<>&"))
)
Promise { <pending> }
<>&
lodash の escape だけ使いました
ブラウザと違って mime type のチェックはないので Github のページから raw ボタンを押して開いたページの URL を指定できます
npm でインストールしなくていいのは便利ですね
お手軽にモジュール単位でロードできるので上の例みたいに lodash がまた活躍するかもしれません
URL を指定すると 初回だけダウンロードされます
2 回目以降はキャッシュが使われます
キャッシュの場所は
~/.cache/deno/deps/
です
上の escape.js の場合は deps フォルダの中にこういうパスで保存されていました
https/raw.githubusercontent.com/0f786ed9b46d7e1f05b0408e15c65ec392702af89f7ec4c5b65a9efe53fbebc0
コンパイル済みのバイナリではなく そのままの JavaScript ファイルです
ファイルの実行
Node.js と違ってファイル名指定だけでは実行できないですrun というサブコマンドが必要です
[test.js]
console.log(1)
user@fedora32 ~> deno run test.js
1
TypeScript
デフォルトで TypeScript がサポートされていて .ts ファイルは TypeScript として扱われます[a.ts]
console.log(1)
user@fedora32 ~> deno run a.ts
Compile file:///home/user/a.ts
1
1 回目は JavaScript へのコンパイルが実行されます
2 回目以降は同じファイルなら行われません
user@fedora32 ~> deno run a.ts
1
JavaScript にコンパイルした結果もキャッシュされていて
~/.cache/deno/gen/
以下に保存されます
user@fedora32 ~> tree .cache/deno/gen
.cache/deno/gen
└── file
└── home
└── user
├── a.ts.js
├── a.ts.js.map
└── a.ts.meta
.meta ファイルの中身はハッシュ値が入った JSON でした
[a.ts.meta]
{"source_path":"/home/user/a.ts","version_hash":"a0a346188f704346b392a5a4daa8a3430406d6cf966fcde57ddf4dfece7215e0"}
コンパイル済み .js ファイルは
"use strict";
console.log(1);
//# sourceMappingURL=file:///home/user/.cache/deno/gen/file/home/user/a.ts.js.map
でした
実行前にユーザがプリプロセスとして変換がいらないのは大きいですね
内部的には変換しているものの 使う側が意識する必要はないです
チェックは .ts ファイルのみ
楽に使えるので 少し使ってみようかとも思ったのですが 型を細かく指定すると変更時の手間が増えます基本 変更がないようなライブラリ部分だけ使って引数と返り値がわかるようにしておけば少し便利かなと思って軽く試して見ました
[module.ts]
function mul(a: bigint, b: bigint) : bigint {
return a * b
}
export default mul
[main.js]
import m from "./module.ts"
console.log(99999999 * 99999999)
console.log(m(99999999n, 99999999n))
user@fedora32 ~> deno main.js
9999999800000000
9999999800000001n
ですが これって JavaScript から呼び出すときにはチェックはないですし強制力はないです
[main.js]
import m from "./module.ts"
console.log(m(10, 10))
console.log(m(1.2, 1.2))
user@fedora32 ~> deno main.js
100
1.44
bigint じゃなくても 通ります
呼び出す側まで TypeScript でないとダメならたいした魅力もないですし 結局 JavaScript 実行環境として使いそうです
ところで 引数に型指定しないとエラーでした
user@fedora32 ~> deno run b.js
Compile file:///home/user/a.ts
error: TS7006 [ERROR]: Parameter 'a' implicitly has an 'any' type.
function mul(a, b) {
^
at file:///home/user/a.ts:1:14
TS7006 [ERROR]: Parameter 'b' implicitly has an 'any' type.
function mul(a, b) {
^
at file:///home/user/a.ts:1:17
Found 2 errors.
暗黙的な any にはしてくれないみたいです
TypeScript の設定ファイルを使うことはできそうに思いますが 詳しくないので TypeScript はこの辺にしておきます
サブコマンド
ファイルを実行するのにサブコマンドの run が必要でしたが deno コマンドには実行や REPL 以外にもいろいろな機能がありますSUBCOMMANDS:
bundle Bundle module and dependencies into single file
cache Cache the dependencies
completions Generate shell completions
doc Show documentation for a module
eval Eval script
fmt Format source files
help Prints this message or the help of the given subcommand(s)
info Show info about cache or info related to source file
install Install script as an executable
repl Read Eval Print Loop
run Run a program given a filename or url to the module
test Run tests
types Print runtime TypeScript declarations
upgrade Upgrade deno executable to given version
bundle や fmt や test が標準であるのはいいですね
self upgrade 機能もついてます
デメリット
Node.js の悪かった部分を改良したというだけあって これと言った不満点は見つかりませんでしたまだ バージョン 1.0 なのでそういう意味での不満点はありますが これから実装されていく部分でしょうし 変わらない根本的な方針みたいなところでイマイチと思うところは今のところなかったです
あえて言うなら URL の読み込みでしょうか
便利な一方 パッケージは npm の一箇所で管理されるわけではなくなります
上に書いたようなインポートもできるので Github に置くだけやホームページなど静的サイトのホスティングサービス上に .js や .ts ファイルを置くだけで十分です
公開する側や使う側はすごく楽になりました
しかし ◯◯するツールを探したいという場合は どこかでまとめて管理されてる方が楽です
一箇所で探すだけですし
あとは 基本同じ名前で重複できないので同じ名前のツールがいっぱい作られないというのも npm 管理の良いところでしょうか
ブラウザの良くも悪くもある部分を組み込んでしまったのが今後どうなるかですね
その他言語を見ても URL 指定するだけで動的にパッケージやモジュールをダウンロードして実行するなんて聞かないですし 問題点も出てきそうな気はします
ただ一番の心配点のセキュリティは deno では実行時に許可制になってるのでそこに致命的なバグでもなければブラウザ同様サンドボックスで守られてるはずです