
è¯ãäžæ¥ãåéïŒFlavio Copesã«ãã
èšäºãTheDenoHandbookïŒA TypeScript Runtime Tutorial withCodeExamplesãã®ç¿»èš³ã玹ä»ããŸãã
ãã®èšäºã§ã¯ãDenoã®æäœæ¹æ³ãåŠç¿ããŸãããããNode.jsãšæ¯èŒããããã䜿çšããŠåçŽãªRESTAPIãæ§ç¯ããŸãã
ãããšã¯ïŒ
人æ°ã®ãããµãŒããŒåŽã®JavaScriptãšã³ã·ã¹ãã ã§ããNode.jsã«ç²ŸéããŠããå ŽåãDenoã¯ã»ãšãã©åãã§ããã»ãšãã©ã§ãããå®å šã§ã¯ãããŸããã
ç§ãæã奜ããªDenoæ©èœã®ãªã¹ãããå§ããŸãããïŒ
- ææ°ã®JavaScriptã«åºã¥ããŠããŸã
- æ¡åŒµå¯èœãªæšæºã©ã€ãã©ãªããããŸã
- æšæºã®TypeScriptãµããŒãããããŸãïŒã€ãŸããTypeScriptãæåã§ã³ã³ãã€ã«ããå¿ èŠã¯ãªããDenoãèªåçã«ã³ã³ãã€ã«ããŸãïŒ
- ESã¢ãžã¥ãŒã«ããµããŒãããŸã
- ããã±ãŒãžãããŒãžã£ãŒã¯ãããŸãã
- ããã¯ã°ããŒãã«ã§ã
await
- ãã¹ãæ©èœãçµã¿èŸŒãŸããŠããŸã
- ãã®ç®æšã¯ãæ倧ã®ãã©ãŠã¶ãŒäºææ§ã§ãããã®ããã«ãã€ã³ã©ã€ã³
fetch
ãªããžã§ã¯ããšã°ããŒãã«ãªããžã§ã¯ããæäŸããŸãwindow
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãããããã¹ãŠã®å¯èœæ§ãæ¢ããŸãã
Denoãšãã®æ©èœã«æ £ãããšãNode.jsã¯å°ãæ代é ãã«ãªããŸãã
ç¹ã«Node.jsã¯ã³ãŒã«ããã¯é¢æ°ã«åºã¥ããŠããããïŒpromiseããã³async / awaitã®åã«èšè¿°ãããŠããŸãïŒãæ ¹æ¬çãªå€æŽãå¿ èŠã§ããããšãæå³ãããããããããããã«è¡šç€ºãããå¯èœæ§ã¯ã»ãšãã©ãããŸããã
Node.jsã¯çŽ æŽããããJavaScriptã®äžçã§ã¯äºå®äžã®æšæºã§ããç¶ããã§ãããããã ããTypeScriptã®ãµããŒããšææ°ã®æšæºã©ã€ãã©ãªã®ãããã§ãDenoã®äººæ°ã¯æ¥éã«é«ãŸããšæããŸãã
Denoã¯ãäžäœäºææ§ãå¿ èŠãšããªããããææ°ã®ã³ãŒããè³Œå ¥ã§ããŸãããã¡ããããã®ã³ãŒããä»åŸ10幎éææ°ã§ãããšããä¿èšŒã¯ãããŸããããä»æ¥ã§ã¯ããã§ãã
ãªãããïŒãªãä»ãªã®ãïŒ
Denoã¯ãã»ãŒ2幎åã«JSConfEUã§Node.jsã®äœæè ã§ããRyanDahlã«ãã£ãŠçºè¡šãããŸãããèŠãYouTubeã®åç»ããããã¯éåžžã«èå³æ·±ããå¿ èŠã®Node.jsãšJavaScriptã§ããªããããŠããäœæ¥ããŠããå Žåã§ãã
åãããžã§ã¯ããããŒãžã£ãŒïŒäœæè ïŒã¯ã決å®ãäžãããšãäœåãªããããŠããŸããã©ã€ã¢ã³ã¯ãããŒãã§ã®åæã®æ±ºå®ã®ããã€ããåŸæããŠããŸããããã«ããã¯ãããžãŒãé²æ©ããJavaScriptã¯ãããŒãã2009幎ã«ãã£ããšããšã¯ãŸã£ããç°ãªãèšèªã«ãªããŸããã ES6 / 2016/2017ãªã©ãæãåºããŠãã ããã
ããã§åœŒã¯ããµãŒããŒåŽã®JavaScriptã¢ããªã±ãŒã·ã§ã³ã®äžçš®ã§ããæ°ãããããžã§ã¯ããéå§ããããšã«ããŸããã
ç§ãä»ãã®èšäºãæžããŠããã®ã¯ããã¯ãããžãŒãæçãããŸã§ã«ããªãé·ãæéããããããã§ããæåŸã«ãæåã®å®å®ãããªãªãŒã¹ã§ããDeno 1.0ïŒ2020幎5æ13æ¥ã«ãªãªãŒã¹ãããŸããïŒãå ¥æããŸããã
ããã¯äžè¬çãªæ°åã®ããã«æãããããããŸãããã1.0ã¯ãDeno2.0ãŸã§å€§å¹ ãªå€æŽããªãããšãæå³ããŸããæ°ãããã¯ãããžãŒãåŠã¶ãšãããããããŸãã«ãéãå€åããããšãæãŸãªãã§ãããã
ããªãã¯ãããåŠã¶ã¹ãã§ããïŒ
è¯ã質åã
ããã®ãããªæ°ããããšãåŠã¶ã«ã¯å€ãã®åªåãå¿ èŠã§ããç§ã®ã¢ããã€ã¹ïŒãµãŒããŒåŽã®JSã䜿ãå§ããã°ããã§ãNode.jsããŸã ç¥ãããTypeScriptãäœæããããšããªãå Žåã¯ãNodeããå§ããŠãã ããã
ããŒããéžæããããšã§è§£éãããããšã¯ãããŸããïŒæåãªåŒçšãèšãæããŸãïŒã
ãããã倧éã®npmããã±ãŒãžã«äŸåããªãTypeScriptã奜ãã§ãã©ãã§ã䜿çšããã
await
å Žåã¯ãDenoãæ¢ããŠãããããããŸããã
Node.jsã«åã£ãŠä»£ãããŸããïŒ
çªå·ãNode.jsã¯å·šå€§ã§å€§ããªæš©åšã§ãããä¿¡ããããªãã»ã©ååã«ãµããŒããããŠãããã¯ãããžãŒã§ãããä»åŸ10幎éã¯ââã©ãã«ãè¡ããŸããã
ãã¡ãŒã¹ãã¯ã©ã¹ã®TypeScriptãµããŒã
Denoã¯RustãšTypeScriptã§æžãããŠãããã©ã¡ããä»æ¥ã®äžçã§éåžžã«äººæ°ã®ããèšèªã§ãã
ããã¯ãJavaScriptãäœæããŠããå Žåã§ããTypeScriptããå€ãã®ã¡ãªãããåŸãããããšãæå³ããŸãã
Denoã§TypeScriptã³ãŒããå®è¡ããå Žåãäºåã³ã³ãã€ã«ã¯å¿ èŠãããŸãã-Denoã¯ãããèªåçã«å®è¡ããŸãã
TypeScriptã³ãŒããäœæããå¿ èŠã¯ãããŸããããDenoã®ã³ã¢ãTypeScriptã§äœæãããŠãããšããäºå®ã¯å€§ããªéããçã¿ãŸãã
ãŸããJavaScriptéçºè ã®å€§éšåãTypeScriptãæããŠããŸãã
次ã«ã䜿çšããããŒã«ã¯ãDenoã®ãããªTypeScriptã§èšè¿°ããããœãããŠã§ã¢ã«é¢ããå€ãã®æ å ±ãååŸã§ããŸãã
ã€ãŸããããšãã°VS CodeïŒæåããTypeScriptãšç·å¯ã«çµ±åãããŠããïŒã§ã³ãŒããäœæãããšãã³ãŒãäœææã®åãã§ãã¯ãé«åºŠãªIntelliSenseæ©èœãªã©ã®ã¡ãªãããåŸãããŸããèšãæããã°ãã³ãŒããšãã£ã¿ã®å©ããã¯ããã«å¹ççã«ãªããŸãã
Node.jsãšã®éã
Denoã¯æ¬è³ªçã«Node.jsã®ä»£æ¿ã§ããããã2ã€ãæ¯èŒããããšã¯çã«ããªã£ãŠããŸãã
äžè¬ïŒ
- ã©ã¡ããV8ãšã³ãžã³ã«åºã¥ããŠããŸã
- ã©ã¡ãããµãŒããŒåŽã®JavaScriptéçºã«æé©ã§ã
éãïŒ
- ããŒãã¯C ++ãšJavaScriptã§æžãããŠããŸããDenoã¯RustãšTypeScriptã§æžãããŠããŸãã
- ããŒãã«ã¯å
¬åŒã®ããã±ãŒãžãããŒãžã£ãŒããã
npm
ãŸããDenoã«ã¯ãã®ãããªãããŒãžã£ãŒã¯ãããŸãããã代ããã«URLã䜿çšããŠä»»æã®ã¢ãžã¥ãŒã«ãã€ã³ããŒãã§ããŸãã - Nodeã¯CommonJSæ§æã䜿çšããŠããã±ãŒãžãã€ã³ããŒãããŸããDenoã¯å ¬åŒã®æ¹æ³ã§ããESã¢ãžã¥ãŒã«ã䜿çšããŸãã
- Deno ECMAScript , Node.js .
- Deno () . . Node.js , .
- Deno , .. , , Go, . .
ããã±ãŒãžãããŒãžã£ãŒããªããURLã䜿çšããŠããã±ãŒãžãååŸããã³ã€ã³ããŒãããããšã«ã¯ãé·æãšçæããããŸããäž»ãªå©ç¹ã®1ã€ã¯ãnpmãªã©ã®ãªããžããªã«ããã±ãŒãžãå ¬éããªããŠãããã±ãŒãžãäœæã§ããæè»æ§ãé«ãããšã§ãã
é ããæ©ãããããã®ããã±ãŒãžãããŒãžã£ãŒã«ä»£ãããã®ãç»å ŽãããšæããŸãã
Denoã®å ¬åŒãŠã§ããµã€ãã¯ãµãŒãããŒãã£ã®ããã±ãŒãžããã¹ãããŠããŸãïŒhttpsïŒ//deno.land/x/
Denoã®ã€ã³ã¹ããŒã«
ååã«è©±ããŸãïŒDenoãã€ã³ã¹ããŒã«ããŸãããã
ãããè¡ãæãç°¡åãªæ¹æ³ã¯ãHomebrewã䜿çšããããšã§ãã
brew install deno

ãã®ä»ã®ã€ã³ã¹ããŒã«æ¹æ³ã¯ããã«ãªã¹ããããŠããŸãã
ã€ã³ã¹ããŒã«åŸãã³ãã³ãã䜿çšå¯èœã«ãªããŸã
deno
ã次ã®ããã«å
¥åãããšããã«ãã衚瀺ãããŸãdeno --help
ã
flavio@mbp~> deno --help
deno 0.42.0
A secure JavaScript and TypeScript runtime
Docs: https://deno.land/std/manual.md
Modules: https://deno.land/std/ https://deno.land/x/
Bugs: https://github.com/denoland/deno/issues
To start the REPL, supply no arguments:
deno
To execute a script:
deno run https://deno.land/std/examples/welcome.ts
deno https://deno.land/std/examples/welcome.ts
To evaluate code in the shell:
deno eval "console.log(30933 + 404)"
Run 'deno help run' for 'run'-specific flags.
USAGE:
deno [OPTIONS] [SUBCOMMAND]
OPTIONS:
-h, --help
Prints help information
-L, --log-level <log-level>
Set log level [possible values: debug, info]
-q, --quiet
Suppress diagnostic output
By default, subcommands print human-readable diagnostic messages to stderr.
If the flag is set, restrict these messages to errors.
-V, --version
Prints version information
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 newest version
ENVIRONMENT VARIABLES:
DENO_DIR Set deno's base directory (defaults to $HOME/.deno)
DENO_INSTALL_ROOT Set deno install's output directory
(defaults to $HOME/.deno/bin)
NO_COLOR Set to disable color
HTTP_PROXY Proxy address for HTTP requests
(module downloads, fetch)
HTTPS_PROXY Same but for HTTPS
ããããŒã
ã»ã¯ã·ã§ã³ã«æ°ã¥ããŸãã
SUBCOMMANDS
ãïŒããã¯ãå®è¡ã§ãããã¹ãŠã®ã³ãã³ãã®ãªã¹ãã§ããã©ã®ããŒã ããããŸããïŒ
bundle
-ã¢ãžã¥ãŒã«ãšãããžã§ã¯ãã®äŸåé¢ä¿ã1ã€ã®ãã¡ã€ã«ã«åéããŸãcache
-äŸåé¢ä¿ããã£ãã·ã¥ããŸãcompletions
-ã·ã§ã«ãªãã£ã«ãçæããŸãdoc
-ã¢ãžã¥ãŒã«ã®ããã¥ã¡ã³ãã衚瀺ããŸãeval
-ããšãã°ãã³ãŒãã®ãããã¯ãèšç®ããããã«äœ¿çšãããŸãdeno eval "console.log(1 + 2)"
fmt
-çµã¿èŸŒã¿ã®ã³ãŒããã©ãŒããã¿ïŒgoFmt
Goãªã©ïŒhelp
-è£å©ã³ãã³ãã®ãªã¹ãã衚瀺ããŸãinfo
-ãã£ãã·ã¥ãŸãã¯ãã¡ã€ã«ã«é¢ããæ å ±ã衚瀺ããŸãinstall
-ã¹ã¯ãªãããå®è¡å¯èœãšããŠèšå®ããŸãrepl
-èªã¿åã-èšç®-åºåãµã€ã¯ã«ïŒããã©ã«ãïŒrun
-ã¢ãžã¥ãŒã«ã®æå®ãããååãŸãã¯URLã§ããã°ã©ã ãå®è¡ããŸãtest
-ãã¹ããå®è¡ããŸãtypes
-TypeScriptæ©èœã®ãªã¹ãã衚瀺ããŸãupgrade
-Denoãææ°ããŒãžã§ã³ã«æŽæ°ããŸã
deno <subcommand> help
ããšãã°ãã
å®è¡ããŠç¹å®ã®ã³ãã³ãã«é¢ããæ
å ±ãååŸã§ããŸãdeno run --help
ã
ã³ãã³ã
deno
ã䜿çšããŠãèªã¿åã-è©äŸ¡-åºåã«ãŒããéå§ã§ããŸãã

ããã¯ãéå§ãšåã
deno repl
ã§ãã
éåžž
deno
ãTypeScriptãã¡ã€ã«ã«å«ãŸããDenoã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããã«äœ¿çšãããŸãã
TypeScriptãã¡ã€ã«ïŒ.tsïŒãšJavaScriptãã¡ã€ã«ïŒ.jsïŒã®äž¡æ¹ãå®è¡ã§ããŸãã
TypeScriptãåããŠäœ¿çšããå Žåã§ããå¿é ããå¿ èŠã¯ãããŸãããDenoã¯TypeScriptã§èšè¿°ãããŠããŸãããã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã¯JavaScriptã§èšè¿°ã§ããŸãã
Denoã®æåã®ã¢ããª
æåã®ã¢ããªã±ãŒã·ã§ã³ãäœæããŸãããã
ãããè¡ãã«ã¯ãã³ãŒããèšè¿°ããå¿ èŠã¯ãããŸãããURLã䜿çšããŠã¿ãŒããã«ã§å®è¡ããŸãã
Denoã¯ããã°ã©ã ãããŠã³ããŒãããã³ã³ãã€ã«ããŠå®è¡ããŸãã

ãã¡ãããã€ã³ã¿ãŒãããããã©ã³ãã ãªã³ãŒããå®è¡ããããšã¯ãå§ãããŸããããã®å ŽåãDenoã®å ¬åŒWebãµã€ãããèµ·åããŸããããã«ãDenoã«ã¯ãããã°ã©ã ãæ瀺çã«èš±å¯ããŠããªãããšãå®è¡ã§ããªãããã«ãããµã³ãããã¯ã¹ããããŸãã
ãã®ããã°ã©ã ã¯éåžžã«ã·ã³ãã«ã§ãåŒã³åºã
console.log()
ã§ãïŒ
console.log('Welcome to Deno ') // ,
https://deno.land/std/examples/welcome.tsããã©ãŠã¶ã§ éããšã次ã®ããã«è¡šç€ºãããŸãã

å¥åŠã§ãããTypeScriptãã¡ã€ã«ã衚瀺ãããããšãæåŸ ããŠããŸãããã代ããã«WebããŒãžãååŸããŸãããéèŠãªã®ã¯ãDeno Webãµã€ããµãŒããŒã¯ããŠãŒã¶ãŒããã©ãŠã¶ãŒã䜿çšããŠããããšãèªèãããããŠãŒã¶ãŒãã¬ã³ããªãŒãªããŒãžãæäŸãããšããããšã§ããããšãã°ã
ã䜿çšããŠåãURLãããŒããã代ããã«
wget
ååŸãtext/plain
ãŸãtext/html
ã

ãã£ãã·ã¥ã®ãããã§ããã°ã©ã ãåèµ·åãããšãåèµ·åã¯å¿ èŠãããŸããã

ãã©ã°ã䜿çšããŠ
--reload
匷å¶åèµ·åãå®è¡ã§ããŸãïŒã§

deno run
衚瀺ãããªãããŸããŸãªæ©èœããããŸãdeno --help
ããããã衚瀺ããã«ã¯ã次ãå®è¡ããå¿
èŠããããŸãdeno run --help
ã
flavio@mbp~> deno run --help
deno-run
Run a program given a filename or url to the module.
By default all programs are run in sandbox without access to disk, network or
ability to spawn subprocesses.
deno run https://deno.land/std/examples/welcome.ts
Grant all permissions:
deno run -A https://deno.land/std/http/file_server.ts
Grant permission to read from disk and listen to network:
deno run --allow-read --allow-net https://deno.land/std/http/file_server.ts
Grant permission to read whitelisted files from disk:
deno run --allow-read=/etc https://deno.land/std/http/file_server.ts
USAGE:
deno run [OPTIONS] <SCRIPT_ARG>...
OPTIONS:
-A, --allow-all
Allow all permissions
--allow-env
Allow environment access
--allow-hrtime
Allow high resolution time measurement
--allow-net=<allow-net>
Allow network access
--allow-plugin
Allow loading plugins
--allow-read=<allow-read>
Allow file system read access
--allow-run
Allow running subprocesses
--allow-write=<allow-write>
Allow file system write access
--cached-only
Require that remote dependencies are already cached
--cert <FILE>
Load certificate authority from PEM encoded file
-c, --config <FILE>
Load tsconfig.json configuration file
-h, --help
Prints help information
--importmap <FILE>
UNSTABLE:
Load import map file
Docs: https://deno.land/std/manual.md#import-maps
Specification: https://wicg.github.io/import-maps/
Examples: https://github.com/WICG/import-maps#the-import-map
--inspect=<HOST:PORT>
activate inspector on host:port (default: 127.0.0.1:9229)
--inspect-brk=<HOST:PORT>
activate inspector on host:port and break at start of user script
--lock <FILE>
Check the specified lock file
--lock-write
Write lock file. Use with --lock.
-L, --log-level <log-level>
Set log level [possible values: debug, info]
--no-remote
Do not resolve remote modules
-q, --quiet
Suppress diagnostic output
By default, subcommands print human-readable diagnostic messages to stderr.
If the flag is set, restrict these messages to errors.
-r, --reload=<CACHE_BLACKLIST>
Reload source code cache (recompile TypeScript)
--reload
Reload everything
--reload=https://deno.land/std
Reload only standard modules
--reload=https://deno.land/std/fs/utils.ts,https://deno.land/std/fmt/colors.ts
Reloads specific modules
--seed <NUMBER>
Seed Math.random()
--unstable
Enable unstable APIs
--v8-flags=<v8-flags>
Set V8 command line options. For help: --v8-flags=--help
ARGS:
<SCRIPT_ARG>...
script args
ã³ãŒãäŸ
ãã ã§èŠã€ããããšãã§ããDenoã®ãŠã§ããµã€ãã«ä»ã®äŸããããŸãã
ãã®èšäºã®å·çæç¹ã§ã¯ãæå®ããããªããžããªã«æ¬¡ã®ãã®ããããŸãã
cat.ts
-åŒæ°ãšããŠæž¡ããããã¡ã€ã«ã®å 容ã衚瀺ããŸãcatj.ts
-åãããšãããŸãcat.ts
ããæåã«ãã¡ã€ã«ã®å 容ã§ããã€ãã®æäœãå®è¡ããŸãchat/
-ãã£ããã®å®è£colors.ts
-ã¢ãžã¥ãŒã«ã䜿çšããããã¹ãã®ã¹ã¿ã€ã«èšå®ã®äŸcurl.ts
-curl
åŒæ°ãšããŠæž¡ãããURLã®ã³ã³ãã³ããåºåããåçŽãªå®è£echo_server.ts
-TCPãšã³ãŒãµãŒããŒgist.ts
-gist.github.comã«ãã¡ã€ã«ãé 眮ããããã®ããã°ã©ãtest.ts
-ãã¹ãããã°ã©ãwelcome.ts
-ç§ãã¡ãç«ã¡äžããããã°ã©ãxeval.ts
-ä»»æã®æšæºããŒã¿ãœãŒã¹ããååŸããTypeScriptãå®è¡ã§ããŸããdeno xeval
å ¬åŒããŒã ã®ãªã¹ãããåé€ãããŸãã
Denoã®æåã®æ¬ç©ã®ã¢ããª
ã³ãŒããæžããŠã¿ãŸãããã
ç§ãã¡ãæåã«ç«ã¡äžããã¢ããª
deno run https://deno.land/std/examples/welcome.ts
ã¯ãã§ã«äœæãããŠãããããDenoã«ã€ããŠæ°ããããšã¯äœãåŠã³ãŸããã
Denoã®Webãµã€ãã«æçš¿ãããŠããæšæºçãªäŸããå§ããŸãããã
import { serve } from 'https://deno.land/std/http/server.ts'
const s = serve({ port: 8000 })
console.log('http://localhost:8000/')
for await (const req of s) {
req.respond({ body: 'Hello World\n' })
}
ããã§ã¯
serve
ãã¢ãžã¥ãŒã«ããé¢æ°ãã€ã³ããŒãããŠããŸãhttp/server
ãèŠãïŒã€ã³ã¹ããŒã«ããå¿
èŠã¯ãªããããŒãã¢ãžã¥ãŒã«ã®ããã«ã³ã³ãã¥ãŒã¿ãŒã«ä¿åãããŸãããããããDenoããã°ããã€ã³ã¹ããŒã«ããçç±ã®1ã€ã§ãã
å©ã
https://deno.land/std/http/server.ts
ãåããŠãã¢ãžã¥ãŒã«ã®ææ°ããŒãžã§ã³ãã€ã³ããŒãããŸããç¹å®ã®ããŒãžã§ã³ã¯ã以äžã䜿çšããŠã€ã³ããŒãã§ããŸã@VERSION
ã
import { serve } from 'https://deno.land/std@v0.42.0/http/server.ts'
ããã¯é¢æ°ãäœã§ãããã§ã
serve
ïŒ
/**
* Create a HTTP server
*
* import { serve } from "https://deno.land/std/http/server.ts";
* const body = "Hello World\n";
* const s = serve({ port: 8000 });
* for await (const req of s) {
* req.respond({ body });
* }
*/
export function serve(addr: string | HTTPOptions): Server {
if (typeof addr === 'string') {
const [hostname, port] = addr.split(':')
addr = { hostname, port: Number(port) }
}
const listener = listen(addr)
return new Server(listener)
}
次ã«ãé¢æ°ãåŒã³åºã
serve()
ãŠãããããã£ãæã€ãªããžã§ã¯ããæž¡ããŸãport
ã
次ã«ãã«ãŒããå®è¡ããŠããµãŒããŒããã®åèŠæ±ã«å¿çããŸãã
for await (const req of s) {
req.respond({ body: 'Hello World\n' })
}
é¢æ°ã§
await
ã³ãŒããã©ãããã
ã«ããŒã¯ãŒãã䜿çšããŠããããšã«æ³šæããŠãã ããasync
ã
ããã°ã©ã ãããŒã«ã«ã§å®è¡ããŠã¿ãŸããããç§ã¯VSã³ãŒãã䜿çšããŠããŸãããã©ã®ãšãã£ã¿ãŒã§ã䜿çšã§ããŸãã
justjavacããæ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããããšããå§ãããŸãïŒåæ§ã®ååã®

æ¡åŒµæ©èœããããŸãããéæšå¥šã§ãããå°æ¥çã«ãªããªãå¯èœæ§ããããŸãïŒïŒæ¡åŒµæ©èœã¯ãDenoã¢ããªã±ãŒã·ã§ã³ã®äœæã«åœ¹ç«ã€ããã€ãã®ãŠãŒãã£ãªãã£ãæäŸããŸãã
ãã¡ã€ã«
app.ts
ãäœæããŠãã³ãŒãããã®ãã¡ã€ã«ã«è²Œãä»ããŸãããã

å®è¡
deno run app.ts
ïŒ

Denoã¯ãããã°ã©ã ã«å¿ èŠãªãã¹ãŠã®äŸåé¢ä¿ãããŒãããŸãããæåã«ãã¡ã€ã«ã«ã€ã³ããŒãããäŸåé¢ä¿ãããŒãããŸããhttps://deno.land/std/http/server.ts
ãã¡ã€ã«ã«ã¯ãç¬èªã®ããã€ãã®äŸåé¢ä¿ããããŸãã
import { encode } from '../encoding/utf8.ts'
import { BufReader, BufWriter } from '../io/bufio.ts'
import { assert } from '../testing/asserts.ts'
import { deferred, Deferred, MuxAsyncIterator } from '../async/mod.ts'
import {
bodyReader,
chunkedBodyReader,
emptyReader,
writeResponse,
readRequest,
} from './_io.ts'
import Listener = Deno.Listener
import Conn = Deno.Conn
import Reader = Deno.Reader
ãããã®äŸåé¢ä¿ã¯èªåçã«ã€ã³ããŒããããŸãã
æåŸã«ãåé¡ããããŸãã

äœãèµ·ãã£ãŠããã®ã§ãããããèš±å¯æåŠãšã©ãŒãçºçããŸããã
ãµã³ãããã¯ã¹ã«ã€ããŠè©±ããŸãããã
ãµã³ãããã¯ã¹
å ã«è¿°ã¹ãããã«ãDenoã«ã¯ãããã°ã©ã ãèš±å¯ãåŸãŠããªãããšãå®è¡ã§ããªãããã«ãããµã³ãããã¯ã¹ããããŸãã
ããã¯äœãæå³ããã®ã§ããããïŒ
Ryanãè¬æŒã§è¿°ã¹ãŠããããã«ãJavaScriptããã°ã©ã ããã©ãŠã¶ãŒã®å€éšã§å®è¡ãããããããã°ã©ã ãã·ã¹ãã äžã®ãã¹ãŠã«ã¢ã¯ã»ã¹ã§ããããã«ããããªãå ŽåããããŸãããŸãã¯ããããã¯ãŒã¯ã䜿çšããŠå€ã®äžçã«ãªããšã
Node.jsã¢ããªã±ãŒã·ã§ã³ãã·ã¹ãã ããSSHããŒãŸãã¯ãã®ä»ã®æ å ±ãååŸããããããµãŒããŒã«éä¿¡ããããšã劚ãããã®ã¯äœããããŸãããããããéåžžãä¿¡é Œã§ãããœãŒã¹ããã®ããŒãããã±ãŒãžã®ã¿ãã€ã³ã¹ããŒã«ããçç±ã§ãããããã䜿çšããŠãããããžã§ã¯ãã®1ã€ããããã³ã°ãããŠãããã©ãããã©ããã£ãŠç¥ãããšãã§ããŸããïŒ
Denoã¯ããã©ãŠã¶ã§äœ¿çšãããèš±å¯ã·ã¹ãã ãæš¡å£ããŠããŸãããã©ãŠã¶ã§å®è¡ãããŠããJavaScriptã³ãŒãã¯ãæ瀺çã«èš±å¯ããªãéããã·ã¹ãã ã§äœãå®è¡ã§ããŸããã
Denoã«æ»ããšãããã°ã©ã ã«ãããã¯ãŒã¯ã¢ã¯ã»ã¹ãå¿ èŠãªå Žåã¯ããã®èš±å¯ãäžããå¿ èŠããããŸãã
ããã¯ãã©ã°ã䜿çšããŠè¡ãã
--allow-net
ãŸãïŒ
deno run --allow-net app.ts

ãµãŒããŒã¯çŸåšãããŒã8000ââã§å®è¡ãããŠããŸãã

ãã®ä»ã®ãã©ã°ïŒ
--allow-env
-ç°å¢å€æ°ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããŸã--allow-hrtime
-é«è§£å床ã®æž¬å®ãå¯èœ--allow-net=<allow-net>
-ãããã¯ãŒã¯ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããŸã--allow-plugin
-ãã©ã°ã€ã³ã®ããŒããèš±å¯ããŸã--allow-read=<allow-read>
-ãã¡ã€ã«ã®èªã¿åããèš±å¯ããŸã--allow-run
-ãµãããã»ã¹ãéå§ã§ããŸã--allow-write=<allow-write>
-ãã¡ã€ã«ã®æžã蟌ã¿ãèš±å¯ããŸã--allow-all
-ãã¹ãŠã®æš©éãä»äžããŸãïŒåæ§-A
ïŒ
ã®æš©é
net
ãread
ããã³write
éšåçãªå ŽåããããŸããããšãã°ãç¹å®ã®ãã£ã¬ã¯ããªã«ããèªã¿åãå°çšãã¡ã€ã«ãèš±å¯ã§ããŸã--allow-read=/dev
ã
ã³ãŒãã®ãã©ãŒããã
Goã«ã€ããŠç§ãæ°ã«å ¥ã£ãŠããããšã®1ã€ã¯ãã³ãã³ã
gofmt
ã§ãããã¹ãŠã®Goã³ãŒãã¯åãããã«èŠããŸãã誰ããããã䜿çšããŠãgofmt
ãŸãã
JavaScriptéçºè ã¯éåžžãPrettierã䜿çšããŸãã
deno fmt
ãå®éã«ã¯ãã«ããã®äžã§ã䜿çšããŸãã
ãã®ãããªäžé©åãªãã©ãŒãããã®ãã¡ã€ã«ããããšããŸãã

éå§ãã
deno fmt app.ts
ãšãã»ãã³ãã³ãæ¬ èœããç¶æ
ã§èªåãã©ãŒããããå®è¡ãããŸãã

æšæºã©ã€ãã©ãª
ãããžã§ã¯ãã®æ代ã«ãããããããããã®æšæºã©ã€ãã©ãªã¯éåžžã«åºç¯ã§ãã
ããã«ã¯æ¬¡ã®ãã®ãå«ãŸããŸãã
archieve
-ã¢ãŒã«ã€ãçšã®ãŠãŒãã£ãªãã£async
-éåæã³ãŒããæäœããããã®ãŠãŒãã£ãªãã£bytes
-ãã€ããåå²ããããã®ãã«ããŒé¢æ°datetime
-æ¥ä»/æå»ã®è§£æencoding
-ããŸããŸãªåœ¢åŒã§ã®ãšã³ã³ãŒã/ãã³ãŒãflags
-ã³ãã³ãã©ã€ã³ãã©ã°ã®è§£æfmt
-圢æãšè¡šç€ºfs
-ãã¡ã€ã«ã·ã¹ãã ãæäœããããã®ã¢ããªã±ãŒã·ã§ã³ã€ã³ã¿ãŒãã§ã€ã¹hash
-æå·åã©ã€ãã©ãªhttp
-HTTPãµãŒããŒio
-å ¥å/åºåæäœã®ã©ã€ãã©ãªlog
-ãã®ã³ã°çšã®ãŠãŒãã£ãªãã£mime
-æ··åããŒã¿ã®ãµããŒãnode
-ããŒããšã®äžäœäºææ§ã¬ã€ã€ãŒpath
-ãã¹ãæäœããws
-Webãœã±ãã
ãã1ã€ã®äŸ
å¥ã®å ¬åŒã®äŸãèŠãŠã¿ãŸããã-
cat.ts
ïŒ
const filenames = Deno.args
for (const filename of filenames) {
const file = await Deno.open(filename)
await Deno.copy(file, Deno.stdout)
file.close()
}
ã³ãã³ãã©ã€ã³ã䜿çšããŠæž¡ãããåŒæ°ãå«ã å€æ°ã§ããå€æ°ã«
filenames
ã³ã³ãã³ããå²ãåœãŠãŸãDeno.args
ã
ããããç¹°ãè¿ãåŠçããããããã«ã€ããŠãæåã«ããã
Deno.open()
ã䜿çšããŠãã¡ã€ã«ãéãã次ã«Deno.copy()
ã³ã³ãã³ããã«ã³ããŒããŸãDeno.stdout
ãæåŸã«ããã¡ã€ã«ãéããŸãã
å®è¡ããå ŽåïŒ
deno run https://deno.land/std/examples/cat.ts
ããã°ã©ã ã¯ããŒããããŠã³ã³ãã€ã«ãããŸãããåŒæ°ãæž¡ããªãã£ããããäœãèµ·ãããŸããã
ããã§ã¯ããããè©ŠããŠã¿ãŸãããã
deno run https://deno.land/std/examples/cat.ts app.ts
ããŒããã·ã§ã³ãšã©ãŒãçºçããŸãïŒ

Denoã¯ããã©ã«ãã§ã·ã¹ãã ã«ã¢ã¯ã»ã¹ã§ããŸããã圌ã«ãã®ãããªèš±å¯ãäžããŸããã
--allow-read
ïŒ
deno run --allow-read=./ https://deno.land/std/examples/cat.ts app.ts

Express / Hapi / Koa / * Denoã«ã¯ååšããŸããïŒ
ã¯ãã次ã®ãããžã§ã¯ããèŠãŠãã ããã
äŸïŒOakã䜿çšããŠRESTAPIãäœæãã
Oakã䜿çšããŠRESTAPIãäœæããŸããOakã¯ãNOde.jsã§äººæ°ã®ããããã«ãŠã§ã¢ã§ããKoaã«è§ŠçºãããŠãããåæ§ã®æ§æãæã£ãŠãããšããç¹ã§èå³æ·±ããã®ã§ãã
APIã¯éåžžã«ã·ã³ãã«ã«ãªããŸãã
ç§ãã¡ã®ãµãŒããŒã¯ãç¬ã®ãªã¹ããååã幎霢ãã¡ã¢ãªã«ä¿åããŸãã
次ã®æ©èœãååŸããããšèããŠããŸãã
- ãªã¹ãã«æ°ããç¬ãè¿œå ãã
- ãã¹ãŠã®ç¬ã®ãªã¹ããååŸããŸã
- ç¹å®ã®ç¬ã«é¢ããæ å ±ãååŸãã
- ãªã¹ãããç¬ãåé€ããŸã
- ç¬ã®å¹Žéœ¢ãæŽæ°ãã
Typescriptã§ã³ãŒããèšè¿°ããŸãããJavaScriptã§ã³ãŒããèšè¿°ã§ããŸããããŒã¿ã¿ã€ããæå®ããªãã§ãã ããã
ãã¡ã€ã«ãäœæããŸã
app.ts
ã
ãããã«ãªããžã§ã¯ããã€ã³ããŒãããããšããå§ããŸããã
Application
ãšRouter
ããOak
ïŒ
import { Application, Router } from 'https://deno.land/x/oak/mod.ts'
ç°å¢å€æ°PORTãšHOSTãååŸããŸãã
const env = Deno.env.toObject()
const PORT = env.PORT || 4000
const HOST = env.HOST || '127.0.0.1'
ããã©ã«ãã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯localhostïŒ4000ã§å®è¡ãããŸãã
Oakã¢ããªã±ãŒã·ã§ã³ãäœæããèµ·åããŸãã
const router = new Router()
const app = new Application()
app.use(router.routes())
app.use(router.allowedMethods())
console.log(`Listening on port ${PORT}...`)
await app.listen(`${HOST}:${PORT}`)
ããã§ãã¢ããªã±ãŒã·ã§ã³ãæ©èœããã¯ãã§ãã
ãã§ãã¯ããŸãïŒ
deno run --allow-env --allow-net app.ts
Denoã¯äŸåé¢ä¿ãããŠã³ããŒãããŸãïŒ

ãããŠããŒã4000ã§ãªãã¹ã³ãéå§ããŸãã
åèµ·åæã«ããã£ãã·ã¥ã®ãããã§ã€ã³ã¹ããŒã«æé ãã¹ããããã

ãŸãïŒç¬ã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ã
dog
ããªããžã§ã¯ããå«ãé
åãå®çŸ©ããŸãDog
ïŒ
interface Dog {
name: string
age: number
}
let dogs: Array<Dog> = [
{
name: 'Roger',
age: 8,
},
{
name: 'Syd',
age: 7,
},
]
APIã®å®è£ ãå§ããŸãããã
ãã¹ãŠãæŽã£ãŠããŸããæå®ããããšã³ããã€ã³ãã«ã¢ã¯ã»ã¹ãããšãã«åŒã³åºãããããã€ãã®é¢æ°ãã«ãŒã¿ãŒã«è¿œå ããŸãããã
const router = new Router()
router
.get('/dogs', getDogs)
.get('/dogs/:name', getDog)
.post('/dogs', addDog)
.put('/dogs/:name', updateDog)
.delete('/dogs/:name', removeDog)
以äžãå®çŸ©ããŸããã
GET /dogs
GET /dogs/:name
POST /dogs
PUT /dogs/:name
DELETE /dogs/:name
ãããã®ã«ãŒãã1ã€ãã€å®è£ ããŠã¿ãŸãããããã¹ãŠã®ç¬ã®ãªã¹ããè¿ãã
ããå§ããŸããã
GET /dogs
ïŒ
export const getDogs = ({ response }: { response: any }) => {
response.body = dogs
}

ååã§ç¹å®ã®ç¬ãååŸããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
export const getDog = ({
params,
response,
}: {
params: {
name: string
},
response: any
}) => {
const dog = dogs.filter(dog => dog.name === params.name)
if (dog.length) {
response.status = 200
response.body = dog[0]
return
}
response.status = 400
response.body = { msg: `Cannot find dog ${params.name}` }
}

ãªã¹ãã«æ°ããç¬ãè¿œå ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
export const addDog = async ({
request,
response,
}: {
request: any
response: any
}) => {
const body = await request.body()
const dog: Dog = await body.value
dogs.push(dog)
response.body = { msg: 'OK' }
response.status = 200
}

ç¬ã®å¹Žéœ¢ãæŽæ°ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
export const updateDog = async ({
params,
request,
response,
}: {
params: {
name: string
},
request: any
response: any
}) => {
const temp = dogs.filter((existingDog) => existingDog.name === params.name)
const body = await request.body()
const { age }: { age: number } = await body.value
if (temp.length) {
temp[0].age = age
response.status = 200
response.body = { msg: 'OK' }
return
}
response.status = 400
response.body = { msg: `Cannot find dog ${params.name}` }
}

ãªã¹ãããç¬ãåé€ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
export const removeDog = ({
params,
response,
}: {
params: {
name: string
},
response: any
}) => {
const lengthBefore = dogs.length
dogs = dogs.filter((dog) => dog.name !== params.name)
if (dogs.length === lengthBefore) {
response.status = 400
response.body = { msg: `Cannot find dog ${params.name}` }
return
}
response.body = { msg: 'OK' }
response.status = 200
}

å®å šãªã¢ããªã±ãŒã·ã§ã³ã³ãŒãïŒ
import { Application, Router } from 'https://deno.land/x/oak/mod.ts'
const env = Deno.env.toObject()
const PORT = env.PORT || 4000
const HOST = env.HOST || '127.0.0.1'
interface Dog {
name: string
age: number
}
let dogs: Array<Dog> = [
{
name: 'Roger',
age: 8,
},
{
name: 'Syd',
age: 7,
},
]
export const getDogs = ({ response }: { response: any }) => {
response.body = dogs
}
export const getDog = ({
params,
response,
}: {
params: {
name: string
},
response: any
}) => {
const dog = dogs.filter(dog => dog.name === params.name)
if (dog.length) {
response.status = 200
response.body = dog[0]
return
}
response.status = 400
response.body = { msg: `Cannot find dog ${params.name}` }
}
export const addDog = async ({
request,
response,
}: {
request: any
response: any
}) => {
const body = await request.body()
const { name, age }: { name: string; age: number } = await body.value
dogs.push({
name: name,
age: age,
})
response.body = { msg: 'OK' }
response.status = 200
}
export const updateDog = async ({
params,
request,
response,
}: {
params: {
name: string
},
request: any
response: any
}) => {
const temp = dogs.filter((existingDog) => existingDog.name === params.name)
const body = await request.body()
const { age }: { age: number } = await body.value
if (temp.length) {
temp[0].age = age
response.status = 200
response.body = { msg: 'OK' }
return
}
response.status = 400
response.body = { msg: `Cannot find dog ${params.name}` }
}
export const removeDog = ({
params,
response,
}: {
params: {
name: string
},
response: any
}) => {
const lengthBefore = dogs.length
dogs = dogs.filter(dog => dog.name !== params.name)
if (dogs.length === lengthBefore) {
response.status = 400
response.body = { msg: `Cannot find dog ${params.name}` }
return
}
response.body = { msg: 'OK' }
response.status = 200
}
const router = new Router()
router
.get('/dogs', getDogs)
.get('/dogs/:name', getDog)
.post('/dogs', addDog)
.put('/dogs/:name', updateDog)
.delete('/dogs/:name', removeDog)
const app = new Application()
app.use(router.routes())
app.use(router.allowedMethods())
console.log(`Listening on port ${PORT}...`)
await app.listen(`${HOST}:${PORT}`)
æž èŽããããšãããããŸããã