EDIT : Cette réponse est ancienne et périmée. Je la supprimerais bien, mais c'est la réponse "acceptée". Je vais injecter mon opinion à la place.
Je ne préconise plus de faire cela. À la place, je séparerais tous les modèles en fichiers HTML individuels. Certains suggèrent de les charger de manière asynchrone (Require.js ou une sorte de cache pour les modèles). Cela fonctionne bien sur les petits projets mais sur les gros projets avec beaucoup de modèles, vous vous retrouvez à faire une tonne de petites requêtes asynchrones au chargement de la page, ce que je n'aime vraiment pas. (ugh... ok, vous pouvez contourner cela avec Require.js en pré-compilant vos dépendances initiales avec r.js, mais pour les templates, cela me semble toujours erroné)
J'aime utiliser une tâche grunt (grunt-contrib-jst) pour compiler tous les modèles HTML dans un seul fichier templates.js et l'inclure. Vous obtenez le meilleur de tous les mondes, selon moi... les modèles sont dans un fichier, la compilation de ces modèles se fait au moment de la construction (et non de l'exécution), et vous n'avez pas cent petites requêtes asynchrones au démarrage de la page.
Tout ce qui est en dessous est de la camelote
Pour ma part, je préfère la simplicité d'inclure un fichier JS avec mon modèle. Ainsi, je peux créer un fichier appelé view_template.js qui inclut le modèle en tant que variable :
app.templates.view = " \
<h3>something code</h3> \
";
Ensuite, il suffit d'inclure le fichier script comme un fichier normal et de l'utiliser dans votre vue :
template: _.template(app.templates.view)
En allant un peu plus loin, je en fait utiliser coffeescript, donc mon code ressemble plus à ceci et évite les caractères d'échappement de fin de ligne :
app.templates.view = '''
<h3>something code</h3>
'''
Cette approche permet d'éviter d'introduire require.js là où il n'est pas vraiment nécessaire.