Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

Handlebars plugin for gulp

License

NotificationsYou must be signed in to change notification settings

lazd/gulp-handlebars

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

99 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Handlebars plugin for gulp

Usage

Installgulp-handlebars as a development dependency:

npm install --save-dev gulp-handlebars

VERSION MISMATCH ERROR?!

Are you seeing this error when using pre-compliled templates?

Error: Template was precompiled with an older version of Handlebars

If you're getting a version mismatch error when using pre-compliled templates,install the handlebars version of your choice and pass it asoptions.handlebars, then include the appropriate runtime in your client-side application.

Here's how you install your own version of handlebars:

npm install --save handlebars@^4.0.0

And here's how you use that verison of handlebars ingulp-handlebars:

handlebars({handlebars:require('handlebars')})

The runtime is located in:

node_modules/handlebars/dist/handlebars.js

Compiling templates for the browser

gulp-declare andgulp-wrap can be used to safely declare template namespaces and make templates available for use in the browser.

First, install development dependencies:

npm install --save-dev gulp-handlebars gulp-wrap gulp-declare gulp-concat

Given the following directory structure:

├── gulpfile.js              # Your gulpfile└── source/                  # Your application's source files    └── templates/           # A folder containing templates named with dot notation        └── home.header.hbs  # A template that will be available as MyApp.templates.home.header

To compile all templates insource/templates/ tobuild/js/templates.js under theMyApp.templates namespace:

gulpfile.js

varhandlebars=require('gulp-handlebars');varwrap=require('gulp-wrap');vardeclare=require('gulp-declare');varconcat=require('gulp-concat');gulp.task('templates',function(){gulp.src('source/templates/*.hbs').pipe(handlebars()).pipe(wrap('Handlebars.template(<%= contents %>)')).pipe(declare({namespace:'MyApp.templates',noRedeclare:true,// Avoid duplicate declarations})).pipe(concat('templates.js')).pipe(gulp.dest('build/js/'));});

The template's filename is combined with the namespace, so the resultingbuild/js/templates.js would look like:

this["MyApp"]=this["MyApp"]||{};this["MyApp"]["templates"]=this["MyApp"]["templates"]||{};this["MyApp"]["templates"]["home"]=this["MyApp"]["templates"]["home"]||{};this["MyApp"]["templates"]["home"]["header"]=Handlebars.template(function(){/* compiled template function */});

Namespace templates according to nested directories

See thenamespaceByDirectory example if you'd like to compile templates with a mapping that looks like this:

File pathNamespace path
source/templates/App.hbsMyApp.templates.App
source/templates/App/header.hbsMyApp.templates.App.header
source/templates/App/footer.hbsMyApp.templates.App.footer
source/templates/Other.item.hbsMyApp.templates.Other.item

Compiling to various module systems

See thegulp-define-module documentation for details on how to define templates as AMD, Node, CommonJS, and hybrid modules.

See theamd example for a full example of compiling templates to AMD modules.

gulp-handlebars makes the following available for use ingulp-define-module'swrapper template option:

  • <%= handlebars %> - The Handlebars template, wrapped in a call toHandlebars.template()
  • <%= contents %> - The bare Handlebars template (not wrapped).

gulp-handlebars also sets a defaultoptions.require of{ Handlebars: 'handlebars' } forgulp-define-module so Handlebars will be present in when defining AMD, Node, CommonJS, or hybrid modules. You can change this by passing a differentoptions.require when you invokegulp-define-module.

Compiling partials

The following example will precompile and register partials for all.hbs files insource/partials/, then store the result asbuild/js/partials.js;

varpath=require('path');vargulp=require('gulp');varwrap=require('gulp-wrap');varconcat=require('gulp-concat');varhandlebars=require('gulp-handlebars');gulp.task('partials',function(){// Assume all partials are in a folder such as source/partials/**/*.hbsgulp.src(['source/partials/**/*.hbs']).pipe(handlebars()).pipe(wrap('Handlebars.registerPartial(<%= processPartialName(file.relative) %>, Handlebars.template(<%= contents %>));',{},{imports:{processPartialName:function(fileName){// Strip the extension and the underscore// Escape the output with JSON.stringifyreturnJSON.stringify(path.basename(fileName,'.js'));}}})).pipe(concat('partials.js')).pipe(gulp.dest('build/js/'));});

See thepartials example for a full example that compiles partials and templates down to a single file.

Compiling using a specific Handlebars version

You can use different versions of Handlebars by specifying the version in yourpackage.json and passing it asoptions.handlebars:

package.json

{"devDependencies": {"handlebars":"^1.3.0"  }}

gulpfile.js

gulp.task('templates',function(){gulp.src('source/templates/*.hbs').pipe(handlebars({handlebars:require('handlebars')})).pipe(wrap('Handlebars.template(<%= contents %>)')).pipe(declare({namespace:'MyApp.templates',noRedeclare:true,// Avoid duplicate declarations})).pipe(concat('templates.js')).pipe(gulp.dest('build/js/'));});

The runtime you include on the client side MUST match the version you compile templates with. You cannot use the the 2.x runtime with 1.x templates. Thehandlebars1 example copies the runtime fromnode_modules/handlebars/dist/handlebars.runtime.js and uses that on the client side. Follow a similar pattern in your application to keep the runtime up to date with the compiler.

Compiling to separate modules for Node/Browserify

This example will make templates available for loading viaNode's require:

gulpfile.js

varhandlebars=require('gulp-handlebars');vardefineModule=require('gulp-define-module');gulp.task('templates',function(){gulp.src(['templates/*.hbs']).pipe(handlebars()).pipe(defineModule('node')).pipe(gulp.dest('build/templates/'));});

Templates can then be used within Node as such:

varappTemplate=require('./build/templates/App.Header.js');varhtml=appTemplate(data);

Compiling to a single module for use in Node/Browserify

See thesingleModule example if you'd like to have a single module that contains all of your templates that can be used like so:

yourApp.js

vartemplates=require('./templates');varoutput=templates.App.header();

Processing the generated template AST

The example below removes any partial and replaces it with the textfoo.

gulpfile.js

handlebars({processAST:function(ast){ast.statements.forEach(function(statement,i){if(statement.type==='partial'){ast.statements[i]={type:'content',string:'foo'};}});}})

Using HTMLBars with Ember

See theember-htmlbars example for details

handlebars({handlebars:emberHandlebars,compiler:emberTemplateCompilerFunction})

API

handlebars(options)

options.compilerOptions

Type:Object

Compiler options to pass toHandlebars.precompile().

options.processAST

Type:Function

A function which will be passed the parsed Handlebars Abstract Syntax Tree. You can modify the AST in place or return a new AST to change the source of the precompiled template.

options.handlebars

Type:Object

Handlebars library to use for precompilation. By default, the latest stable version of Handlebars is used.

options.compiler

Type:Function

Custom compiler function. By default, the precompile method of the provided Handlebars module is used (seeoptions.handlebars).


[8]ページ先頭

©2009-2025 Movatter.jp