Mustache.js: ES ๋ชจ๋“ˆ ์ง€์›

์— ๋งŒ๋“  2019๋…„ 05์›” 29์ผ  ยท  18์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: janl/mustache.js

์—ฌ๋ณด์„ธ์š”!

Mustache.js ์˜ ES ๋ชจ๋“ˆ ๋ฒ„์ „์„ ์ง€์›ํ•  ๊ณ„ํš์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‚ด๊ฐ€ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™œ์š”?
์ €๋Š” Deno ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ด๋ฉฐ ํ…œํ”Œ๋ฆฟ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(Deno๋Š” ES ๋ชจ๋“ˆ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค). ๋ฌธ์ œ๋Š” ํ˜„์žฌ ํ…œํ”Œ๋ฆฟ ๋ Œ๋”๋Ÿฌ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋Š” ์ฝง์ˆ˜์—ผ ์„ Deno ๋กœ ์ด์‹ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํฌํŠธ๋Š” ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋‹ค๋ฅธ ์ฝ”๋“œ ์ŠคํŠธ๋ฆผ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฝง์ˆ˜์—ผ์— ์ง์ ‘ ๋„ฃ๋Š” ๊ฒƒ์€ ๋‘ ํ”„๋กœ์ ํŠธ ๋ชจ๋‘์— ์ด์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ฝง์ˆ˜์—ผ์˜ ๊ฒฝ์šฐ mustache.mjs ๋ฅผ repo์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ํŽธ์ง‘ ํ•˜๊ฑฐ๋‚˜ mustache.js๋ฅผ ES ๋ชจ๋“ˆ๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์˜ ์ƒ๊ฐ?

์ฐธ์กฐ: https://github.com/denoland/deno_std/issues/391

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ƒํƒœ ์—…๋ฐ์ดํŠธ; ๋‚ด esm-ify ๋ธŒ๋žœ์น˜ ์— ๋Œ€ํ•ด ์—ฐ PR์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด์ œ ์ด ํŒจํ‚ค์ง€๊ฐ€ #724์—์„œ ์ˆ˜๋…„๊ฐ„ ์ง€์›ํ•ด ์˜จ ๋‹ค๋ฅธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ์ด์˜๋ฅผ ์ œ๊ธฐํ•˜๊ฑฐ๋‚˜ ๋งˆ์Œ์— ๋” ๋งŽ์€ ์กฐ์ •์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ๊ฐœ์„  ์‚ฌํ•ญ์„ ํ‘ธ์‹œํ•œ ๋Œ€๋กœ ๋ฉฐ์น  ๋™์•ˆ ์–‘์กฐํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ES ๋ชจ๋“ˆ๋กœ ์ž‘์„ฑ๋œ ์†Œ์Šค ์ฝ”๋“œ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์˜ค๋Š˜ mustache.js ์— ์žˆ๋Š” ๊ฒƒ์„ ์ƒ์„ฑํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ํŽธ์•ˆํ•ด์ง‘๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์™„๋ฃŒ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๊ฐ€์˜ค๋Š” PR์—์„œ.

๋ชจ๋“  18 ๋Œ“๊ธ€

์•ˆ๋…•ํ•˜์„ธ์š” @zekth์ž…๋‹ˆ๋‹ค!

deno์— ๋Œ€ํ•œ ํฅ๋ฏธ์ง„์ง„ํ•œ ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ES ๋ชจ๋“ˆ๊ณผ ํ˜ธํ™˜๋˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋งค์šฐ ๊ธ์ •์ ์ด๋ฉฐ ํฌํŠธ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์ƒ๊ฐ์— ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์‹คํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์ด ํ•„์š”ํ•œ์ง€ ๊ตฌ์ฒด์ ์ธ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‹ค์Œ์€ ์˜ค๋Š˜ ์•„์นจ์— ์ˆ˜ํ–‰ํ•œ (์ •๋ง ๋ชป์ƒ๊ธด) ํฌํŠธ์ž…๋‹ˆ๋‹ค(typescript์—์„œ) https://github.com/zekth/deno_mustache/blob/master/mod.ts

๋‚˜๋Š” ์‹œ์ž‘์„ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ด์‹ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๊ฐ€์ง„ ์œ ์ผํ•œ ๊ด€์‹ฌ์‚ฌ๋Š” ์ฝง์ˆ˜์—ผ์œผ๋กœ ์ง€์›ํ•˜๋Š” ๋ชจ๋“  ๋‹ค๋ฅธ ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ js ํŒŒ์ผ ES ๋ชจ๋“ˆ์ด ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ์ด ๋‹ค๋ฅธ mjs ๋ณด๋‹ค ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์•„๋ฌด ๊ฒƒ๋„ ๊นจ๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :)

๋งŽ์€ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๐Ÿ‘

๋‚˜๋Š” deno์— ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์ „ํ˜€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡ ๊ฐ€์ง€ ํ† ๋ก ์„ ์ด‰๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์†Œํ•œ ์งˆ๋ฌธ์„ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด deno์— ์–ด๋–ค ์š”๊ตฌ ์‚ฌํ•ญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? .mjs ํŒŒ์ผ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด type="module" ์˜ package.json ์žˆ์Šต๋‹ˆ๊นŒ?
  2. ํŒŒ์ผ ์ด๋ฆ„ ์ง€์ • ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?
  3. ์—ฌ๊ธฐ์„œ TypeScript๊ฐ€ ์–ด๋–ป๊ฒŒ๋“  ์ค‘์š”ํ•ฉ๋‹ˆ๊นŒ?

.. ๋“ฑ๋“ฑ, ์–ด๋–ค ๋‹จ์„œ๋ผ๋„ ๋งŽ์ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” deno์— ๋Œ€ํ•œ ์ง€์‹์ด ๋„ˆ๋ฌด ๋ถ€์กฑํ•˜์—ฌ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ทธ๋Ÿด๋“ฏํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ฐฝ์˜์ ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  1. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ES ๋ชจ๋“ˆ์ด๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน๋ณ„ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ lodash ๋Š” ์ด์‹ ์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๋กœ๋“œ๋Š” ํŒจํ‚ค์ง€ json ๋˜๋Š” ๊ธฐํƒ€ ์—†์ด HTTP ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  2. ๋ช…๋ช… ๊ทœ์น™ ์—†์Œ
  3. JavaScript์˜ TypeScript๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Deno๋Š” ๋‘˜ ๋‹ค ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด deno์—์„œ ์ฝง์ˆ˜์—ผ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

import * as mustache from 'https://raw.githubusercontent.com/janl/mustache.js/master/mustache.js'
mustache.render(......

๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์›ํ•˜์‹œ๋ฉด Ryan์˜ ์ด ๊ฐ•์—ฐ์„ ํ™•์ธ ํ•˜์„ธ์š” :

์‹œ์›ํ•œ!

๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ๊ณผ ๋งฅ๋ฝ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ด์•ผ๊ธฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ES ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๋‚˜์˜ ์ดํ•ด๋Š” export ed์˜ ๊ด€์ ์—์„œ ๊ตฌ๋ฌธ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ํ›จ์”ฌ ๋” ์—ญ๋™์ ์ธ CommonJS, AMD ๋“ฑ๊ณผ ๊ฐ™์€ ์„ ๊ตฌ์ž๋“ค๊ณผ ์–ด๋‘์šด ๋Œ€์กฐ๋ฅผ ์ด๋ฃน๋‹ˆ๋‹ค.

์ด๋ฅผ ์—ผ๋‘์— ๋‘๊ณ , ํ˜„์žฌ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•˜๋Š” ์˜ค๋Š˜๋‚  mustache.js์˜ ๋ณธ๋ฌธ์„ ๋‘˜๋Ÿฌ์‹ผ IIFE ๊ฐ€ ES ๋ชจ๋“ˆ ์˜์—ญ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. m ํ‹€๋ ธ์–ด!

์ฆ‰, zekth/deno_mustache/mod.ts#L689 ํฌํŠธ์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ํ‰๋ฒ”ํ•˜๊ณ  ๋‹จ์ˆœํ•œ export ... ๊ฐ€ ์žˆ๋Š” .js | .mjs | .ts ํŒŒ์ผ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์žฌ๋ฏธ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด์ „ ๋™์ž‘์„ ์œ ์ง€ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์™€ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–ธ๊ธ‰๋œ IIFE ๋ž˜ํผ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌํ˜„(ES ๋ชจ๋“ˆ + ๋‚˜๋จธ์ง€)์„ ๋™๊ธฐํ™” ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋นŒ๋“œ ๋‹จ๊ณ„๋ฅผ ๊ณ ๋ คํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๋Š๋ผ๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ES ๋ชจ๋“ˆ ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ์˜ค๋Š˜๋‚ ๊ณผ ๊ฐ™์ด ES ๋ชจ๋“ˆ์ด ์•„๋‹Œ ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋œ ๋ฐฉํ•ด๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ €๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘์€ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ TypeScript์— ๋Œ€ํ•ด ๊ธ์ •์ ์ด์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ES ๋ชจ๋“ˆ์— ๊ณ„์† ์ดˆ์ ์„ ๋งž์ถ”๊ณ  TypeScript/export typedef๋กœ ๋ณ€ํ™˜ํ• ์ง€ ์—ฌ๋ถ€์— ์ดˆ์ ์„ ๋งž์ถ˜ ๋‹ค๋ฅธ ๋ผ์šด๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ?

์ƒ๊ฐ๋‚˜๋Š” ๋‹ค๋ฅธ ์ƒ๊ฐ์ด๋‚˜ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋งž์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” TypeScript ์Šคํƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ commonjs/ES5/ES6 ๋“ฑ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค( https://www.typescriptlang.org/docs/handbook/compiler-options .html ) . TS ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ TypeScript๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ES6 ์ฝ”๋“œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค ์ข‹์€ ์ œ์•ˆ์ด๋„ค์š”! ์ฒ˜์Œ์—๋Š” ES -> ๋‹ค๋ฅธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์—์„œ TS ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ผ๋ฐ˜ ๋นŒ๋“œ ๋„๊ตฌ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‚˜์ค‘์— ๊ทธ๋Ÿด๋“ฏํ•œ TS ๋ณ€ํ™˜์ด ํ›จ์”ฌ ๋œ ์œ„ํ—˜ํ•ด์ง‘๋‹ˆ๋‹ค.

๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๊ฒƒ์„ ํ•ด๊ฒฐํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ์ตœ์†Œํ•œ ์ฒซ ๋ฒˆ์งธ ๋นŒ๋”ฉ ๋ธ”๋ก์€ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์„ ์‚ดํŽด๋ณด๊ณ  ํ–ฅํ›„ ๋…ผ์˜์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค๋ฉด ์ •๋ง ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Sooo ๋‚˜๋Š” ES ๋ชจ๋“ˆ๋กœ์˜ ์ „ํ™˜์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฐœ๋… ์ฆ๋ช…์€ ์ฃผ๋กœ ์ƒ์„ฑ๋˜๋Š” UMD ๋ฒ„์ „ ๋•Œ๋ฌธ์— TypeScript ์ปดํŒŒ์ผ๋Ÿฌ(๋˜๋Š” babel) ๋Œ€์‹  rollup.js๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์ด์ „ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด deno๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ? philipj/mustache.js#esm-ify mustache.mjs

@philipj ๊ฐ€ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

๋ช‡ ๊ฐ€์ง€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์ง€๋งŒ ์‚ฌ์†Œํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

error TS2339: Property 'render' does not exist on type '{ name: string; version: string; tags: string[]; }'.

โ–บ file:///Users/vlegoff/projects/genesys/github/telemetry/t/mustache.ts:10:23

10 var output = mustache.render('{{title}} spends {{calc}}', view);
                         ~~~~~~

error TS2554: Expected 2 arguments, but got 1.

โ–บ https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:525:52

525   var context = (view instanceof Context) ? view : new Context(view);
                                                       ~~~~~~~~~~~~~~~~~

  An argument for 'parentContext' was not provided.

    โ–บ https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:377:25

    377 function Context (view, parentContext) {
                                ~~~~~~~~~~~~~


error TS2339: Property 'escape' does not exist on type '{ name: string; version: string; tags: string[]; }'.

โ–บ https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:640:21

640     return mustache.escape(value);
                        ~~~~~~

error TS2339: Property 'clearCache' does not exist on type '{ name: string; version: string; tags: string[]; }'.

โ–บ https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:659:10

659 mustache.clearCache = function clearCache () {
             ~~~~~~~~~~

error TS2339: Property 'parse' does not exist on type '{ name: string; version: string; tags: string[]; }'.

โ–บ https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:668:10

668 mustache.parse = function parse (template, tags) {
             ~~~~~

error TS2339: Property 'render' does not exist on type '{ name: string; version: string; tags: string[]; }'.

โ–บ https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:678:10

678 mustache.render = function render (template, view, partials, tags) {
             ~~~~~~

error TS2339: Property 'to_html' does not exist on type '{ name: string; version: string; tags: string[]; }'.

โ–บ https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:690:10

690 mustache.to_html = function to_html (template, view, partials, send) {
             ~~~~~~~

error TS2339: Property 'render' does not exist on type '{ name: string; version: string; tags: string[]; }'.

โ–บ https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:693:25

693   var result = mustache.render(template, view, partials);
                            ~~~~~~

error TS2339: Property 'escape' does not exist on type '{ name: string; version: string; tags: string[]; }'.

โ–บ https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:704:10

704 mustache.escape = escapeHtml;
             ~~~~~~

error TS2339: Property 'Scanner' does not exist on type '{ name: string; version: string; tags: string[]; }'.

โ–บ https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:707:10

707 mustache.Scanner = Scanner;
             ~~~~~~~

error TS2339: Property 'Context' does not exist on type '{ name: string; version: string; tags: string[]; }'.

โ–บ https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:708:10

708 mustache.Context = Context;
             ~~~~~~~

error TS2339: Property 'Writer' does not exist on type '{ name: string; version: string; tags: string[]; }'.

โ–บ https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs:709:10

709 mustache.Writer = Writer;
             ~~~~~~


Found 12 errors.

์•”ํ˜ธ:

import mustache from 'https://raw.githubusercontent.com/phillipj/mustache.js/esm-ify/mustache.mjs';

var view = {
  title: 'Joe',
  calc: function() {
    return 2 + 4;
  },
};

var output = mustache.render('{{title}} spends {{calc}}', view);

console.log(output);

.mjs ํŒŒ์ผ์— ๋Œ€ํ•ด ํ™๋ณด๋ฅผ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”!

๋‚ด๊ฐ€ ์ฒ˜์Œ์— ํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๊ฒƒ์— ๋Œ€ํ•ด ์ข€ ๋” ๋งŽ์€ ๋งฅ๋ฝ์„ ๊ณต์œ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ด์ œ ๊นจ๋‹ซ์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์•ž์„œ ๋…ผ์˜ํ•œ ๋ฐ”์™€ ๊ฐ™์ด TypeScript ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ ์ดˆ๊ธฐ ์‹œ๋„์—์„œ๋„ ์ง€๊ธˆ ์ œ๊ณตํ•œ ๊ฒƒ๊ณผ ๋‹ค์†Œ ์œ ์‚ฌํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ๊ณผ ๋งค์šฐ ๊ฐ€๊น๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์€ ์ปดํŒŒ์ผ๋œ ์ถœ๋ ฅ์„ ๊ฐ์‹ธ๋Š” UMD ์ฝ”๋“œ์˜€์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋‘ ๊ฐ€์ง€:

  1. ํŒจํ‚ค์ง€ ๋‚ด์šฉ์„ ์ „์—ญ ๋ฒ”์œ„์— ๋…ธ์ถœํ•˜๋Š” ๋Œ€์ฒด ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค( window.Mustache ์ƒ๊ฐ). ์ด๊ฒƒ์€ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
  2. CommonJS์™€ ํ”„๋กœ์ ํŠธ์—์„œ์ด ํŒจํ‚ค์ง€์˜ ๋‚ด์šฉ์œผ๋กœ ๋…ธ์ถœ module.exports.default ๋ณด๋‹ค๋Š” module.exports . CommonJS require() ๊ฐ€ ES ๋ชจ๋“ˆ์ผ ๋•Œ ๊ทธ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ณ  ์˜ˆ์ƒ๋œ ๋™์ž‘์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” ๋‚ด๊ฐ€ ํ”ผํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์ฃผ์š” ๋ชฉํ‘œ๋Š” ๋ฌด์—‡๋ณด๋‹ค๋„ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ TypeScript๋ฅผ ๋„์ž…ํ•˜์ง€ ์•Š๊ณ  ES ๋ชจ๋“ˆ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ/๋ฒˆ๋“ค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ„์˜ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ rollup.js๋กœ ๋๋‚œ ์ด์œ . UMD ์ถœ๋ ฅ์€ ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ์ด ํŒจํ‚ค์ง€์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด ์‹ค์ œ ์งˆ๋ฌธ์— Sooo; ์ง€๊ธˆ TypeScript์— ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด ๋…ผ์˜์˜ ์•ž๋ถ€๋ถ„์—์„œ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋ฐ”๋Š” TypeScript๋กœ ์™„์ „ํžˆ ์ „ํ™˜๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์‹ค์ œ๋กœ ES ๋ชจ๋“ˆ์ด๋ผ๋ฉด deno ๋„์›€์ด ๋  ๊ฒƒ์ด์ง€๋งŒ ์ œ๊ฐ€ ์•ฝ๊ฐ„ ์˜คํ•ดํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝง์ˆ˜์—ผ์˜ ์ฒซ ๋ฒˆ์งธ ์ดˆ๊ธฐํ™”๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
https://github.com/janl/mustache.js/blob/master/mustache.js#L14

๋˜ํ•œ ์ด๊ฒƒ์€ https://github.com/janl/mustache.js/blob/master/mustache.js#L536
new Context(view, null) ๋กœ ๋‹ค์‹œ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค?

๊ฐ€์žฅ ํฐ ๋ฌธ์ œ๋Š” ์ฝง์ˆ˜์—ผ์˜ ์ฒซ ๋ฒˆ์งธ ์ดˆ๊ธฐํ™”๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์˜ณ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. .mjs ๋ฒ„์ „ ์—์„œ๋Š” UMD ๋ž˜ํผ์—์„œ ์ „๋‹ฌ๋œ ๊ฐœ์ฒด๊ฐ€ ์•„๋‹Œ ์‹ค์ œ ์†Œ์Šค ์ฝ”๋“œ๋กœ ์ด๋™ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.

var mustache = {
  name: 'mustache.js',
  version: version,
  tags: [ '{{', '}}' ]
}

TypeScript ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋ณด๋ฉด ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ‘

์ƒˆ๋กœ์šด Context(view, null)๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฑฐ์˜.. new Context(view, undefined) ๋Š” ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋ฅผ ์ „ํ˜€ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์˜ˆ new Context ์— ๋Œ€ํ•ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋…ธ๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค :)

์—ฌ๊ธฐ ํ™๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/phillipj/mustache.js/pull/1
CI๊ฐ€ ์†์ƒ๋˜์—ˆ์ง€๋งŒ ๋ณดํ’€์ด ๋ฐœ์ƒํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์€ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ต‰์žฅํ•ฉ๋‹ˆ๋‹ค, ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์•ž์œผ๋กœ ๋ฉฐ์น ๊ฐ„ ๊ฝค ๋ฐ”๋น ์„œ, ์ด๋ฒˆ์ฃผ๊ฐ€ ๋๋‚˜๊ธฐ ์ „์— ์ตœ์„ ์„ ๋‹คํ•ด ๋ฆฌ๋ทฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ƒํƒœ ์—…๋ฐ์ดํŠธ; ๋‚ด esm-ify ๋ธŒ๋žœ์น˜ ์— ๋Œ€ํ•ด ์—ฐ PR์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ด์ œ ์ด ํŒจํ‚ค์ง€๊ฐ€ #724์—์„œ ์ˆ˜๋…„๊ฐ„ ์ง€์›ํ•ด ์˜จ ๋‹ค๋ฅธ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ ์ด์˜๋ฅผ ์ œ๊ธฐํ•˜๊ฑฐ๋‚˜ ๋งˆ์Œ์— ๋” ๋งŽ์€ ์กฐ์ •์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ๊ฐœ์„  ์‚ฌํ•ญ์„ ํ‘ธ์‹œํ•œ ๋Œ€๋กœ ๋ฉฐ์น  ๋™์•ˆ ์–‘์กฐํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ES ๋ชจ๋“ˆ๋กœ ์ž‘์„ฑ๋œ ์†Œ์Šค ์ฝ”๋“œ๋กœ ์ „ํ™˜ํ•˜๊ณ  ์˜ค๋Š˜ mustache.js ์— ์žˆ๋Š” ๊ฒƒ์„ ์ƒ์„ฑํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ํŽธ์•ˆํ•ด์ง‘๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์™„๋ฃŒ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค๊ฐ€์˜ค๋Š” PR์—์„œ.

728์€ ๊ณต๊ฐœ ์กฐ์‚ฌ๋ฅผ ์œ„ํ•ด ๊ณต๊ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰