Handlebars.js: κΈ°λŠ₯ μ œμ•ˆ | 동기/비동기 λ„μš°λ―Έ

에 λ§Œλ“  2014λ…„ 01μ›” 23일  Β·  24μ½”λ©˜νŠΈ  Β·  좜처: handlebars-lang/handlebars.js

λ„μš°λ―Έλ₯Ό Sync λ˜λŠ” Async둜 λ“±λ‘ν•˜λ©΄ μ½œλ°±μ„ μˆ˜μ‹  λŒ€κΈ°ν•˜κ³  μ½œλ°±μ—μ„œ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” 데 도움이 λ©λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

express-hbsλ₯Ό μ‹œλ„ν•΄ λ³Ό μ˜ˆμ •μ΄μ§€λ§Œ 2018λ…„μ—λŠ” μ§€μ›ν•˜μ§€ μ•ŠλŠ” 것이 μ΄μƒν•œ 일이라고 μƒκ°ν•©λ‹ˆλ‹€. 비동기 μž‘μ—…μ΄ 뷰의 μΌλΆ€λ‘œ μˆ˜ν–‰λ˜μ–΄μ„œλŠ” μ•ˆ 되며 λŒ€μ‹  μ»¨νŠΈλ‘€λŸ¬λΌλŠ” λ§ˆλ²• 같은 μž‘μ—…μ—μ„œ μˆ˜ν–‰λ˜μ–΄μ•Ό ν•œλ‹€λŠ” μˆœμˆ˜ν•œ 관점이 μžˆλ‹€λŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€(MVCκ°€ μ–΄λ–»κ²Œλ“  틀림없이 "μ˜¬λ°”λ₯Έ" κ²ƒμ²˜λŸΌ). 원인

a) μ™ΈλΆ€ 라이브러리 - λŒ€λΆ€λΆ„μ˜ μ‚¬λžŒλ“€μ€ 이제 μ™„μ „νžˆ async/awaitλ₯Ό μ‚¬μš©ν•˜μ—¬ μž‘μ„±ν•©λ‹ˆλ‹€. λ‚΄ μ½”λ“œμ—μ„œλŠ” 10개 쀑 9개 μ΄μƒμ˜ ν•¨μˆ˜κ°€ 비동기식이라고 μƒκ°ν•©λ‹ˆλ‹€... μ–΄λ–€ κ²½μš°μ—λŠ” "λ§Œμ•½μ— λŒ€λΉ„ν•˜μ—¬"μž…λ‹ˆλ‹€. 비동기 κΈ°λŠ₯을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것은 λͺ¨λ“  비동기 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ κ°‘μžκΈ° μ™„μ „νžˆ μ•‘μ„ΈμŠ€ν•  수 μ—†λ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

b) 일반 컨트둀러 κΈ°λŠ₯. λ‚˜λŠ” λ‹€μŒκ³Ό 같이 μ£Όμž₯ν•©λ‹ˆλ‹€.

    {{#query "select name, total from summary"}}
          <tr><td>{{this.name}}</td><td>{{this.total}}</td></tr>
    {{/query}}

ν•΄λ‹Ή ν•­λͺ©μ„ λ³€μˆ˜μ— 집어넣고 ν…œν”Œλ¦ΏμœΌλ‘œ μ „λ‹¬ν•˜λŠ” λ§žμΆ€ν˜• 컨트둀러 κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” 것과 비ꡐ할 λ•Œ ν…œν”Œλ¦Ώμ΄ μ•Œκ³  μ•‘μ„ΈμŠ€ν•΄μ•Ό ν•˜λŠ” 것과 비ꡐ할 λ•Œ 더 짧고, κΉ¨λ—ν•˜κ³ , μœ μ§€ κ΄€λ¦¬ν•˜κΈ° 쉽고, 기본적으둜 생각할 수 μžˆλŠ” λͺ¨λ“  λ©΄μ—μ„œ μ›”λ“±ν•©λ‹ˆλ‹€.

λͺ¨λ“  24 λŒ“κΈ€

이것은 과거에 λ‚˜νƒ€λ‚¬μ§€λ§Œ μ‚¬μš© 사둀가 λͺ…ν™•ν•˜μ§€ μ•Šμ•„ 쑰치λ₯Ό μ·¨ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. ν•Έλ“€λ°”λŠ” μ—¬μ „νžˆ λͺ¨λ“  데이터λ₯Ό λ Œλ”λ§μ— μ‚¬μš©ν•  수 μžˆμ„ λ•ŒκΉŒμ§€ κΈ°λ‹€λ €μ•Ό ν•˜λ―€λ‘œ 비동기 평가λ₯Ό μ œκ³΅ν•˜λŠ” 것은 μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ„±ν•˜λŠ” μ½”λ“œκ°€ 훨씬 더 효율적인 λ°©μ‹μœΌλ‘œ μˆ˜ν–‰ν•  수 μžˆλŠ” μž‘μ—…μ— λŒ€ν•œ νŽΈμ˜μž…λ‹ˆλ‹€.

기본적으둜 이 μ‹œμ μ—μ„œ 비동기 평가λ₯Ό μΆ”κ°€ν•˜λŠ” 것은 ν˜Έν™˜μ„±κ³Ό λŸ°νƒ€μž„ μ„±λŠ₯ λ©΄μ—μ„œ μƒλ‹Ήνžˆ λΉ„μŒ€ κ²ƒμž…λ‹ˆλ‹€. 당신이 ν•˜λ €λŠ” 일에 λŒ€ν•œ ꡬ체적인 μ˜ˆκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

μ„±λŠ₯ λ¬Έμ œμ— λ™μ˜ν•˜μ§€λ§Œ RegisterHelper & RegisterHelperAsync λ˜λŠ” 이와 μœ μ‚¬ν•œ 것과 같이 μ„ νƒμ μœΌλ‘œ aysnc둜 λ§Œλ“€ 수 μžˆλ‹€λ©΄ 더 쒋을 것이라고 μƒκ°ν•©λ‹ˆλ‹€.

사싀 μ €λŠ” node.js둜 μž‘μ—…ν•˜λ©΄μ„œ μ΄λŸ¬ν•œ 비동기 핸듀바에 λŒ€ν•΄ μƒκ°ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” express.jsλ₯Ό μ‚¬μš©ν•˜μ—¬ 일뢀 μ‘μš© ν”„λ‘œκ·Έλž¨μ—μ„œ μž‘μ—…ν•˜κ³  있으며 μ‚¬μš©ν•˜λŠ” ν…œν”Œλ¦Ώ 엔진은 ν•Έλ“€λ°”μž…λ‹ˆλ‹€. λ”°λΌμ„œ λ·°λ₯Ό μ»΄νŒŒμΌν•˜λŠ” λ™μ•ˆ λ°μ΄ν„°λ² μ΄μŠ€ ν˜ΈμΆœμ—μ„œ 일뢀 값을 가져와야 ν•˜λŠ” 경우 이 동기 μž‘μ—…μœΌλ‘œλŠ” λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄,

Handlebars.registerHelper('getDbValue', function(id) {
     var Model = require('./myModel.js');
     Model.getValue(id, function(data){
           return data;
     });
});

μœ„μ˜ μ˜ˆλŠ” μž‘λ™ν•˜μ§€ μ•ŠμœΌλ©° 아무 것도 λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ 제 κ°œλ…μž…λ‹ˆλ‹€. 그리고 그것이 μ™„μ „νžˆ μ˜³μ€μ§€ μ•„λ‹ˆλ©΄ κ΅¬ν˜„ν•  수 μžˆλŠ”μ§€ μ—¬λΆ€λŠ” λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. 비동기 λ°©μ‹μ˜ 경우 리턴 λŒ€μ‹  콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.

Handlebars.registerHelperAsync('getDbValue', function(id, callback) {
     var Model = require('./myModel.js');
     Model.getValue(id, function(data){
           callback(data);
           //or
           //callback(new Handlebars.SafeString(data)); //in case of safestring.
     });
});

μœ„μ™€ 같은 λ¬Έμ œκ°€ 더 많이 λ°œμƒν•˜κ³  있으며 이 κΈ°λŠ₯에 관심이 μžˆλŠ” μ‚¬λžŒμ΄ 있으면 λ‚΄ μ‹œλ‚˜λ¦¬μ˜€μ— 따라 더 λ§Žμ€ 예λ₯Ό λ³΄μ—¬λ“œλ¦΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

감사 ν•΄μš”

@robincsamuel , λ·° 생성에 λ°μ΄ν„°λ² μ΄μŠ€ 쑰회λ₯Ό 포함할 λ•Œ MVC λΆ„λ¦¬μ˜ 전체 μ•„μ΄λ””μ–΄λŠ” 창에 μžˆμŠ΅λ‹ˆλ‹€. 보기가 λ Œλ”λ§λ  λ•ŒκΉŒμ§€ 데이터가 ν•„μš”ν•˜λ‹€λŠ” 것을 λͺ¨λ₯Ό 수 μžˆλ‹€κ³  μ£Όμž₯ν•˜κ³  μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 보기λ₯Ό 생성할 λ•Œλ³΄λ‹€ 컨트둀러 μˆ˜μ€€μ—μ„œ κ΅¬ν˜„ν•΄μ•Ό ν•˜λŠ” κΈ°λŠ₯을 μ œμ•ˆν•©λ‹ˆλ‹€. @kpdeckerκ°€ μ–ΈκΈ‰ν•œ μ„±λŠ₯ κ³ λ € 사항과 κ²°ν•©ν•˜μ—¬ 비동기 λ„μš°λ―ΈλŠ” 잘λͺ»λœ κ²ƒμ²˜λŸΌ λ³΄μž…λ‹ˆλ‹€. -- λ‚΄ 2c

λ‚˜λŠ” 단지 λ‚΄ 문제λ₯Ό μ „λ‹¬ν•˜κΈ° μœ„ν•΄ κ·Έ 예λ₯Ό μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€. 그리고 λ‚˜λŠ” λ…ΌμŸν•˜λ €λŠ” 것이 μ•„λ‹ˆλΌ 단지 μ œμ•ˆμ„ ν•œ κ²ƒμž…λ‹ˆλ‹€. λ„μš°λ―Έμ˜ 콜백으둜 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ 도움이 되기λ₯Ό λ°”λžλ‹ˆλ‹€. μ•„λ¬΄νŠΌ μ‹œκ°„ λ‚΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ :) @kpdecker @jwilm

이 μ‹œμ μ—μ„œ ν”„λ‘œμ νŠΈμ˜ μž…μž₯은 ν…œν”Œλ¦Ώμ„ ν˜ΈμΆœν•˜κΈ° 전에 데이터 뢄석을 μˆ˜ν–‰ν•΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. ν…œν”Œλ¦Ώ 문제 λ‚΄λΆ€ λ˜λŠ” μ™ΈλΆ€μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ 논리 μ™ΈλΆ€μ—μ„œ 비동기 해결은 비동기 와 같은 λ‹€λ₯Έ λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ²˜λ¦¬μ— 훨씬 더 μ ν•©ν•œ μœ ν‹Έλ¦¬ν‹° λ™μž‘μ— κ°€κΉμŠ΅λ‹ˆλ‹€.

μ˜κ²¬μ„ λ§ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. DB 예제λ₯Ό μ°½ λ°–μœΌλ‘œ λ˜μ§€κ² μ§€λ§Œ, 이것은 λŒμ—°λ³€μ΄ ν…œν”Œλ¦Ώμ— 정말 도움이 될 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 내뢀에 "ν•˜μœ„ 보기"κ°€ 있고 μ—¬λŸ¬ λ‹€λ₯Έ ν…œν”Œλ¦ΏμœΌλ‘œ λΆ„ν• ν•˜κ³  싢지 μ•Šμ€ ν…œν”Œλ¦Ώμž…λ‹ˆλ‹€. 전체 보기(κΉœλ°•μž„ 효과)λ₯Ό λ‹€μ‹œ μΉ ν•˜κ±°λ‚˜ μ»¨νŠΈλ‘€λŸ¬κ°€ μ΄λŸ¬ν•œ λͺ¨λ“  "λ―Έλ‹ˆ 보기"에 λŒ€ν•œ 전체λ₯Ό λΉŒλ“œν•˜λ„λ‘ ν•˜λŠ” λŒ€μ‹  보기의 일뢀λ₯Ό μ—…λ°μ΄νŠΈν•˜κ³  이에 λŒ€ν•œ κ°„λ‹¨ν•œ 논리λ₯Ό κ°–κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

μ–΄λ–»κ²Œ 생각해?

@tomasdev λ‚΄ 말은 :)

이 κΈ°λŠ₯은 https://github.com/barc/express-hbsλ₯Ό μ‚¬μš©ν•˜λŠ” 경우 Expressκ°€ μžˆλŠ” λ…Έλ“œμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ„μš°λ―Έμ˜ 비동기 버전은 ν•˜μœ„ ν‘œν˜„μ‹ 및 기타 λͺ‡ 가지 μ˜ˆμ™Έμ μΈ κ²½μš°μ™€ 잘 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

핸듀바에 ν¬ν•¨ν•˜κΈ° μœ„ν•΄ 이 κΈ°λŠ₯을 μž¬κ³ ν•˜κ±°λ‚˜ μ΅œμ†Œν•œ ν•Έλ“€λ°” μ½”μ–΄κ°€ μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ ν™•μž₯을 더 잘 지원할 수 μžˆλŠ” 방법을 κ³ λ €ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” Ghostκ°€ 비동기 λ„μš°λ―Έμ— λŒ€ν•œ λͺ…ν™•ν•˜κ³  μœ νš¨ν•œ(비둝 ν”ν•˜μ§€λŠ” μ•Šμ§€λ§Œ) μ‚¬μš© 사둀λ₯Ό 보여주고 μžˆλ‹€κ³  λ―ΏμŠ΅λ‹ˆλ‹€.

ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ Ghost의 λͺ¨λ“  ν…œν”Œλ¦Ώμ€ ν…Œλ§ˆλ³„λ‘œ μ œκ³΅λ©λ‹ˆλ‹€. ν…Œλ§ˆλŠ” ν•Έλ“€λ°”, CSS 및 ν΄λΌμ΄μ–ΈνŠΈ JS의 맀우 얇은 λ ˆμ΄μ–΄μ΄λ©° μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” μœ μΌν•œ λ°μ΄ν„°λŠ” μš°λ¦¬κ°€ 미리 μ œκ³΅ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 컨트둀러 λ˜λŠ” λ™μž‘ λ³€κ²½ 논리에 μ•‘μ„ΈμŠ€ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 이것은 맀우 μ˜λ„μ μž…λ‹ˆλ‹€.

ν…Œλ§ˆ APIλ₯Ό ν™•μž₯ν•˜κΈ° μœ„ν•΄ ν…Œλ§ˆμ—μ„œ μ‚¬μš©ν•˜λ €λŠ” μΆ”κ°€ 데이터 μ»¬λ ‰μ…˜μ„ μ •μ˜ν•˜λŠ” λ„μš°λ―Έ μΆ”κ°€λ₯Ό μ‹œμž‘ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

{{#fetch tags}}
.. do something with the list of tags..
{{else}}
No tags available
{{/fetch}}

Ghostμ—λŠ” λ‚΄λΆ€ 및 μ™ΈλΆ€μ—μ„œ λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆλŠ” JSON APIκ°€ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 이 κ°€μ Έμ˜€κΈ° μΏΌλ¦¬λŠ” 찾아보기 νƒœκ·Έ κΈ°λŠ₯에 λ§€ν•‘λ©λ‹ˆλ‹€. λͺ¨λ“  μ—”λ“œν¬μΈνŠΈμ— λŒ€ν•΄ ajax/httpλ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. λŒ€μ‹  비동기 λ„μš°λ―Έκ°€ APIμ—μ„œ 이 데이터λ₯Ό λ‚΄λΆ€μ μœΌλ‘œ 가져와 ν‰μ†Œμ²˜λŸΌ 계속할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 이것이 일반적인 μ‚¬μš© 사둀라고 μ£Όμž₯ν•˜μ§€ μ•ŠμœΌλ©° ν‘œμ€€ MVC λͺ¨λΈμ„ μœ„λ°˜ν•˜λŠ” 것을 μΈμ •ν•˜μ§€λ§Œ 그것이 μœ νš¨ν•˜κ³  μœ μš©ν•˜λ‹€κ³  λ―ΏμŠ΅λ‹ˆλ‹€.

@ErisDS 쒋은 μ†Œμ‹μž…λ‹ˆλ‹€! 그리고 μ € μ—­μ‹œ 그것이 일반적인 문제라고 μ£Όμž₯ν•˜μ§€λŠ” μ•Šμ§€λ§Œ 도움이 λ©λ‹ˆλ‹€.

이 κ²½μš°μ— μš°λ¦¬κ°€ ν˜„μž¬ 비동기 λ„μš°λ―Έλ₯Ό μ‚¬μš©ν•˜κ³  μžˆλŠ” λ§Žμ€ μž‘μ—…μ΄ λ‚΄λΆ€μ μœΌλ‘œ λ™κΈ°μ μ΄μ§€λ§Œ μ•½μ†μœΌλ‘œ κ΅¬μ‘°ν™”λœλ‹€λŠ” 점에 μ£Όλͺ©ν•  κ°€μΉ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μžμ„Έν•œ 예λ₯Ό λ“€μžλ©΄...

Ghost의 λͺ¨λ“  λ°μ΄ν„°λŠ” λ‚΄λΆ€ APIλ₯Ό 톡해 μ•‘μ„ΈμŠ€λ©λ‹ˆλ‹€. μ—¬κΈ°μ—λŠ” μ„€μ •κ³Ό 같은 μ „μ—­ 정보가 ν¬ν•¨λ©λ‹ˆλ‹€. μ„€μ • API에 λŒ€ν•œ μš”μ²­μ€ λ°μ΄ν„°λ² μ΄μŠ€μ— λ„λ‹¬ν•˜κΈ° 전에 미리 μ±„μ›Œμ§„ λ©”λͺ¨λ¦¬ λ‚΄ μΊμ‹œμ— λ„λ‹¬ν•˜λ―€λ‘œ μ‹€μ œλ‘œλŠ” λ³€μˆ˜λ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ 이것을 μ•½μ†μœΌλ‘œ κ΅¬μ‘°ν™”ν•˜λ©΄ ν•„μš”ν•œ 경우 λ°μ΄ν„°λ² μ΄μŠ€λ‘œ μ‰½κ²Œ 이동할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ λͺ¨λ“  것이 일관적인지 ν™•μΈν•©λ‹ˆλ‹€. 그렇지 μ•ŠμœΌλ©΄ μ„€μ • APIκ°€ 동기식이고 λ‹€λ₯Έ λͺ¨λ“  λ‚΄λΆ€ 데이터 μš”μ²­μ€ λΉ„λ™κΈ°μ‹μ΄λ―€λ‘œ μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€.

λͺ¨λ“  것을 μ•½μ†μœΌλ‘œ κ΅¬μ„±ν•˜λŠ” 것이 μ²˜μŒμ—λŠ” μƒλ‹Ήνžˆ ν˜Όλž€μŠ€λŸ¬μšΈ 수 μžˆλ‹€λŠ” 것을 μ••λ‹ˆλ‹€. ν•˜μ§€λ§Œ 일단 약속을 κ°–κ³  λ‚˜λ©΄ 없이 μ–΄λ–»κ²Œ μ‚΄μ•˜λŠ”μ§€ 이해할 수 μ—†λŠ” 것 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€. ES6에 μ œλ„ˆλ ˆμ΄ν„°κ°€ μΆ”κ°€λ˜λ©΄ ν•¨μˆ˜μ˜ 비동기식 지원이 JavaScript에 λ°”λ‘œ μ μš©λ©λ‹ˆλ‹€. 이와 μœ μ‚¬ν•œ 문제: https://github.com/wycats/handlebars.js/issues/141 μ—μ„œλŠ” ν•Έλ“€λ°”λ₯Ό λ§Œλ“œλŠ” 것이 쒋을 것이라고 μ–ΈκΈ‰ν–ˆμŠ΅λ‹ˆλ‹€. 수율둜 μž‘μ—…ν•©λ‹ˆλ‹€.

HTMLbar의 ν–₯ν›„ λ¦΄λ¦¬μŠ€κ°€ 이에 μ–΄λ–»κ²Œ 영ν–₯을 미칠지 λͺ¨λ₯΄κ² μ§€λ§Œ 적어도 μΆ”κ°€ λ…Όμ˜κ°€ ν•„μš”ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

cl 해결을 μœ„ν•œ λ„μš°λ―Έλ₯Ό λ§Œλ“€λ €κ³  μ‹œλ„ν•˜λŠ” λ™μ•ˆ λ‹€λ₯Έ μ‚¬μš© 사둀에 λΆ€λ”ͺμ³€μŠ΅λ‹ˆλ‹€. 이것은 λ‚΄ ν…œν”Œλ¦Ώμ— 잘 λ§žμŠ΅λ‹ˆλ‹€.

        {{#allowedTo 'edit' '/config'}}
            <li>
                <a href="/config">Config</a>
            </li>
        {{/allowedTo}}

κ·ΈλŸ¬λ‚˜ node-acl의 μ‹€μ œ isAllowed λ©”μ†Œλ“œλŠ” λΉ„λ™κΈ°μ‹μž…λ‹ˆλ‹€(예λ₯Ό λ“€μ–΄ λ°μ΄ν„°λ² μ΄μŠ€ λ°±μ—”λ“œ ν—ˆμš©).

ν•΄κ²° 방법은 λͺ¨λ“  μ‚¬μš©μž κΆŒν•œμ„ 미리 κ°€μ Έμ˜€λŠ” κ²ƒμž…λ‹ˆλ‹€( allowedPermissions ). ν•˜μ§€λ§Œ 그건 μ’€ κ°€λ ΅μŠ΅λ‹ˆλ‹€.

@kpdecker μ΄λŸ¬ν•œ μ‚¬μš© 사둀에 λŒ€ν•œ μΆ”κ°€ 생각이 μžˆμŠ΅λ‹ˆκΉŒ?

@ErisDS μ—¬κΈ°μ—μ„œ μ›ν•˜λŠ” 것을 μ΄ν•΄ν•˜μ§€λ§Œ 이것이 콜백 λ˜λŠ” 약속 ν˜•μ‹μ˜ μ–Έμ–΄λ‘œ λ§Œλ“€μ–΄μ§ˆμ§€ μ‹¬κ°ν•˜κ²Œ μ˜μ‹¬λ©λ‹ˆλ‹€. 이것은 API κ΄€μ μ—μ„œ μ™„μ „νžˆ μˆ˜ν–‰ν•˜κΈ° 맀우 μ–΄λ €μš΄ 일이며 이λ₯Ό μ§€μ›ν•˜κΈ° μœ„ν•΄ ν…œν”Œλ¦Ώ μ—”μ§„μ˜ λ§Žμ€ 뢀뢄을 효과적으둜 λ‹€μ‹œ μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ‚΄ ꢌμž₯ 사항은 μ—…μŠ€νŠΈλ¦Ό λͺ¨λΈ/데이터 μ†ŒμŠ€μ—μ„œ λ Œλ”λ§ μ£ΌκΈ°λ₯Ό μž…λ ₯ν•˜κΈ° 전에 이 λͺ¨λ“  것을 μ²˜λ¦¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

수율 μ•„μ΄λ””μ–΄λŠ” ν₯미둜운 μ•„μ΄λ””μ–΄μ΄μ§€λ§Œ λˆ„κ΅°κ°€κ°€ 거기에 ν•„μš”ν•œ 것을 μ‚΄νŽ΄λ³΄κ³  μ‹Άλ‹€λ©΄ λ†€λΌμš΄ 연ꡬ ν”„λ‘œμ νŠΈκ°€ 될 κ²ƒμž…λ‹ˆλ‹€. 아직 λ‚΄ ν”„λ‘œμ νŠΈμ— μžˆλŠ” κΈ°λŠ₯ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

λ‚΄ "2"(음, λͺ‡) μ„ΌνŠΈλ₯Ό κ³ λ €ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • MVCλŠ” μ‹ μ„±ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. MVC와 λͺ¨μˆœλ˜λŠ” κ²ƒμ²˜λŸΌ 보이기 λ•Œλ¬Έμ— 상황이 잘λͺ»λœ 것은 μ•„λ‹™λ‹ˆλ‹€. MVCλ₯Ό μ—„κ²©ν•˜κ²Œ λ”°λ₯΄λŠ” 것보닀 λŒ€μ•ˆμ΄ 순 긍정적인 이점을 μ œκ³΅ν•˜μ§€ μ•ŠλŠ”μ§€ μ—¬λΆ€λ₯Ό 평가해야 ν•©λ‹ˆλ‹€.
  • λ·°κ°€ μ»¨νŠΈλ‘€λŸ¬μ— 직접 λͺ¨λΈμ΄ μ•„λ‹Œ 데이터λ₯Ό μš”μ²­ν•˜λ©΄ μ–΄μ¨Œλ“  MVCλ₯Ό μœ„λ°˜ν•˜λŠ” 것은 μ•„λ‹ˆκ² μ£ ?
  • μ»¨νŠΈλ‘€λŸ¬κ°€ λ·°κ°€ ν•„μš”λ‘œ ν•˜λŠ” λͺ¨λ“  것을 미리 μ•Œκ²Œ ν•˜λŠ” 것은 μ •λ³΄μ˜ 볡제라고 μ£Όμž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€(즉, "X, Y, Z, Wκ°€ ν•„μš”ν•©λ‹ˆλ‹€"λΌλŠ” μ •λ³΄λŠ” 뷰와 μ»¨νŠΈλ‘€λŸ¬μ— λ³΅μ œλ©λ‹ˆλ‹€). 즉, ν˜„μž¬ μ—°μŠ΅μ€ MVC보닀 훨씬 더 μ€‘μš”ν•œ DRY 원칙을 μœ„λ°˜ν•˜λŠ” 것일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ Œλ”λ§λ˜λŠ” 보기에 ν•„μš”ν•œ λͺ¨λΈλ§Œ λ‘œλ“œν•˜κΈ° μœ„ν•œ 비동기 λ„μš°λ―Έμ˜ μ„±λŠ₯ μ €ν•˜λŠ” λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 더 적은 데이터λ₯Ό λ‘œλ“œν•˜μ—¬ μ‰½κ²Œ 보상될 수 μžˆμŠ΅λ‹ˆλ‹€.

μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” 더 λ‚˜μ€ 예λ₯Ό μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” λͺ¨λ°”일 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μœ„ν•΄ Cordova둜 λ§Žμ€ μž‘μ—…μ„ ν•˜κ³  있으며 λ§Žμ€ μ–Έμ–΄λ‘œ ν˜„μ§€ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€. CordovaλŠ” λ‚ μ§œ, 숫자, 톡화 λ“±μ˜ ν˜•μ‹μ„ μ§€μ •ν•˜λŠ” 데 도움이 λ˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
λ¬Έμ œλŠ” λͺ¨λ‘ 비동기 콜백이 ν•„μš”ν•˜λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ˜ˆμ‹œ:

Handlebars.registerHelper('stringToNumber', function(string, type)
{
    type = type || 'decimal';
    navigator.globalization.stringToNumber(string, function(number)
    {
        return number;
    }, function()
    {
        return NaN;
    }, {
        type: type
    });
});

이것은 imoκ°€ 있으면 ꡉμž₯ν•  κ²ƒμž…λ‹ˆλ‹€.

npm μ—μ„œ handlebars-async νŒ¨ν‚€μ§€λ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€ . κ·ΈλŸ¬λ‚˜ 그것은 쑰금 더 μ˜€λž˜λ˜μ—ˆκ³  ν˜„μž¬ Handlebars λ²„μ „μ—μ„œ μž‘λ™ν•˜λŠ”μ§€ λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ˜ν•œ 약속에 λŒ€ν•΄ λΉ„μŠ·ν•œ 것을 μΌμŠ΅λ‹ˆλ‹€. promise -handlebars νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•˜λ©΄ λ„μš°λ―Έ λ‚΄μ—μ„œ 약속을 λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄ ν”„λ‘œμ νŠΈ 쀑 ν•˜λ‚˜μ—μ„œ μ‚¬μš©ν•  κ³„νšμ΄μ§€λ§Œ μ§€κΈˆκΉŒμ§€ ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œλŠ” μ‚¬μš©λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λͺ‡ 가지 엣지 μΌ€μ΄μŠ€(예: 비동기 블둝 λ„μš°λ―Έ λ‚΄μ—μ„œ 비동기 λ„μš°λ―Έ 호좜)에 λŒ€ν•œ λ‹¨μœ„ ν…ŒμŠ€νŠΈκ°€ 있으며 λͺ¨λ‘ λ…Ήμƒ‰μž…λ‹ˆλ‹€...

@nknapp 정말 λ†€λžμŠ΅λ‹ˆλ‹€! express-hbs λŠ” 비동기λ₯Ό μ§€μ›ν•˜κ³  λΉ„λ™κΈ°λŠ” 블둝 λ„μš°λ―Έμ— λŒ€ν•΄ μž‘λ™ν•˜μ§€λ§Œ μ€‘μ²©λœ 비동기 λ„μš°λ―ΈλŠ” μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μ €λŠ” 이것이 μž‘λ™ν•˜λŠ” 것을 λ³΄λŠ” 데 μ •λ§λ‘œ 관심이 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” express-hbs에 λŒ€ν•œ 희망이 아직 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€:+1:

@ErisDS , 거기에 κ²Œμ‹œν•΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•˜μ‹­λ‹ˆκΉŒ? λ‚˜λŠ” 이제 express-hbs κ°€ 비동기 λ„μš°λ―Έλ₯Ό 쀑첩할 수 μ—†λ‹€λŠ” 것을 μ•Œμ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. λ‚΄ μ£Όμš” μ΄ˆμ μ€ express κ°€ μ•„λ‹ˆλΌ ν˜„μž¬ μž‘μ—… 쀑인 README μƒμ„±κΈ°μž…λ‹ˆλ‹€. λ‚˜λŠ” λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ 그것을 μ‹œλ„( promised-handlebars )ν•˜μ—¬ ν”Όλ“œλ°±μ„ μ£Όμ‹œλ©΄ 정말 κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

μœ νš¨ν•œ μ‚¬μš© 사둀에 μΆ”κ°€ν•˜λ €λ©΄ ν˜„μž¬ λ‘œμΌ€μΌμ„ 기반으둜 λ²ˆμ—­ DBμ—μ„œ 값을 가져와야 ν•˜λŠ” 경우 μ–΄λ–»κ²Œ ν•΄μ•Ό ν•©λ‹ˆκΉŒ?

<div class="howItWorks">
    {{{i18nFetch id=how-it-works locale=locale}}}
</div>

λ˜ν•œ λ‹€μŒκ³Ό 같은 동적 IDλ₯Ό μ‚¬μš©ν•˜μ—¬ DB ν•­λͺ©μ—μ„œ CMS 블둝을 μΆ”κ°€ν•˜λŠ” 것은 μ–΄λ–»μŠ΅λ‹ˆκΉŒ?

<div class="searchCms">
    {{{cmsLoader 'search-{$term}' term=params.input defaultId='search-default'}}}
</div>

이것은 특히 μ„œλ²„ μΈ‘ λ Œλ”λ§μ— μœ μš©ν•©λ‹ˆλ‹€(즉, express-handlebars μ‚¬μš©).

μ—¬κΈ° 또 λ‹€λ₯Έ μ‚¬μš© 사둀가 μžˆμŠ΅λ‹ˆλ‹€. μ €λŠ” μ™ΈλΆ€ μŠ€ν‚€λ§ˆ μ •μ˜λ₯Ό ν—ˆμš©ν•˜λŠ” Swagger( simple-swagger )용 λ¬Έμ„œ 생성기λ₯Ό μž‘μ„±ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μŠ€ν‚€λ§ˆκ°€ μ™ΈλΆ€μ—μ„œ μ •μ˜λ  λ•Œ μΈμ‹ν•˜κ³  ν•΄λ‹Ή μŠ€ν‚€λ§ˆκ°€ μžˆλŠ” 제곡된 URL둜 μ΄λ™ν•˜μ—¬ κ²€μƒ‰ν•˜κ³  ν•΄λ‹Ή 데이터λ₯Ό μ‚¬μš©ν•˜μ—¬ Handlebars ν…œν”Œλ¦Ώμ˜ ν•΄λ‹Ή 뢀뢄을 λ Œλ”λ§ν•˜λŠ” Handlebars λ„μš°λ―Έλ₯Ό μž‘μ„±ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. Handlebars의 컴파일 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κΈ° 전에 이 데이터λ₯Ό 검색해야 ν–ˆλ‹€λ©΄ 미리 ꡬ쑰λ₯Ό μ•Œμ§€ λͺ»ν•˜λŠ” JSON λ¬Έμ„œλ₯Ό 톡해 μž¬κ·€μ μœΌλ‘œ λ°˜λ³΅ν•˜κ³  μ™ΈλΆ€ μŠ€ν‚€λ§ˆμ˜ λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ₯Ό μ°Ύμ•„ κ²€μƒ‰ν•˜κ³  μ‚½μž…ν•΄μ•Ό ν•©λ‹ˆλ‹€. JSON.

기본적으둜 Handlebars ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜μ—¬ JSON μŠ€ν‚€λ§ˆ 데이터( json-schema.org )λ₯Ό λ Œλ”λ§ν•˜λŠ” 경우 JSON μŠ€ν‚€λ§ˆλŠ” 항상 μŠ€ν‚€λ§ˆμ˜ ν•˜μœ„ 뢀뢄을 μ™ΈλΆ€μ—μ„œ μ •μ˜ν•  수 μžˆλ„λ‘ ν•˜κΈ° λ•Œλ¬Έμ— 비동기 λ Œλ”λ§ 방법이 μœ μš©ν•©λ‹ˆλ‹€.

@dwhieb λ¬Έμ„œ 생성기에 λŒ€ν•œ bootprint -swagger λ₯Ό λ³΄μ…¨μŠ΅λ‹ˆκΉŒ? 그것은 당신이 μ„€λͺ…ν•˜λŠ” 것과 거의 κ°™μŠ΅λ‹ˆλ‹€(μ™ΈλΆ€ μŠ€ν‚€λ§ˆκ°€ 아직 κ΅¬ν˜„λ˜μ§€ μ•Šμ•˜μ§€λ§Œ μ΄λŠ” ν›Œλ₯­ν•œ κΈ°λŠ₯이 될 κ²ƒμž…λ‹ˆλ‹€). ν”Όλ“œλ°±μ΄ μžˆλŠ” 경우 문제λ₯Ό μ—¬μ‹­μ‹œμ˜€.

그리고 λ‚˜λŠ” promise-handlebars κ°€ 비동기 λ„μš°λ―Έμ™€ 잘 μž‘λ™ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λ„μš°λ―Έμ—μ„œ 약속을 μ‚¬μš©ν•  수 μžˆλŠ” μ‚¬μš© 사둀가 μžˆμŠ΅λ‹ˆλ‹€. ν•Έλ“€λ°”λ₯Ό μ‚¬μš©ν•˜μ—¬ λΈ”λ‘œκ·Έμš© HTML을 μƒμ„±ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 각 기사에 λŒ€ν•΄ μœ νš¨ν•œ κ΅¬μ‘°ν™”λœ 데이터λ₯Ό μž‘μ„±ν•˜λ €λ©΄ 기사 이미지에 μ‚¬μš© 쀑인 치수λ₯Ό 가져와야 ν•©λ‹ˆλ‹€. μ§€κΈˆμ€ λ‹€μŒκ³Ό 같이 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

{{#imageSize post.frontMatter.previewImage}}
  <div itemprop="image" itemscope itemtype="https://schema.org/ImageObject">
    <meta itemprop="url" content="{{#staticResource ../post.frontMatter.previewImage}}{{/staticResource}}">
    <meta itemprop="width" content="{{width}}">
    <meta itemprop="height" content="{{height}}">
  </div>
{{/imageSize}}

imageSize λ„μš°λ―ΈλŠ” νŒŒμΌμ„ λ™κΈ°μ μœΌλ‘œ 읽기 λ•Œλ¬Έμ— μž‘λ™ν•˜μ§€λ§Œ I/O둜 인해 νŽ˜μ΄μ§€ λ Œλ”λ§ 속도가 λŠλ €μ§€μ§€ μ•Šλ„λ‘ λΉ„λ™κΈ°μ μœΌλ‘œ μˆ˜ν–‰ν•  수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ 파일 μ‹œμŠ€ν…œ λŒ€μ‹  URLμ—μ„œ 이미지에 λŒ€ν•΄ 이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

promise-handlebars 및 express-hbsλ₯Ό μ‚¬μš©ν•˜λŠ” 방법을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ„μš°λ―Έ κΈ°λŠ₯μ—μ„œ promiseλ₯Ό μ‚¬μš©ν•˜λŠ” κΈ°λŠ₯은 Handlebars에 큰 도움이 될 κ²ƒμž…λ‹ˆλ‹€!

FWIW, μ €λŠ” Hyperscript, hyperscript-helpers , ES7의 async/await λ₯Ό μ‚¬μš©ν•˜μ—¬ 비동기 HTML λ Œλ”λ§μ„ 많이 ν•΄μ™”κ³  정말 μ¦κ±°μ› μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ¬Όλ‘  κ·Έ μ†”λ£¨μ…˜μ€ HTMLμ—μ„œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€. ν•Έλ“€λ°”κ°€ μžˆλŠ” 비동기 μ†”λ£¨μ…˜μ„ μ‚¬μš©ν•˜λ©΄ λ‹€λ₯Έ μ’…λ₯˜μ˜ νŒŒμΌμ„ λΉ„λ™κΈ°μ μœΌλ‘œ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ HTML의 κ²½μš°μ—λŠ” μ ˆλŒ€ λ’€λŒμ•„λ³΄μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€!

express-hbsλ₯Ό μ‹œλ„ν•΄ λ³Ό μ˜ˆμ •μ΄μ§€λ§Œ 2018λ…„μ—λŠ” μ§€μ›ν•˜μ§€ μ•ŠλŠ” 것이 μ΄μƒν•œ 일이라고 μƒκ°ν•©λ‹ˆλ‹€. 비동기 μž‘μ—…μ΄ 뷰의 μΌλΆ€λ‘œ μˆ˜ν–‰λ˜μ–΄μ„œλŠ” μ•ˆ 되며 λŒ€μ‹  μ»¨νŠΈλ‘€λŸ¬λΌλŠ” λ§ˆλ²• 같은 μž‘μ—…μ—μ„œ μˆ˜ν–‰λ˜μ–΄μ•Ό ν•œλ‹€λŠ” μˆœμˆ˜ν•œ 관점이 μžˆλ‹€λŠ” 것을 μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€(MVCκ°€ μ–΄λ–»κ²Œλ“  틀림없이 "μ˜¬λ°”λ₯Έ" κ²ƒμ²˜λŸΌ). 원인

a) μ™ΈλΆ€ 라이브러리 - λŒ€λΆ€λΆ„μ˜ μ‚¬λžŒλ“€μ€ 이제 μ™„μ „νžˆ async/awaitλ₯Ό μ‚¬μš©ν•˜μ—¬ μž‘μ„±ν•©λ‹ˆλ‹€. λ‚΄ μ½”λ“œμ—μ„œλŠ” 10개 쀑 9개 μ΄μƒμ˜ ν•¨μˆ˜κ°€ 비동기식이라고 μƒκ°ν•©λ‹ˆλ‹€... μ–΄λ–€ κ²½μš°μ—λŠ” "λ§Œμ•½μ— λŒ€λΉ„ν•˜μ—¬"μž…λ‹ˆλ‹€. 비동기 κΈ°λŠ₯을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것은 λͺ¨λ“  비동기 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ κ°‘μžκΈ° μ™„μ „νžˆ μ•‘μ„ΈμŠ€ν•  수 μ—†λ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

b) 일반 컨트둀러 κΈ°λŠ₯. λ‚˜λŠ” λ‹€μŒκ³Ό 같이 μ£Όμž₯ν•©λ‹ˆλ‹€.

    {{#query "select name, total from summary"}}
          <tr><td>{{this.name}}</td><td>{{this.total}}</td></tr>
    {{/query}}

ν•΄λ‹Ή ν•­λͺ©μ„ λ³€μˆ˜μ— 집어넣고 ν…œν”Œλ¦ΏμœΌλ‘œ μ „λ‹¬ν•˜λŠ” λ§žμΆ€ν˜• 컨트둀러 κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” 것과 비ꡐ할 λ•Œ ν…œν”Œλ¦Ώμ΄ μ•Œκ³  μ•‘μ„ΈμŠ€ν•΄μ•Ό ν•˜λŠ” 것과 비ꡐ할 λ•Œ 더 짧고, κΉ¨λ—ν•˜κ³ , μœ μ§€ κ΄€λ¦¬ν•˜κΈ° 쉽고, 기본적으둜 생각할 수 μžˆλŠ” λͺ¨λ“  λ©΄μ—μ„œ μ›”λ“±ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰