Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to load Handlebars runtime with RequireJS

I'm new to RequireJS and trying to load handlebars precompiled templates with RequireJS. It load the handlebars template and runtime but Handlebars runtime was undefined.

Folders structure

www
 |__index.html
 |__js
    |__main.js
    |__lib
    |    |__jquery-1.10.1.min.js
    |    |__handlebars.runtime-v1.1.2.js
    |    |__require.js
    |__modules
    |    |__content.js
    |__templates
         |__content-tmpl.js     //handlebars precompiled template

index.html

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript" src="js/lib/require.js" data-main="js/main"></script>
</head>
<body>
<div class="header"></div>
<div class="content"></div>
</body>
</html>

main.js

requirejs.config({
    paths:{
        jquery:'lib/jquery-1.10.1.min',
        'handlebars.runtime':'lib/handlebars.runtime-v1.1.2'
    }
});
requirejs(['modules/content','jquery'],function (content,$) {

    $(function(){
        content.initModule();
    });
});

content.js

define(['jquery','../templates/content-tmpl'],function($,template){
    return{
        initModule:function(){
            $('body').append(template());
        }
    }
});

content-tmpl.js (Compiled Handlebars template)

define(['handlebars.runtime'], function (Handlebars) {

//Error raise here. Handlebars is undefined.

    Handlebars = Handlebars["default"];
    var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
    return templates['content'] = template(function (Handlebars, depth0, helpers, partials, data) {
        this.compilerInfo = [4, '>= 1.0.0'];
        helpers = this.merge(helpers, Handlebars.helpers);
        data = data || {};
        return "<div>\r\n    Hello Handlebars and RequireJS\r\n</div>";
    });
});

Console Error

TypeError: Cannot read property 'default' of undefined
like image 480
Thant Sin Aung Avatar asked Dec 25 '13 14:12

Thant Sin Aung


1 Answers

My guess is that handlebars.runtime.js is not an AMD module, so you need to configure it using shim config. In your require.js config add

requirejs.config({
  shim: {
    "handlebars.runtime": {
      exports: "Handlebars"
    }
  }
});

This way, when you call require("handlebars.runtime"), require.js will know to grab window.Handlebars variable and pass it to you after the script has loaded.

like image 170
Karolis Avatar answered Nov 13 '22 02:11

Karolis