Node 学園 #38
Deno Node ྆ ͍͖ͬͯ@mizchi | PLAID Inc.NodeֶԂ 38࣌ݶ
View Slide
Deno ͍͍ΑͶ…͍·͙͢ curl -fsSL https://deno.land/install.sh | sh
Deno ͍͍ΑͶ…• ࣄલ install ෆཁ: εχϖοτ͕ಈ͘อূ͕ͱΓ͍͢• => node+ts ࣮ߦڥ͕ࣗ໌Ͱͳ͍• ΤίγεςϜ͕ TS ܾΊଧͪ• ΈࠐΈ lint | fmt | test ͷମݧͷྑ͞• => node eslint+typescript+prettier ڥͷߏங͕ͩΔ͍• Deno ຊମͷίʔυ͕ಡΈ͍͢• Rust Ͱ tokio + rusty-v8(v8 Binding)
node: ͜ΕͲ͏ͬͯಈ͘ͷʁ// native esm ͔ɺ comnonjs ܦ༝͔ෆ໌import foo from "foo"; // module.exports? export default?import { xxx } from "@/x"; // ͩΕ͕͜ͷύεΛղܾ͢Δʁ;// ڥมͳͷ͔ɺόϯυϥʹ replace ͞ΕΔͷ͔console.log(process.env.NODE_ENV);
Deno (ͷར༻ऀ)ͷ՝• طଘࢿ࢈ͷར༻• طଘͷͷ Node ༻ͩ͠…• ҆શੑ͕આ໌Ͱ͖Δ͔• ಈతͳωοτϫʔΫ૬खʹґଘղܾ͢Δෆ҆• ։ൃମݧ• vscode ͕ͪΌΜͱରԠͯ͘͠Εͳ͍ͱ͑ͳ͍ΑͶ
ࣗͷࢥ͏ Deno ࠾༻ͷ͠͞• 1. ࠜຊతʹґଘղܾϙϦγʔ͕ҧ͏• 2. ࠜຊతʹඪ४ϥΠϒϥϦ͕ҧ͏• 3. vscode-deno ͕ඪ४ͷ (Microsoft) TypeScript ͱഉଞؔ
ཁҧ͍Λཧղͯͤ͠Α͍ʂʂ• Node ͱ Deno ͷϙϦγʔΛཧղ͢Δ• ཧղͨ͠ΒదͳղܾࡦΛऔΕΔ• ղܾࡦΛఏࣔͨ͠Β࠾༻ΛωΰΕΔཧղ͢Δͧʂʂʂ
ܗ͔ΒೖΔ Deno• node Ͱ lint ͱ fmt ͚ͩआ༻͠Α͏ͥʂ• ࢀߟ: node ϓϩδΣΫτͰ deno lint | deno fmt ͢Δ https://zenn.dev/mizchi/articles/just-lint-by-deno• deno.jsonc Λஔ͘$ deno fmt$ deno linteslint+typescript+prettier ૬
ґଘղܾ: ϞδϡʔϧDeno ωοτϫʔΫܦ༝ͰґଘΛղܾ͢Δ// node: npm install zod --saveimport { z } from "zod";// denoimport { z } from "https://deno.land/x/[email protected]/mod.ts";
ґଘղܾ: ϩʔΧϧ֦ுࢠ/σΟϨΫτϦͷলུෆՄ// node + tscimport { foo } from "./foo";import { bar } from "./bar";// denoimport { foo } from "./foo.ts";import { bar } from "./bar/index.ts";※ node Ͱ Native ESM ͷͱ͖ɺdeno ͱಉ֦͘͡ுࢠলུෆՄ
Deno ͕ Node ޓͰͳ͍ཧ༝• ry ʮDeno ͷ࣮ߦݖݶ༩ͱηοτͳͷͰɺ৴པͰ͖ͳ͍ωοτϫʔΫ͔ΒґଘΛղܾͯ͠ͳ͍ʯ (ޙड़)• ֦ுࢠͷলུෆՄ RTT ΛݮΒͨ͢Ίʹඞཁ• node: ./foo => foo/package.json#main, foo/index{.*},foo{.*}• ͦͦ ESM ͷ༷ʹύεͷ࣮ମղܾϧʔϧఆٛ͞Εͯͳ͍• ϒϥβ্ͷ ESM Ͱجຊతʹ֦ுࢠলུෆՄ(※ઃఆʹΑΔ)
First Step: ؾ͚࣋ͪͩ Deno• Rust crate ෩: mod.rs Ͱ֎ʹ export• deps.ts Ͱ֎෦ϞδϡʔϧΛ import// mylib/deps.tsexport { z } from "https://deno.land/x/[email protected]/mod.ts";// mylib/mod.tsimport { z } from "./deps.ts";export const version: number = 1;export function validate(input: any) {return z.string().safeParse(input)};(งғؾΛ͍ͬͯΕޙͰೃછΈ͍͢ɺؾ͕͢Δ…)• ۃɺ֎෦ import Deno.* Θͳ͍୯ମϑΝΠϧ྆༻Մ
Deno ͷηΩϡϦςΟ• --allow-env=• --allow-hrtime• --allow-net=• --allow-read=• --allow-write=• --allow-ffi• --allow-run=:• -A, --allow-all
Deno ͷηΩϡϦςΟ: ਅ໘ʹॻ͘deno deploy ͷ CLI Πϯετʔϧͷྫ$ deno install \--allow-read \--allow-write \--allow-env \--allow-net \--allow-run \--no-check -r -f https://deno.land/x/deploy/deployctl.ts
Deno ͷηΩϡϦςΟ: ͖ͯ͜͏ͳΔ# શ෦ڐՄ$ deno run -A build.ts# velociraptor (task runner) ͷ install ྫ$ deno install -qAn vr https://deno.land/x/[email protected]/cli.ts
Ӵࡦ: ಈతURLΛݕ• αϓϥΠνΣʔϯΞλοΫͰಈత URL ߈ܸର• https://deno.land/std/http/server.ts• => https://deno.land/[email protected]/http/server.ts• ࠓޙ҆શͳ URL ͔୭͕ݴ͑Δͷ͔ʁ• nest.land: ϒϩοΫνΣʔϯ্ͷύʔϚωϯτͳ URL ʹσϓϩΠ• deno vendor (v1.19): node_modules ͱಉ͡Α͏ʹϩʔΧϧʹݻΊ͔ͯΒ࣮ߦ
Ӵࡦ: deno task --unstable (v1.20)• deno task(Deno): λεΫϥϯφʔͰݖݶΛΈͬͪΓॻ͘{"tasks": {"hello": "deno run --allow-read hello.ts"}}
ηΩϡϦςΟ·ͱΊ• ҆શدΓʹ͢ͳΒ nest.land deno.land ͷόʔδϣϯ͖URLͷΈ৴པ͢Δ• αϘͬͯ -A ͯ͠͠·͏ͷΛ͙ΈΛ࡞Βͳ͍ͱݖݶཧ͕ҙຯͳ͍
૬ޓӡ༻Λߟ͑Δ• Deno => Node• Node => Deno
Deno ͔Β npm ΛݺͿ: CDN• ୯ମϑΝΠϧ(όϯυϧࡁΈ)ͳΒޓ• CDN ͕ X-Typescript-Types Λฦ͍ͯ͠Εɺ.d.ts Λ͔ͦ͜Βղܾ• package.json ͷ types Λ͏• skypack.dev esm.sh ͕ରԠ// ͜Ε͕ܕͰ͑Δimport React from "https://cdn.esm.sh/react@17";
deno ͔Β node ΛݺͿ: deno --compathttps://deno.land/[email protected]/nodeimport { createRequire } from "https://deno.land/[email protected]/node/module.ts";const require = createRequire(import.meta.url);const path = require("path");$ deno run --compat --unstable --allow-read deno-compat.ts• https://deno.land/std/node ʹޓϨΠϠʔͷ࣮͕͋Δ• ͋Μ·Γಈ͍ͯͳ͍
node ͔Β deno ݺͿ: dnt• https://github.com/denoland/dnt• ࢀߟ: deno to node ͷ dnt ࢼ͢ https://zenn.dev/mizchi/scraps/a37ea7c793094f// ͜͏͍͏ίʔυΛల։export { delay } from "https://deno.land/x/[email protected]/mod.ts";• https://...ͷ ϞδϡʔϧΛϩʔΧϧʹղܾ• Deno Λ node ༻ʹม => import { Deno } from "@deno/shim-deno";
dnt ʹΑΔల։ྫnpm/!"" LICENSE!"" README.md!"" esm# !"" deps# # $"" deno_land_x# # $"" delay_v0.2.0# # !"" mod.js# # $"" src# # $"" delay.js
dnt ͑Δ͔ʁ• denoland ެࣜͳͷخ͍͕͠…• ਖ਼ node Ͱॻ͍ͯόϯυϧͯ͠͏ͷָ͕• (ϑϩϯτΤϯυతʹ) ॏෳίϯτϩʔϧͱ͔Ͱ͖ͳͦ͞͏
Node Λ Deno ͬΆ͘ಈ͔͢$ node --experimental-network-imports code.jsNode ͷ Deno ෩ network-import (experimental)https://nodejs.org/api/esm.html#https-and-http-imports// file.mjsimport worker_threads from 'worker_threads';import { configure, resize } from 'https://example.com/imagelib.mjs';configure({ worker_threads });
։ൃڥʹ͍ͭͯ
VSCode• vscode_deno ΛΠϯετʔϧͯ͠࠶ىಈ https://github.com/denoland/vscode_deno• Shift+Command+P ͰҎԼͷίϚϯυΛ࣮ߦ• Deno: Initialize Workspace Configuration• Deno: Cache Dependencies// .vscode/settings.json{"deno.enabled": true}
vscode_deno Կ͕ى͜Δ͔• typescript ͷ lsp Λୣͬͯ deno ༻ʹࠩ͠ସ͑Δ• node ༻ͷͷٯʹյΕΔ
vscode: Node Deno ڞଘ## ௨ৗͷ Node.vscode/settings.json # "deno.enabled": false## ͚ͩ͜͜ Denodeno/.vscode/settings.json # "deno.enabled": truecode .code deno --add※ʹΑͬͯಈ͍ͨΓಈ͔ͳ͔ͬͨΓ͠·͢
͕ࣗࢥ͏ Deno ͷݱ࣌ͷϢʔεέʔε• ॻ͖ࣺͯͷ CLI (εχϖοτ࣮ߦՄೳੑ͕ߴ͍)• ϏϧυπʔϧνΣΠϯ• Rust ࿈ܞ෦• αʔόʔӡ༻͍͚͠Ͳ deno deploy ͳΒϑϧϚωʔδυͰ͋Γ
͓ΘΓ·ͱΊͰlint ͋ͨΓ͔Βજ·͍͖ͤͯͬͯ·͠ΐ͏ʂ