
ããã¯ããã³ãã¬ãŒããæããèã«ãŠããŒã€ã®ãã©ã³ã¯ã§ãã
ããã«ã¡ã¯ ç§ã®éçº-ããã¹ããã³ãã¬ãŒããSnakeskinãçšã®ããã°ã©ãã³ã°èšèªã«ã€ããŠã話ãããŸãã ãã®ãããžã§ã¯ãã¯3幎以äžåã§ããã¹ãŠã®å°å
æã®ç
æ°ã§ã圌ã¯ç¡äºã«ç
æ°ã«ãªã£ãïŒãããŠæ²»ã£ãïŒã®ã§ãçµæãå
±æããããšæããŸãã
ãã¢
ãã©ã€ããªãªããžããª
ããã¥ã¡ã³ã
GulpãGruntãWebpackãªã©ã®ãã©ã°ã€ã³
Gitter-ããã§ã¯ãèå³ã®ãã質åãããããšãã§ããŸã
ã¡ãã£ãšããæŽå²
ç§ãYandexã§åããŠãããšãïŒ4幎åïŒãååãšã®ã³ãŒããŒãã€ã³ãã§ã®ç±ãè°è«ã®äž»ãªãããã¯ã®1ã€ã¯ãã³ãã¬ãŒãéçºè
ã§ãããæ¢åã®ãœãªã¥ãŒã·ã§ã³ã®é·æãšçæã«ã€ããŠè°è«ããäžéšã¯ç¬èªã«éçºããŸããã
éšéã®ã¡ã€ã³ã»ã¯ã·ã§ã³ã¯TemplateToolkit2ã§ãããããã¯ãç¹ã«Perléçºè
ã®éã§äººæ°ã®ãããã³ãã¬ãŒããšã³ãžã³ã§ãããã¯ã©ã€ã¢ã³ãã§ã¯æãåçŽãªMicroTemplateïŒJohn RezigäœïŒã䜿çšãããŸããã ãã®ãšãã§ãããXSLTã®ãããªãšã³ãžã³ã¯ç©æ¥µçã«åŒ·å¶ãããŸããããããã€ãã®çç±ïŒãã®èšäºã®ç¯å²å€ã§ããããïŒã¯ãç§ãã¡ã«é©ããŠããªããã®ã§ããã ãã³ãã«ããŒããã¹ããã¯ããŒãžã£ãŒãã³ãã¬ãŒãããããŠãã¡ãããã€ã¯ãªã©ãä»ã®äººãšæã
å®éšãè¡ããŸãããããããã¹ãŠãããããžã§ã¯ãå
ã®ãã³ãã¬ãŒããšã³ãžã³ã®åç©åå
šäœã®ååšã«ã€ãªãããŸããã
ç§ã®ãæ°ã«å
¥ãã¯Google Closure Templatesã§ããããã³ãã¬ãŒãã¯æååãè¿ãã ãã®é¢æ°ãšããŠäœçœ®ä»ããããŠãããããããã°ã©ããŒãšããŠã身è¿ã§ããã ããããäºçްãªãã£ã«ã¿ãŒã远å ããããã«Javaã³ãŒããç·šéããå¿
èŠãããããšã¯éåžžã«è
¹ç«ããããæŸéé床ã¯ããã»ã©æããããŸããã§ããïŒæ¬åœã«æããŸããïŒã
ãããŠãç§ã¯èªåã®ã¯ããŒãžã£ãŒãã³ãã¬ãŒããäœãããã£ã ãã©ãã¯ãžã£ãã¯ãšå£²æ¥å©Š ïŒåœç¶ãJSã§èšè¿°ãããå¿
èŠãããããã®çµæãJavaãç¥ãå¿
èŠãªãã倿Žã«å¯ŸããŠãªãŒãã³ã«ãªããŸãã ããã«ãç§ã¯éçãããã¯ããŒã¹ã®ãã³ãã¬ãŒãç¶æ¿ã¢ãã«ã奜ãã§ããããDjango Templatesã§èª¿ã¹ãŸããïŒãã®ãããåå-Pythonãžã®åç
§ïŒ-æ¢åã®ç¶æ¿ã·ã¹ãã ã®åºç€ã圢æããŸããã
ç§ã¯çŽ3æ¥ã§ãããã¿ã€ããã¹ã±ããããŸãããããã¯ã700è¡ã®ã³ãŒãã®åžžé£ã®ã²ã©ãããŒãã³ãŒãã§ããã ãã®çµæã§å°ãéãã ããååãšå
±æãããããã£ãŒãããã¯ãåãåã£ãããäœããã®ãã£ãŒãããã¯ãåãåã£ããããŠãå
ã«é²ãããšã«ããŸããã ãã®ã±ãŒã¹ã®ãªãã¡ã¯ã¿ãªã³ã°ããã°ã®ä¿®æ£ãè¿œå æ°ãã æ©äŒã®ã 1é±éã®éçºã®åŸãããŒãžã§ã³2ããªãªãŒã¹ããŸãããå®éãã¬ã®ã¥ã©ãŒãšåãããŒãã³ãŒãã§ãããããå®å®ããæ©èœãåããŠããŸãã ãã§ã«äœ¿çšãããŠããå¯èœæ§ããããŸãã
çµæã«ãã°ããåãçµãã§æ°åã®ã¢ããããŒãããªãªãŒã¹ããåŸãç§ã¯æããããããç©äºãæ£ããããæãæ¥ãããšèããŠã³ã³ãã¥ãŒã¿ãŒã«åº§ã£ãŠãçŽ1ãæåŸã«ç¬¬3ããŒãžã§ã³ããªãªãŒã¹ããŸããïŒES6ã§ããŒãã³ãŒããæšãŠãŠã³ãŒããæžãçŽããŸããïŒåœæã¯æ®éã®ç¿»èš³è
ãããªãã£ãã®ã§ãç§ãèªåã®ç¿»èš³è
ãã³ããŒããŸããïŒåã³ãã¬ã®ã¥ã©ãŒã«ã²ã©ãããŒãã³ãŒããä»ããŸãã-ã¯ããã¬ã®ã¥ã©ãŒã奜ãã§ãïŒïŒãæ§æè§£æãšå€ãã®æ°æ©èœãåããããªãŒã®æ§ç¯ã远å ããŸããã
ãã®ããŒãžã§ã³ã¯ãå®å®ãã匷åãªãã®ã§ãå®éãã¹ããã€ãã®ã¯ããŒãžã£ãŒãã³ãã¬ãŒãã§ããã ãã®çµæã«æºè¶³ããå人ã®ãããžã§ã¯ãã§Snakeskinã䜿çšãå§ããŸãããæã
ãæ°ããã¢ããããŒããšãããããªãªãŒã¹ããŸããã
åŸã§HAMLãšJadeã«äŒã£ãŠãæ§æãžã®ã¢ãããŒããæ°ã«å
¥ã£ããããSnakeskinã«äŒŒããã®ã远å ããããšã«ããŸããïŒãã®ãœãªã¥ãŒã·ã§ã³ã®çµæã¯Jadeã®ãããªæ§æã«ãªããŸããïŒã æ°ã¶æã«ãããæŽ»çºãªéçºã®åŸãç§ã¯4çªç®ã®ããŒãžã§ã³ããªãªãŒã¹ããŸãããããã¯ãèšèªã®æŽå²ã«ãããçã®ãã€ã«ã¹ããŒã³ãšãªãããããªãéçºã決å®ããŸããã 5çªç®ãš6çªç®ã¯4çªç®ã®ããŒãžã§ã³ã®ä¿®æ£ã«ãããŸããã§ãããã é倧ãªå€æŽãå¿
èŠã§ããã SemVerã®ããŒãžã§ã³ãã¿ãŒã³ãšããŠSemVerãéžæãããããã¡ãžã£ãŒããŒãžã§ã³ãæ··ä¹±ãããå¿
èŠããããŸããã
ç§ã¯ããªãé·ãéSS6ã䜿çšããããŸããŸãªãããžã§ã¯ãã§ç§ã®å人ãååãããã䜿çšãå§ããŸãã-çµæãšããŠããã°ããããŠãèŠæ
ã®ãªã¹ããèç©ãããŸãã-éåžžã«é·ãã¯ãããŸããããããã§ãå€ãã®æ©èœãããããããã¯éåžžã«æ··oticãšããŠçŸããŸãããããã³ãã£ã¬ã¯ãã£ãéã®ãç«¶åãã衚瀺ãããããã«ãªããŸããã ãã®çç±ã¯ãåæã®èšèªä»æ§ããªãããšã§ãããããŠã£ãã·ã¥ãªã¹ãããç»å Žããã«ã€ããŠéçºãé²ã¿ãŸããã
ç§ã¯ããªãããããã®ããã«çããããšã¯ã§ããªããšæ±ºããŸãã-ããªãã¯ãã¹ãŠãæšæºåãããŽããåãé€ãå¿
èŠããããŸãã éçºã¯1幎åç¶ããŸããïŒãã ããæå€§ã§6ãæéã¢ã¯ãã£ãã§ãã-空ãæéã®äžè¶³ã圱é¿ãåããŸããïŒããæçµçã«ãç§ãã¡ã¯SnakeskinïŒversion 7ã§æãå®å®ããææ
®æ·±ããªãªãŒã¹ãåŸãŸããã ãããŠç§ã¯åœŒãå¿ããèªãã«æã£ãŠããŸãã
åèŠ
Snakeskinã«æãé©ããŠããã®ã¯ãCoffeeScriptãTypeScriptã®ããã«ãJSã«å¯Ÿããåãªããç ç³ãã§ãããšããå®çŸ©ã§ããããã«æããŸããããã³ãã¬ãŒããæžããšããããªãçãå°éæ§ããããŸãã ãã¡ãããã¢ããªã±ãŒã·ã§ã³å
šäœãSSã§äœæããããšã¯å®å
šã«å¯èœã§ãããããã§ã¯ãªããããŸã䟿å©ã§ã¯ãããŸããã SSã¯ãã¡ã€ã³èšèªïŒäž»ã«JSïŒã§ã®äœ¿çšãç®çãšããŠããŸãã
select.ss
- namespace select - template main(options) < select - forEach options => el < option value = ${el.value} {el.label}
select.js
import { select } from 'select.ss'; class Select { constructor(options) { this.template = select.main(options); } } const newSelect = new Select([{value: 1, label: ''}, {value: 2, label: ''}])
ããã§ãJSã®ã¡ã€ã³ãã¡ã€ã«ã§ã¯ãSnakeskinã®ãã¡ã€ã«ãã¢ãžã¥ãŒã«ãšããŠæ¥ç¶ãããŠããŸãïŒããšãã°ã WebPackã®ãã©ã°ã€ã³ã¯ãã®ãããªã·ãŒã ã¬ã¹ãªçµ±åãæäŸããŸãïŒã ããããåå空éselect
ãã€ã³ããŒãããã¯ã©ã¹Select
ã宣èšããŸãã Select
ã€ã³ã¹ã¿ã³ã¹ãäœæãããšãã main
ãã³ãã¬ãŒãïŒ main
ãã³ãã¬ãŒãã倿ãããïŒãå®è¡ãããã®äœæ¥ã®çµæãtemplate
ããããã£ã«å²ãåœãŠãŸãnewSelect
å Žåã¯æ¬¡ã®ããã«ãªããŸãã
<select> <option value="1"> </option> <option value="2"> </option> </select>
ã芧ã®ãšãããSSã¯JSïŒå
·äœçã«ã¯ES5ïŒã«å€æããããããã¡ã€ã³ã³ãŒãã§éåžžã«äœ¿ãããããªããŸãã
Snakeskinãäœæãå§ããçç±ã«ã€ããŠè©±ããšãäž»ãªåæ©ã¯ãã³ãã¬ãŒãã³ãŒãã倿Žããã«ãµãŒããŒãšã¯ã©ã€ã¢ã³ãã§åæã«äœ¿çšã§ãã匷åãªã³ãŒãåå©çšæ©èœãåãããã³ãã¬ãŒãèšèªã䜿çšããããšã§ããã ãããŠããã¡ãããèšèªãšã¢ã€ãã¢ã®æ°ããèŠä»¶ããããããç§ã«ãã®ãããªæ©èœã远å ããå¿
èŠããããŸãããšããã¹ã¿ã€ã«ã§çŸãå§ããŸãããããããã¹ãŠããåµé çãã€è«ççã«æå³ã®ãããã®ã§ãã¹ããŒã¯ã¹ãã³ãããªããä»èŠãŠããããã«ããŸããã
ããšãã°ããæä»£ã®èŠä»¶ãã®1ã€ã¯ãç¬èªã®ãã³ãã¬ãŒãèšèªïŒAngularãReactãªã©ïŒãæã€ãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªãšã®ã·ãŒã ã¬ã¹ãªçµ±åã®å¿
èŠæ§ã§ããããããŠä»ã§ã¯Snakeskinãéåžžã«ããŸãæ©èœããŠããŸãã
SSã䜿çšããŠè§åºŠãã¿ãŒã³ãäœæããäŸïŒ
- namespace myApp - template main() < label Name: < input type = text | ng-model = yourName | placeholder = Enter a name here < hr < h1 Hello {{yourName}}!
äœæ¥çµæmain
<label> Name: </label> <input type="text" ng-model="yourName" placeholder="Enter a name here"> <hr> <h1> Hello {{yourName}}! </h1>
Snakeskinã¯ã³ãŒãã®éã倧å¹
ã«åæžããã¬ã€ã¢ãŠãèŠçŽ ã®åå©çšïŒç¶æ¿ãæ§æãäžçŽç©ãªã©ïŒãå¯èœã«ããAngularã¯ããŒã¿ãã€ã³ãã£ã³ã°ãå®è£
ããŸãã æè¡çãªèгç¹ãããSSã¯Angularã䜿çšãããã³ãã¬ãŒããçæããŸãã
ã©ãã§äœ¿ããŸãã
- ãµãŒããŒã®æšæºå -ããã§ã¯ãã¹ãŠãç°¡åã§ããSSãã¢ãžã¥ãŒã«ãšããŠæ¥ç¶ãããã¡ã€ã«ãã³ã³ãã€ã«ããŸã-ããŒãã jsã¯ãã®ãã³ãã¬ãŒãã颿°ãšããŠäœ¿çšããŸãïŒ
'use strict'; const http = require('http'); const ss = require('snakeskin');
ãã¡ãããå®éã«ã¯ExpressãKoaã®ãããªãµãŒããŒãã¬ãŒã ã¯ãŒã¯ã«ãªããŸãããéèŠã§ã¯ãããŸããã ãŸãããã³ãã¬ãŒãã¯ïŒãããŠã§ããã°ïŒ GulpãŸãã¯Gruntã® ãã©ã°ã€ã³ã䜿çšããŠäºåã«ç¿»èš³ããåä¿¡ãããã¡ã€ã«ãæ¥ç¶ããããšãã§ããŸãããŸãã¯ãäžèšã®ããã«WebPackã䜿çšããŸãã
èšèªã®æŠèŠ
ããã§åºæ¬çãªæŠå¿µã«ã€ããŠèª¬æããŸãããŸã 質åãããå Žåã¯ã ããã¥ã¡ã³ããŸãã¯Gitterãžããããã
ã¡ã€ã³
ãã¿ãŒã³
äœåºŠãè¿°ã¹ãããã«ãSnakeskinãã³ãã¬ãŒãã¯ç¿»èš³åŸã«JavaScript颿°ã«ãªããŸãã
- namespace myApp - template main() Hello world!
æŸéåŸã次ã®ããã«ãªããŸãã
if (exports.myApp === 'undefined') { var myApp = exports.myApp = {}; } exports.myApp.main = function main() { return 'Hello world!'; }
ãã¡ãããããã¯åçŽåãããã³ãŒãã§ãããå
šäœçã«ã¯æ¬¡ã®ããã«ãªããŸãã
æ§æ
SSã¯2çš®é¡ã®æ§æããµããŒãããŠããŸãã
- Classic ïŒãã£ã¬ã¯ãã£ãã¯äžæ¬åŒ§ã§å²ãŸããŠããŸãã ãããã¯ã®ãã®ïŒä»ã®SSã³ãŒããå«ãå¯èœæ§ãããïŒã¯ãæç€ºçã«éããå¿
èŠããããŸãã
{namespace myApp} {template main(name = 'world')} Hello {name}! {/template}
ãã®ã¢ãŒãã¯ãã³ã³ãããŒã«ã¹ããŒã¹ãå«ãããã¹ãã®çæã«äŸ¿å©ã§ããããšãã°ã Pythonã³ãŒã ããŒã¯ããŠã³
泚 ïŒäžæ¬åŒ§ããã䜿çšãããããã¹ããçæããããã«ãSSã«ã¯ç¹å¥ãªã¡ã«ããºã ããããŸãã
- Jadeã®ãã㪠ïŒå¶åŸ¡ã¹ããŒã¹ã«åºã¥ããŠãããJadeã«äŒŒãŠããŸãïŒãã®ãããååïŒã ããã䜿çšããäžèšã®äŸã¯æ¬¡ã®ããã«ãªããŸãã
- namespace myApp - template main(name = 'world') Hello {name}!
ãã®æ§æã®äž»ãªå©ç¹ã¯ãç°¡æœããšæå¿«ãã§ãã XMLã®ãããªæ§é ã®çæã«æé©ã§ãã
SSã¯æ··åæ§æããµããŒãããŠããŸãã
- namespace myApp {template hello(name = 'world')} Hello {name}! {/template} - template main(name) += myApp.hello(name)
æ§æãšãã®ã¿ã€ãã«ã€ããŠã®è©³çް ã
ã³ãŒãåå©çšããŒã«
ç¶æ¿
SSã§ã¯ãåãã³ãã¬ãŒãã¯ã¯ã©ã¹ã§ããã€ãŸããã¡ãœãããšããããã£ããããå¥ã®ãã³ãã¬ãŒãããç¶æ¿ã§ããŸãã åãã³ãã¬ãŒãã¯ãç¶æ¿ããã芪ã¡ãœãããšããããã£ããªãŒããŒã©ã€ãããæ°ãããã®ã远å ã§ããŸãã
ãã³ãã¬ãŒãã®ç¶æ¿ã®äŸ ã
- namespace myApp /// sayHello base /// SS , /// -- , /// - block base->sayHello(name = 'world') Hello {name}! - template base() - doctype < html < head /// head /// , /// - block head < title /// `title`, - title = ' ' ? < body - block body /// sayHello += self.sayHello() /// - block child->sayHello() /// sayHello - super Hello people! /// - block child->go() Let's go! /// child base - template child() extends myApp.base /// - title = ' ' /// - block body - super += self.go()
child
å®è¡çµæ ïŒ
<!DOCTYPE html> <html> <head> <title> </title> </head> <body> Hello world! Hello people! Let's go! </body> </html>
ãã³ãã¬ãŒããå
¥åãã©ã¡ãŒã¿ãŒããã³ãã¬ãŒãã®ãã³ã¬ãŒã¿ãŒãããŸããŸãªä¿®é£Ÿåãç¶æ¿ããå Žåã ããã§è©³çްãèªãããšãã§ããŸãã
æ§å³
Snakeskinã®ãã¹ãŠã®ãã³ãã¬ãŒãã¯é¢æ°ã§ãããããåœç¶ãã©ã®ãã³ãã¬ãŒããä»ã®ãã³ãã¬ãŒããåŒã³åºãããšãã§ããŸãïŒ call
ãã£ã¬ã¯ãã£ãã¯ããã«åœ¹ç«ã¡ãŸãã
- namespace myApp - template hello(name = 'world') Hello {name}! - template main(name) - call myApp.hello(name) /// += myApp.hello(name)
å€ãšããŠã®ãã¿ãŒã³
Snakeskinã§ã¯ããã³ãã¬ãŒãããªããžã§ã¯ãã®å€æ°ãŸãã¯ããããã£ã«å²ãåœãŠããã颿°ã«åŒæ°ãšããŠæž¡ãããããããšãã§ããŸãã
- namespace myApp - template wrap(content) < .wrapper {content} - template main(name) += myApp.wrap() < .hello Hello world!
main
çµæ
<div class="wrapper"> <div class="hello"> Hello world! </div> </div>
ã¢ãžã¥ãŒã«
Snakeskinã§èšè¿°ãããåãã¡ã€ã«ã¯ã¢ãžã¥ãŒã«ã§ããã°ããŒãã«å€æ°ã¯ãã®äžã«ã«ãã»ã«åããããã¹ãŠã®ãã³ãã¬ãŒãããšã¯ã¹ããŒããããŸãã ã¢ãžã¥ãŒã«ã¯ã include
ãã£ã¬ã¯ãã£ãã䜿çšããŠä»ã®ã¢ãžã¥ãŒã«ããã©ã°ã€ã³ã§ããŸãã
ãããã£ãŠãã³ãŒããç°¡åã«è«çéšåã«åå²ãããã©ã°ã€ã³ã©ã€ãã©ãªïŒããã³å Žåã«ãã£ãŠã¯ãã¬ãŒã ã¯ãŒã¯ïŒãäœæããäžè¬ã«ãåå²ããŠåŸæããããšããã«ãŒã«ã容赊ãªãåŸãããšãã§ããŸãã
math.ss
- namespace math - template sum(a, b) {a + b}
app.ss
- namespace myApp - include './math' - template main() 1 + 2 = += math.sum(1, 2)
myApp.mainãåŒã³åºããçµæ
1 + 2 = 3
çŽ æµãªãã³
çµã¿èŸŒã¿ãã£ã¬ã¯ãã£ãã®è±å¯ãªã»ãã
Snakeskinã«ã¯ã if
ã for
ã var
ã return
ãªã©ãJSã®ã¹ããŒãã¡ã³ããšæå³çã«åçã®ãã£ã¬ã¯ãã£ãããããŸãã ãã³ãã¬ãŒãèšèªã«åºæã®ãã£ã¬ã¯ãã£ããšãXMLã«äŒŒãæ§é ã®ããŒã¯ã¢ãããç°¡çŽ åãããã£ã¬ã¯ãã£ãïŒ tag
ã attr
ã doctype
ã comment
ãªã©ã éåæãã³ãã¬ãŒãçæã®ãã£ã¬ã¯ãã£ãïŒ await
ã yield
ã parallel
ã waterfall
; ãã®ä»å€æ° ã
ãã¹ãã¹ãžã®æ³šæ ïŒSnakeskinã¯ãŸã JavaScriptã§ã¯ãªãããããã¥ã¢ã³ã¹ã®äžéšã®ãã£ã¬ã¯ãã£ãã¯JSã§ã®åæ§ã®æŒç®åã®åäœãšã¯ç°ãªãå ŽåããããŸãã ããšãã°ã var
ä»ãvar
宣èšããã倿°ã«ã¯ãããã¯ã¹ã³ãŒãããããŸãïŒãããES2015ããã®letã®ä»çµã¿ã§ãïŒã with
ãã£ã¬ã¯ãã£ãã¯ãJSããåãæŒç®åã®ã¢ãŒããã¯ãã£äžã®æ¬ é¥ãæé€ããŸããããã¯ãSSå
ã§ã®äœ¿çšãéåžžã«ãè¯ãç¿æ
£ãã«ããã³ãŒãã®èšè¿°ãåçŽåããé«éåããŸãã
ãã£ã«ã¿ãŒæ©æ§

ãã£ã«ã¿ãŒã¯ãã»ãšãã©ã®ãã³ãã¬ãŒããšã³ãžã³ã«äœããã®åœ¢ã§ååšããŸãããSSã§ã¯èšèªã®ã³ã¢ã®äžéšã§ããããã倿°ãäœæãããšããã«ãŒãã§ããããã¯ããã³ãã¬ãŒããžã®åŒæ°ã宣èšãããšãããã£ã¬ã¯ãã£ãã§...ã©ãã§ãã
- namespace myApp - template main((str|trim), name = ('World'|lower)) - var a = {foo: 'bar'} |json
SSã«ã¯ããã«äœ¿çšã§ãã䟿å©ãªçµã¿èŸŒã¿ãã£ã«ã¿ãŒãæ°å€ããããŸããããããååã§ãªãå Žåã¯ãç¬èªã®ãã£ã«ã¿ãŒã ç°¡åã«è¿œå ã§ããŸãã
JSãšã®åæ¹åã¢ãžã¥ã©ãŒçµ±å
SSãã³ãã¬ãŒãã¯JSããã°ã©ã ã«ã€ã³ããŒãã§ããSnakeskinã¯JavaScriptã¢ãžã¥ãŒã«ãã€ã³ããŒãã§ããŸãïŒ import
ãã£ã¬ã¯ãã£ãã䜿çšïŒããã¹ãŠã®äž»èŠãªã¿ã€ãã®ã¢ãžã¥ãŒã«ããµããŒãããŠããŸãïŒ umd ã amd ã commonjs ã native ã global
- namespace myApp - import { readdirSync } from 'fs' /// ./foo - template main((str|trim), name = ('World'|lower)) - forEach readdirSync('./foo') => dirname {dirname}
- namespace myComponent - template render() < .hello {{ this.name }}
import React from 'react'; import { myComponent } from './myComponent.ss'; const Foo = React.createClass({ render: myComponent.render });
ãã®ãããªã·ãŒã ã¬ã¹ãªçµ±åã®ããã«ããã³ãã¬ãŒããReactã䜿çšããŠäœæãããèŠçŽ ãè¿ãå Žåã jsx
ãã©ã°ãjsx
ããŠjsx
ãã©ã°ã€ã³ãjsx
ãŸãã
空çœãå®å
šã«å¶åŸ¡
ã ç©ºçœæåã®æäœ ãã»ã¯ã·ã§ã³ãã芧ãã ãã ã
ã¹ãã£ãããŒãªã³ã¯ã®ãµããŒã ïŒèŠªã¯ã©ã¹ãªã³ã¯ïŒ
ãã®ã¡ã«ããºã ã¯ãCSSããªããã»ããµã§äœ¿çšãããã¡ã«ããºã ã«äŒŒãŠããŸãã BEMã¢ãããŒããé å®ããå Žåã«äŸ¿å©ã§ãã æäœã®ååã¯æ¬¡ã®ãšããã§ãããïŒãèšå·ã§å§ãŸãã¿ã°ã宣èšãããšãã«ã¯ã©ã¹åãæå®ãããšããã®èšå·ãªãã§å®£èšãããæãè¿ã芪ã¯ã©ã¹ã«çœ®ãæããããŸãã
- namespace myApp - template main() < .hello
- namespace myApp - template main(area) < ${area ? 'textarea' : 'input'}.b-${area ? 'textarea' : 'input'}
area
ã®å€ã«å¿ããŠãçµæã¯æ¬¡ã®ããã«ãªããŸãïŒwith area == true
ïŒïŒ
<textarea class="b-textarea"> </textarea>
ãŸãã¯ïŒ area == false
ïŒïŒ
<input class="b-input" value=" ">
- namespace demo - import Typograf from 'typograf' /// - JS SS - template typograf(params) - return () => target - return () => - return new Typograf(params).execute(target.apply(this, arguments)) /// index - @typograf({lang: 'ru'}) - template index() - !
- namespace myApp - async template main(db) - forEach await db.getData() => el {el} - template *foo(data) - for var i = 0; i < data.length; i++ {data.value} - if i
ã éåææäœã®ãã£ã¬ã¯ãã£ã ãã®ã»ã¯ã·ã§ã³ãåç
§ããŠãã ããã
ã«ã¹ã¿ã ã¬ã³ããªã³ã°
ããã©ã«ãã§ã¯ãSnakeskinã¯4ã€ã®ã¬ã³ããªã³ã°ã¢ãŒãããµããŒãããŠããŸãã1è¡ãããïŒããã©ã«ãïŒãBufferãDocumentFragmentãããã³JSXã§ãã ç¬èªã®ã¬ã³ãã©ãŒã远å ããããšãå¯èœã§ã-ããšãã°ãã«ã¹ã¿ã ä»®æ³DOMãçæããããã«ã
æçãªãšã©ãŒã¡ãã»ãŒãž
Snakeskin Translatorã«ã¯ããã³ãã¬ãŒãã翻蚳ãããšãã«ã»ãšãã©ã®æ§æãšã©ãŒãšè«çãšã©ãŒãèŠã€ããã®ã«åœ¹ç«ã€åŒ·åãªã³ãŒããããã¬ãŒããããŸãã
ãã¹ãŠã®äž»èŠãªã¢ã»ã³ããªã·ã¹ãã ã®ãµããŒã
Gulp ã Grunt ã WebPack ã
è¯ãã³ãŒãããŒã¹
Snakeskinã¯ES2015ã§å®å
šã«èšè¿°ãããŠããã倿°ã®ãã¹ããå«ãŸããŠããã ADVANCED
ã¢ãŒãã§æãå³ããGoogle Closure Compilerãã¹ãã«åæ ŒããŠããŸãã ã³ãŒãã¯ãGoogleã®JSDocæšæºã«åŸã£ãŠææžåãããŠããŸãã
è©³çŽ°ã§æç¢ºãªããã¥ã¡ã³ã
ãšããã§ãããã¯Snakeskinã§æžãããŠããŸãã
ãããã«
Snakeskinãããªãã«èå³ãæã£ãŠãã ããããšãå¿ããé¡ã£ãŠããŸãã詊ããŠã¿ãŠãåãã§ããã䜿ã£ãŠãã ããã
ãã®èšäºã®å·çãšç·šéãæäŒã£ãŠãããtrikadinã«å¿ããæè¬ããŸãã ã¡ãªã¿ã«ããã®ç·ã¯ã Edil ãã®ããã³ããšã³ããšããŠæ©èœããçŸåšã¯Webã®ã¡ã€ã³ãã³ãã¬ãŒãèšèªãšããŠSnakeskinããã¹ãããŠããŸãã 圌ã¯å¹žãã ãšèšãã以åã¯SSãªãã§ã©ã®ããã«æ®ãããŠããã®ãçè§£ããŠããªã:)
ãŸããèšèªéçºãšãµããŒãã«é¢ããã¢ã€ãã¢ã«ã€ããŠjavascript.ruãã©ãŒã©ã ããŒã ã«æè¬ããŸãã
ãããžã§ã¯ãã®GitHub-eã®åé¡ã§èŠã€ãã£ããã°ã«ã€ããŠæžããã³ã¡ã³ããŸãã¯Gitterã®ããããã«è¡šç€ºããã質åãããŸãããã€ãåãã§çããŠèª¬æããŸãã
é 匵ã£ãŠ