3

我正在使用 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

4 回答 4

6

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

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

例如:

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

在 JSP 中,我们也有trimDirectiveWhitespaces类似的选项——它们并不完美,但确实有帮助。你的模板系统也可能有这样的东西。

于 2013-11-14T20:13:22.393 回答
1

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

<% _.each(_.where(requires, {shouldApply: true}), function(require){ %>
于 2013-11-14T20:26:39.143 回答
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;

这应该会阻止过剩的产出。

于 2013-11-15T10:10:49.387 回答
0

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

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

'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
      }
    );
  }
});

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

参考:http: //yeoman.io/authoring/file-system.html上的“通过流转换输出文件” 。

于 2016-07-12T20:57:42.537 回答