λμ°λ―Έλ₯Ό Sync λλ Asyncλ‘ λ±λ‘νλ©΄ μ½λ°±μ μμ λκΈ°νκ³ μ½λ°±μμ λ°μ΄ν°λ₯Ό κ°μ Έμ€λ λ° λμμ΄ λ©λλ€.
μ΄κ²μ κ³Όκ±°μ λνλ¬μ§λ§ μ¬μ© μ¬λ‘κ° λͺ ννμ§ μμ μ‘°μΉλ₯Ό μ·¨νμ§ μμμ΅λλ€. νΈλ€λ°λ μ¬μ ν λͺ¨λ λ°μ΄ν°λ₯Ό λ λλ§μ μ¬μ©ν μ μμ λκΉμ§ κΈ°λ€λ €μΌ νλ―λ‘ λΉλκΈ° νκ°λ₯Ό μ 곡νλ κ²μ 컨ν μ€νΈλ₯Ό μμ±νλ μ½λκ° ν¨μ¬ λ ν¨μ¨μ μΈ λ°©μμΌλ‘ μνν μ μλ μμ μ λν νΈμμ λλ€.
κΈ°λ³Έμ μΌλ‘ μ΄ μμ μμ λΉλκΈ° νκ°λ₯Ό μΆκ°νλ κ²μ νΈνμ±κ³Ό λ°νμ μ±λ₯ λ©΄μμ μλΉν λΉμ κ²μ λλ€. λΉμ μ΄ νλ €λ μΌμ λν ꡬ체μ μΈ μκ° μμ΅λκΉ?
μ±λ₯ λ¬Έμ μ λμνμ§λ§ 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"(μ, λͺ) μΌνΈλ₯Ό κ³ λ €ν μ μμ΅λλ€.
μ μ©νκ² μ¬μ©ν μ μλ λ λμ μλ₯Ό μ 곡ν μ μμ΅λλ€.
μ°λ¦¬λ λͺ¨λ°μΌ μ ν리μΌμ΄μ
μ μν΄ 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}}
ν΄λΉ νλͺ©μ λ³μμ μ§μ΄λ£κ³ ν νλ¦ΏμΌλ‘ μ λ¬νλ λ§μΆ€ν 컨νΈλ‘€λ¬ κΈ°λ₯μ μ¬μ©νλ κ²κ³Ό λΉκ΅ν λ ν νλ¦Ώμ΄ μκ³ μ‘μΈμ€ν΄μΌ νλ κ²κ³Ό λΉκ΅ν λ λ μ§§κ³ , κΉ¨λνκ³ , μ μ§ κ΄λ¦¬νκΈ° μ½κ³ , κΈ°λ³Έμ μΌλ‘ μκ°ν μ μλ λͺ¨λ λ©΄μμ μλ±ν©λλ€.
κ°μ₯ μ μ©ν λκΈ
express-hbsλ₯Ό μλν΄ λ³Ό μμ μ΄μ§λ§ 2018λ μλ μ§μνμ§ μλ κ²μ΄ μ΄μν μΌμ΄λΌκ³ μκ°ν©λλ€. λΉλκΈ° μμ μ΄ λ·°μ μΌλΆλ‘ μνλμ΄μλ μ λλ©° λμ 컨νΈλ‘€λ¬λΌλ λ§λ² κ°μ μμ μμ μνλμ΄μΌ νλ€λ μμν κ΄μ μ΄ μλ€λ κ²μ μκ³ μμ΅λλ€(MVCκ° μ΄λ»κ²λ νλ¦Όμμ΄ "μ¬λ°λ₯Έ" κ²μ²λΌ). μμΈ
a) μΈλΆ λΌμ΄λΈλ¬λ¦¬ - λλΆλΆμ μ¬λλ€μ μ΄μ μμ ν async/awaitλ₯Ό μ¬μ©νμ¬ μμ±ν©λλ€. λ΄ μ½λμμλ 10κ° μ€ 9κ° μ΄μμ ν¨μκ° λΉλκΈ°μμ΄λΌκ³ μκ°ν©λλ€... μ΄λ€ κ²½μ°μλ "λ§μ½μ λλΉνμ¬"μ λλ€. λΉλκΈ° κΈ°λ₯μ μ§μνμ§ μλλ€λ κ²μ λͺ¨λ λΉλκΈ° λΌμ΄λΈλ¬λ¦¬κ° κ°μκΈ° μμ ν μ‘μΈμ€ν μ μλ€λ κ²μ μλ―Έν©λλ€.
b) μΌλ° 컨νΈλ‘€λ¬ κΈ°λ₯. λλ λ€μκ³Ό κ°μ΄ μ£Όμ₯ν©λλ€.
ν΄λΉ νλͺ©μ λ³μμ μ§μ΄λ£κ³ ν νλ¦ΏμΌλ‘ μ λ¬νλ λ§μΆ€ν 컨νΈλ‘€λ¬ κΈ°λ₯μ μ¬μ©νλ κ²κ³Ό λΉκ΅ν λ ν νλ¦Ώμ΄ μκ³ μ‘μΈμ€ν΄μΌ νλ κ²κ³Ό λΉκ΅ν λ λ μ§§κ³ , κΉ¨λνκ³ , μ μ§ κ΄λ¦¬νκΈ° μ½κ³ , κΈ°λ³Έμ μΌλ‘ μκ°ν μ μλ λͺ¨λ λ©΄μμ μλ±ν©λλ€.