.. index:: single: Templating; hinclude.js How to Embed Asynchronous Content with hinclude.js ================================================== :ref:`Embedding controllers in templates ` is one of the ways to reuse contents across multiple templates. To further improve performance you can use the `hinclude.js`_ JavaScript library to embed controllers asynchronously. First, include the `hinclude.js`_ library in your page :ref:`linking to it ` from the template or adding it to your application JavaScript :doc:`using Webpack Encore `. As the embedded content comes from another page (or controller for that matter), Symfony uses a version of the standard ``render()`` function to configure ``hinclude`` tags in templates: .. code-block:: twig {{ render_hinclude(controller('...')) }} {{ render_hinclude(url('...')) }} .. note:: When using the ``controller()`` function, you must also configure the :ref:`fragments path option `. When JavaScript is disabled or it takes a long time to load you can display a default content rendering some template: .. configuration-block:: .. code-block:: yaml # config/packages/framework.yaml framework: # ... fragments: hinclude_default_template: hinclude.html.twig .. code-block:: xml .. code-block:: php // config/packages/framework.php $container->loadFromExtension('framework', [ // ... 'fragments' => [ 'hinclude_default_template' => 'hinclude.html.twig', ], ]); You can define default templates per ``render()`` function (which will override any global default template that is defined): .. code-block:: twig {{ render_hinclude(controller('...'), { default: 'default/content.html.twig' }) }} Or you can also specify a string to display as the default content: .. code-block:: twig {{ render_hinclude(controller('...'), {default: 'Loading...'}) }} .. _`hinclude.js`: http://mnot.github.io/hinclude/