Deno v1.44

Deno v1.44がリリースされました。 この記事では主な変更点などについて解説します。 Node.js互換性の改善 .npmrcのサポート プライベートレジストリからnpmパッケージを読み込むために、.npmrcのサポートが追加されています。 現時点ではpackage.jsonまたはdeno.jsonと同一ディレクトリにある.npmrcのみが探索されます (ホームディレクトリなどからの読みこみはまだサポートされていません) .npmrcの設定内容はnpm:などによりnpmパッケージを利用する場合に適用されます。設定内容としては、現時点では_authTokenと_authのみがサポートされています。 組み込みパッケージ 主にgrpc-nodeやNext.js, Eleventyなどに関連したNode.js組み込みパッケージの互換性が改善されています。 Next.jsのサポートについて 公式ブログによると、DENO_FUTURE=1の指定が必要なもののNext.jsが動作するようになったようです (後日ブログポストが公開予定とのこと) @google-cloud/visionのサポート @google-cloud/visionも動作するようになったようです。 主な変更点 node:buffer: isUtf8とisAsciiが実装されています node:fs: fstatSyncでthrowIfNoEntryオプションがサポートされています node:fs: writeなどでposition引数がうまく機能しない問題が修正されています node:http: ServerResponseでstatusCodeのデフォルト値がundefinedから200に変更されています @11ty/eleventy-dev-serverを動かすための対応 (#78) node_modules/.bin Denoがnode_modulesを作成する際に、node_modules/.binが作成されるようになりました。 $ deno run --allow-env --allow-read --node-modules-dir npm:cowsay@1.6.0 hi $ ls node_modules/.bin cowsay cowthink deno.lockサポート 今までdeno.lockはdeno.jsonがある場合は自動的に生成されていました。今回のリリースでpackage.jsonがある場合にも自動でdeno.lockが作成されるように挙動が変更されました。 またDENO_FUTURE=1が設定された状態でdeno installを実行した際に、deno.lockをベースにパッケージを解決することによりパフォーマンスの改善も図られています (#23918) deno task deno taskでスクリプトを実行する際に、そのスクリプトでnpm runが利用されていて かつ npm runにフラグが指定されていなければ、npm runをdeno taskに置きかえた上でpackage.jsonのスクリプトが実行されるように挙動が変更されています。 例えば、以下のような内容のdeno.jsonとpackage.jsonが存在する場合、deno task testを実行すると、package.jsonのhiスクリプトが実行されます。 deno.json: { "tasks": { "hi": "echo deno....

June 2, 2024

Deno v1.43

Deno v1.43がリリースされました。 この記事では主な変更点などについて解説します。 HTTPサーバー deno serveコマンド HTTPサーバーの起動を簡略化するためにdeno serveコマンドが追加されました。 使い方などについてはこちらのページを参照いただければと思います。 公式ブログによると、将来的にはロードバランシングなどの仕組みをdeno serveコマンドに導入することなども検討されているようです。 Request.signalのサポート Deno.serveのハンドラーに渡されるRequestオブジェクトでsignalプロパティがサポートされています。 これについても詳細はこちらのページを参照いただければと思います。 Deno.HttpServer.addr Deno.HttpServerにaddrプロパティが追加されています。HTTPサーバーの起動ポートなどを確認できます。 const server = Deno.serve((req) => new Response("OK")); console.info(server.addr.port); // => 8000 TypeScript compilerOptions.jsxImportSourceTypes deno.jsonにcompilerOptions.jsxImportSourceTypesというDeno独自のオプションが導入されました。 { "compilerOptions": { "jsx": "react-jsx", "jsxImportSource": "npm:react@18.3.1", "jsxImportSourceTypes": "npm:@types/react@18.3.1" } } JSX Transformを有効化した場合、TypeScriptは<some-jsx-package>/jsx-runtimeをimportするようなコードを生成します。 // 例) Reactの場合、以下のようなコードが生成されます import {jsx as _jsx} from 'react/jsx-runtime'; // ... 元々、この<some-jsx-package>/jsx-runtimeのimportに対して適用すべき型定義を判断する方法がDenoには存在せず、JSX Transformを有効化してReactなどを使う場合に型エラーが発生する課題がありました。(TypeScriptによって自動生成されるコードのため@deno-typesプラグマを適用することもできない) この課題を解消するため、compilerOptions.jsxImportSourceTypesが導入されたようです。このオプションを指定することで、上記のような<some-jsx-package/jsx-runtimeのimportに対して、Denoがどの型定義を適用すればよいか判断できるようになります。また、@jsxImportSourceなどと同様に、ソースコード内で@jsxImportSourceTypesプラグマを指定することも可能です。 /** @jsxImportSourceTypes npm:@types/react@18.3.1 */ Preactの場合はパッケージ内に型定義が同梱されているのでこの問題が起きなかったようなのですが、Reactの場合は@types/reactで別管理されている関係もあり、専用の解決策が必要と判断されて導入されたようです。 https://github....

May 5, 2024

Deno v1.42

Deno v1.42がリリースされました。 この記事では主な変更点などについて解説します。 Deno v2に向けた変更 DENO_FUTUREによるDeno.*配下の非推奨APIの削除 DENO_FUTURE=1を指定すると、Deno.*配下の非推奨APIが削除されるようになりました。 deno installに--globalオプションが追加 deno installコマンドはインターネット上などで公開されたスクリプトをインストールするためのコマンドです。(デフォルトのインストール先は$HOME/.deno) Deno v2ではこのdeno installコマンドはデフォルトでdeno addコマンドのエイリアスとして機能するように変更される予定のようです。 deno install changes for Deno 2 (#23062) この変更に向けてdeno installコマンドに--global/-gオプションが追加されました。Deno v2のリリース以降、Deno v1におけるdeno installと同じ振る舞いをさせるためには、この--globalオプションを指定する必要があります。 $ deno install --global --allow-read=. --allow-write=. --allow-net https://deno.land/x/udd/main.ts deno lint Quickfixのサポート deno lintとdeno lspでQuickfixがサポートされました。deno lintでは--fixオプションによりQuickfixを実行できます。 $ deno lint --fix main.js 今のところ以下のルールでQuickfixがサポートされています。 no-window no-window-prefix verbatim-module-syntax jsr関連のルールの自動適用 deno.jsonにname/version/exportsが定義されていたら、jsr関連のlintルールが自動で有効化されるように挙動が変更されています。 適用されるルールについては以下で確認できます。 $ deno lint --rules-tags=jsr --rules deno task タスクのコメント deno taskコマンドがタスクに記述されたコメントを認識してくれます。 // deno.jsonc { "tasks": { // Run tests "test": "deno test --allow-read=....

March 31, 2024

Deno v1.41

Deno v1.41がリリースされました。 この記事では主な変更点などについて解説します。 Deno API Deno.FsFile Deno.FsFileにisTerminalとsetRawメソッドが追加されています。 Deno.isattyは非推奨化されているため、Deno.FsFileやDeno.stdinなどのisTerminalメソッドへの移行が推奨されます。 Deno.ConnectTlsOptions Deno.ConnectTlsOptionsにcertとkeyオプションが追加されています。 これに伴い、Deno.ConnectTlsOptionsのcertChainとprivateKeyは非推奨化されているため、新しく追加されたこれらへの移行が推奨されます。 破壊的変更 Deno.DatagramConnとDeno.HttpClientからridプロパティが削除されました。 Deno.CreateHttpClientOptionsのcertChainがcert、privateKeyがkeyにリネームされました。 パッケージシステム パッケージシステム (deno publish)に関してもいくつか改善が行われています。 ⚠️ jsr:に関しては、現在はwaitlistが公開されている段階で、まだ正式には利用できません。 deno lint deno lintにno-slow-typesルールが導入されています (#22430) このルールはdeno.jsonにname, version, 及びexportsフィールドが定義されている場合、自動で有効化されるようです。 このルールが有効化されている場合、fast checkが実行されるようです。 型チェックに関する改善 deno publishの実行時に型チェックが実行されるように変更されています (#22506) デフォルトではローカルモジュールに対してのみfast checkが行われるようです。--allow-slow-typesを指定するとfast checkではなく通常の型チェックが行われるようです また、fast checkに関しては、deno lintなどのコマンドと同様にSQLiteをベースにキャッシュの仕組みが導入されており、型チェックがより効率化されています。(#22485) deno lsp deno lspでjsr:URL向けにimportの補完が実装されています (#22462) deno compile v1.40.5でdeno compile向けの軽量バイナリであるdenortが再導入されています。 Deno v1.41ではstripコマンドを実行することでdenortバイナリがさらに軽量化されています。Deno公式のリリースポストによると、今後、deno compileをする際に特定の機能のみを有効化したカスタムビルドをサポートすることで、さらにバイナリを軽量化することなども検討されているようです。 その他には、deno compileでdeno.jsonのcompilerOptionsなどが効かない問題が修正されています。 deno info deno infoコマンドを実行した際もロックファイル(deno.lock)が生成されるように挙動が改善されています。 Node.js互換性 影響が大きそうな内容として、process.envからパーミッションが与えられていない環境変数にアクセスしようとした際に、パーミッションプロンプトが表示されるように挙動が変更されています。 それ以外には、node:testではDenoのテストサニタイザーの仕組みが無効化されています。 参考 https://github.com/denoland/deno/releases/tag/v1.41.0 Deno 1.41: smaller deno compile binaries

February 25, 2024

Deno v1.40

Deno v1.40がリリースされました。 この記事では主な変更点などについて解説します。 Temporalサポート DenoでTemporal がサポートされました。利用するには--unstable-temporalの指定が必要です。 Temporal.Now.instant(); 今のところTemporalのサポートはv2での安定化が検討されているようです。 Decorators proposal (stage 3)のサポート ⚠️ V8でまだサポートされていない関係で.jsファイルではまだ動作しないようなためご注意 (.tsなどのトランスパイルされるファイルでのみ動作します) TypeScript v5で導入されたDecorators (stage 3)がDenoでもサポートされました。 これに伴い、今までデフォルトで有効化されていたTypeScriptのexperimentalDecoratorsは無効化されたため、もし利用したい場合はdeno.jsonで明示的に有効化する必要があります。 { "compilerOptions": { "experimentalDecorators": true } } TypeScript5で導入されたStage 3のDecoratorを眺めてみる | 豆蔵デベロッパーサイト deno.json importsでnpm:URLのマッピングを定義する際の挙動の改善 (Import map expansion) npmパッケージが提供するサブパスの読み込みに関する挙動が改善されています。 例えば、deno.jsonでImport Mapsを定義しておき、npm:なしでmswとmsw/nodeを読み込みたい場面があったとします。 import { http, HttpResponse } from "msw"; import { setupServer } from "msw/node"; const server = setupServer( http.get(`${location.origin}/api/user`, () => HttpResponse.json({ id: 1, name: "foo", })), ); この場合、v1....

January 28, 2024

Deno v1.39

Deno v1.39がリリースされました。 この記事では主な変更点などについて解説します。 WebGPU APIの再導入 Deno v1.32で削除されたWebGPU APIが再導入されました。 利用するにはdeno.jsonでunstable: ["webgpu"]を指定するか--unstable-webgpuオプションの指定が必要です。 { "unstable": ["webgpu"] } 以下のリポジトリではWebGPU APIに関する使用例が公開されています。 https://github.com/denoland/webgpu-examples また、この追加に合わせて、deno_stdにもWebGPU API向けのユーティリティが追加されています。(std/webgpu) deno coverage サマリー/HTMLレポーターの追加 deno coverageコマンドにサマリーレポーターとHTMLレポーターが追加されました。 サマリーレポーターは新しくdeno coverageコマンドのデフォルトで使用されるレポーターとして設定されていて、以下のような形式でレポートが出力されます。 $ deno coverage ./coverage ----------------------------------------------------------- File | Branch % | Line % | ----------------------------------------------------------- demo/components/Button.tsx | 100.0 | 0.0 | demo/fresh.gen.ts | 100.0 | 100.0 | ... 省略 ... internal/test_utils/mod.ts | 100.0 | 100.0 | server.ts | 83....

December 17, 2023

fresh v1.6

fresh v1.6がリリースされました。 この記事では主な変更点などについて解説します。 Tailwind CSSの公式サポート fresh公式でTailwind CSSのサポートが導入されました。 Tailwind CSSプラグイン (plugins/tailwind.ts)が追加されています。 // fresh.config.ts import { defineConfig } from "$fresh/server.ts"; import tailwind from "$fresh/plugins/tailwind.ts"; export default defineConfig({ plugins: [tailwind()], }); 本番環境での利用について このTailwind CSSプラグインをDeno Deployで利用する場合は、事前ビルドとの併用が必須になるためご注意ください。 このプラグインを導入した状態でdeno task buildを実行すると、_fresh/staticにCSSファイルが生成されるため、Deno Deployではこちらが利用される想定です。(_fresh/staticについては後述します。また、本番ビルド時に生成されるCSSファイルはcssnanoで最適化されます) 新規プロジェクトへの導入について freshのinit.tsでプロジェクトを初期化する際に、Tailwind CSSの有効化がサポートされています。 既存プロジェクトへの導入方法 deno.jsonで公式で推奨されるバージョンのTailwind CSSを読み込むよう設定します。 ($fresh/src/dev/imports.ts) { "imports": { // ... 省略 ... "tailwindcss": "npm:tailwindcss@3.3.5", "tailwindcss/": "npm:/tailwindcss@3.3.5/", "tailwindcss/plugin": "npm:/tailwindcss@3.3.5/plugin.js" }, // ... 省略 ....

December 3, 2023

Deno v1.38

Deno v1.38がリリースされました。 この記事では主な変更点などについて解説します。 deno doc deno doc --lint deno docコマンドで--lintオプションがサポートされました。 $ deno doc --lint mod.ts Missing JS documentation comment. at file:///home/uki00a/ghq/github.com/uki00a/some-project/mod.ts:12:3 このオプションを指定すると、DenoはAPIドキュメントを出力する前に、各APIを検査します。そして以下のようなAPIが検出された場合、APIドキュメントを出力せずにエラーを表示します。 exportされているAPIにJSDocコメントが書かれていない場合 (Missing JS documentation comment.) exportされているAPIの戻り値の型定義が省略されている場合 (Missing return type.) exportされている型のプロパティがexportされていない型を参照している場合 (Type 'foo' references type 'Bar' which is not exported from a root module.) このエラーが発生した場合、そのexportされていない型に@internalを指定することでエラーを抑止できます deno doc --html deno docでAPIドキュメントのHTML形式での出力がサポートされました。 --htmlを指定すると、docsディレクトリにHTMLが出力されます。 $ deno doc --html --name=fresh-testing-library mod.ts Written 261 files to "./docs/" docs/index.htmlを開くことで作成されたAPIドキュメントを閲覧できます。...

November 5, 2023

fresh v1.5

fresh v1.5がリリースされました。 この記事では主な変更点などについて解説します。 Partials SPAライクなクライアントサイドでのページ遷移を実現するためにPartialsという機能が導入されました。 基本的な使い方 以下のコードを例に見てみます。 // routes/docs/[id].tsx import { Partial } from "$fresh/runtime.ts"; export default function Page({ docs, currentDoc }: { docs: Array<Doc>, currentDoc: Doc }) { return ( <> <Sidebar docs={docs} /> <Partial name="docs-main-content"> <MainContent doc={currentDoc} /> </Partial> </> ); } function Sidebar({ docs }: { docs: Array<Doc> }) { return ( <nav f-client-nav> <ul class="flex flex-col gap-2"> {docs....

October 15, 2023

Deno v1.37

Deno v1.37がリリースされました。 この記事では主な変更点などについて解説します。 実験的なパッケージマネージャが実装 (jsr:URL) ⚠️この機能は実験的機能のようなので、今後、大きな変更が入る可能性があります。 ⚠️また、パッケージレジストリがまだ公開されていないため、この機能はまだ利用できない状態のようです。 Deno本体に実験的なパッケージマネージャーが実装されています。 具体的には、以下のようにjsr:形式のURLを記述することで、Denoがパッケージレジストリと連携してsemverの解決などを行いつつ、パッケージのインストールなどを自動で行ってくれるようです。 import { foo } from "jsr:@foo/some_pkg@1/mod.ts"; 例えば、この場合、@foo/some_pkgパッケージに関するsemverの解決を行うために、まずhttps://${DENO_REGISTRY_URL}/@foo/some_pkg/meta.jsonの問い合わせを行い、その内容を元にどのバージョンをインストールすべきか判断されるようです。 従来のhttps:やnpm:形式のパッケージと同様に、npm installなどのコマンドの実行は不要で、スクリプトの実行時にDenoが必要に応じてパッケージをインストールしてくれます。 また、パッケージのインストール元レジストリはDENO_REGISTRY_URL環境変数で変更可能なようです。 ここからは推測になりますが、この機能は、元々、導入される予定であったdeno:URLに相当する機能だと思われます。 Deno本体がレジストリと連携してsemver解決を行うことで、依存関係の重複問題などを解消しようというのがこの機能の狙いだと思われます。 feat(unstable): package manager #20517 Built-in support for semvered specifiers on the deno.land/x registry #17495 deno jupyter Deno本体にJupyter Kernelが実装されました。 以下のコマンドを実行すると、Deno Kernelがインストールされているかどうかを確認できます。 $ deno jupyter --unstable ℹ️ Deno kernel is not yet installed, run `deno jupyter --unstable --install` to set it up もしインストールされていなければ、以下のコマンドでインストールできます。...

September 24, 2023