如何防止underscore.js模板创建不需要的空行?

时间:2013-11-14 19:58:29

标签: javascript node.js templates underscore.js yeoman

我正在使用Yeoman创建一个生成器,而Yeoman又使用了underscore.js模板 在给定的文件中,我有这个代码:

var
    <% _.each(requires, function(require) { %>
    <% if(require.shouldApply) { %>
    <%= _.camelize(require.name) %> = require('<%= require.name %>'),
    <% } %>
    <% }); %>
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;

鉴于require.shouldApply有时是假的,我不希望产生空行。

例如,对于输入requires: [{shouldApply: false, name: 'zoo'}, {shouldApply: false, name: 'foo'}, {shouldApply: true, name: 'bar'}],我得到了这个:

var
    zoo = require('zoo'), //note that the line below is blank

    bar = require('bar'), //I don't want the blank line above
    mongoose = require('mongoose'),
    Schema = mongoose.Schema;

有谁知道如何防止underscore.js模板创建这些不需要的空行?

4 个答案:

答案 0 :(得分:6)

在JSP中,我们有时会使用(讨厌的)将模板标记扩展到下一行的做法来防止这种情况。

它对于可读性并不理想,但它确实解决了“不需要的换行”问题。

例如:

<% if(require.shouldApply) { 
%><%= _.camelize(require.name) %> = require('<%= require.name %>'), 
<% } %>

在JSP中我们也有trimDirectiveWhitespaces和类似的选项 - 这些选项并不完美,但可以提供帮助。你的模板系统也可能有这样的东西。

答案 1 :(得分:1)

您可以尝试减少传入_.each循环的内容,以便只生成应显示的项目。

<% _.each(_.where(requires, {shouldApply: true}), function(require){ %>

答案 2 :(得分:0)

看起来在if语句之外有两行返回将为数组中的每个项生成:

var
<% _.each(requires, function(require) { %> // New Line Here
<% if(require.shouldApply) { %>
<%= _.camelize(require.name) %> = require('<%= require.name %>'),
<% } %> // New Line Here
<% }); %>
mongoose = require('mongoose'),
Schema = mongoose.Schema;

所以,如果你将它们浓缩为:

var <% _.each(requires, function(require) { if(require.shouldApply) { %>
<%= _.camelize(require.name) %> = require('<%= require.name %>'),
<% } }); %>
mongoose = require('mongoose'),
Schema = mongoose.Schema;

这应该可以阻止剩余产出。

答案 3 :(得分:0)

在Yeoman的更新版本中,另一种方法是注册一个流,该流将在生成的工件之后清理多个空白行。这使您可以自由地构建&lt; %%&gt;模板中的代码更自然。

以下示例在转换流中使用gulp-replace。它使用正则表达式来替换所有文件中单换行的双换行符。

&#13;
&#13;
'use strict';
var yeoman = require('yeoman-generator');
var chalk = require('chalk');
var yosay = require('yosay');
var replace = require('gulp-replace');

module.exports = yeoman.Base.extend({

  writing: function() {

    this.registerTransformStream(replace(/\r\n\s*\r\n/g, '\r\n'));

    this.fs.copyTpl(
      this.templatePath('_someTemplate.js'),
      this.destinationPath('someFinalArtifact.js'), {
        nameSpace: nameSpace
      }
    );
  }
});
&#13;
&#13;
&#13;

不要忘记在生成器的package.json中添加gulp-replace。

参考:&#34;通过流转换输出文件&#34;在http://yeoman.io/authoring/file-system.html