Yeoman 之 Jade自动化生成的Grunt实现

对应GitHub版文章地址:Click Me

Yeoman 是一项能够辅助 Web 开发的生态系统,可以将开发高效地流程化,极大的减少人力成本,尤其是在 Angular.JS 的开发中。

Yeoman LOGO

文档

官方网站

使用教程

安装

在Node中安装Jade的方法如下:

  • npm install -g yo

本文假定读者已经了解 Yeoman 的基本功能并且正在使用,并且希望使用 Jade 模版引擎。关于 Jade 的使用语法方面,请参加上一篇文章[Jade —— 简洁的HTML模版引擎]({% post_url 2014-08-03-Jade_简洁的HTML模版引擎 %})

本文中假定读者已经具有一个 Yeoman 项目了,对于如何使用 Yeoman 建立项目不再详述。


使用详解

相信大家都已经看过 Jade 的官方文档了,但是很不幸,官方的使用方法是针对 Node.js 的,并没有说明如何在 Yeoman 中使用,也就是使用 Grunt 作为服务器的相关配置。

1. 程序包安装

对于 Yeoman 项目,我们要安装的并不是官方的 Jade.js ,而是一个 Grunt 插件:grunt-contrib-jade。

打开控制台,进入到当前项目文件夹,输入:

npm install grunt-contrib-jade --save-devnpm install grunt-contrib-jade -D

其中,--save-dev 的作用是同时将程序包信息添加到 package.jsondevDependencies 清单中。

2. 在 Gruntfile.js 中添加 jade 命令

打开项目中的 Gruntfile.js 文件,在 grunt.initConfig({ }); 中添加如下代码:

jade: {
  compile: {
    options: {
      client: false,
      pretty: true
    },
    files: [{
      cwd: "<%= yeoman.app %>/views",
      src: "*.jade",
      dest: ".tmp/views",
      expand: true,
      ext: ".html"
    }]
  }
},

其中要保证 jade: {grunt.initConfig({ 的下一级缩进上,与其他命令的先后顺序可以任意,最好不要放在 watch 的前面。

上面的命令中 cwd 指的是 current work directory,相当于 URL 中 host 的作用。 cwdsrc 的组合就是 .jade 文件的实际路径。在本例中,只处理 app/views/ 下的所有 .jade 文件。

如果不止在 views 文件夹中,而是在整个 app 文件夹下都有 .jade 文件(如含有index.jade),就应该写成:

jade: {
  compile: {
    options: {
      client: false,
      pretty: true
    },
    files: [{
      cwd: "<%= yeoman.app %>",
      src: "{,*/}*.jade",
      dest: ".tmp",
      expand: true,
      ext: ".html"
    }]
  }
},

其中 {,*/} 表示任意级子目录,这样对于 app 目录下及更下的任何 .jade 都能被处理。

另外需要注意的是,生成的 .html 文件和原有的 .jade 文件是一一对应的,除后缀名外的文件名保持不变。.html 文件对于 dest 的相对路径就等于 .jade 模版对于 cwd 的相对路径,因此后面一种形式更方便理解。(即原来 .jade 模版在 app 文件夹中放哪生成的 .html 页面就在 .tmp 文件夹中放哪,具体路径规则还要看自己的路由配置,多试试也就明白了噻~)

3. 在 serve 和 build 任务中添加 jade 命令

Gruntfile.js 中找到 servebuild 任务(默认应该在最底部位置),在命令序列中加入 jade 如下:

grunt.registerTask('serve', 'Compile then start a connect web server', function (target) {
  if (target === 'dist') {
    return grunt.task.run(['build', 'connect:dist:keepalive']);
  }

  grunt.task.run([
    'clean:server',
    'wiredep',
    'jade',
    'concurrent:server',
    'connect:livereload',
    'watch'
  ]);
});

不同版本可能略有差异,特别注意, jade 命令必需在 clean:server 之后,不然你刚生成就被自动清理掉了。

build 任务的部分也十分相似:

grunt.registerTask('build', [
  'clean:dist',
  'jade',
  'wiredep',
  'useminPrepare',
  'concurrent:dist',
  'concat',
  'ngmin',
  'copy:dist',
  'cdnify',
  'cssmin',
  'uglify',
  'filerev',
  'usemin',
  'htmlmin'
]);

这里除了必须在 'clean:dist' 之后以外,还必需要在 'useminPrepare' 之前,当然,后面还需要改动一些其他的命令。

4. 在 watch 命令中增加配置命令

在 watch 中进行配置的作用在于自动监视更改,即可以实现在 .jade 模版发生变更后实时更新对应生成的 .html ,不是必须,但胜似必需,除非自己愿意每修改一次文件就要重新用一次 grunt serve

grunt.initConfig({ }) 中找到 watch: { } ,与上一部分中的 jade: {} 是同级缩进。接着在 watch: { } 中,再添加一个小小的 jade: {} 命令。看起来有点凌乱,不过此 jade 非彼 jade ,具体代码如下:

watch: {
  jade: {  
    files: ['<%= yeoman.app %>/{,*/}*.jade'],  
    tasks: ['jade']  
    }, 
  //很多其他指令
}

这里的路径规则和上面是一样的,添加了这段代码后,就会在任何一个 .jade 文件更改的时候执行第2步中的 jade 命令了。

也并非一定要放在 watch 中的第一个,但把自定义的内容放在醒目位置方便修改还是比较好的。

5. 修正其他命令中的 html 路径

如果现在执行就已经可以正常运行网站了,但如果执行 grunt build ,就会发现 dist 文件夹中找不到生成的 html 文件,为此,我们需要进行一些其他的调整。

找到如下的命令,没有改动前的版本应该如下所示:

useminPrepare

useminPrepare: {
  html: '<%= yeoman.app %>/index.html',
  options: {
    dest: '<%= yeoman.dist %>',
    flow: {
      html: {
        steps: {
          js: ['concat', 'uglifyjs'],
          css: ['cssmin']
        },
        post: {}
      }
    }
  }
},

html: '<%= yeoman.app %>/index.html', 改为 html: '.tmp/index.html' 即可。(如果用了 index.jade 来生成 index.html 的话才要用,不要有木有都滥用啊。)

另外,找到 copy:dist 命令如下:

copy:dist

copy: {
  dist: {
    files: [{
      expand: true,
      dot: true,
      cwd: '<%= yeoman.app %>',
      dest: '<%= yeoman.dist %>',
      src: [
        '*.{ico,png,txt}',
        '.htaccess',
        '*.html',
        'views/{,*/}*.html',
        'images/{,*/}*.{webp}',
        'fonts/*'
      ]
    }, {
      expand: true,
      cwd: '.tmp/images',
      dest: '<%= yeoman.dist %>/images',
      src: ['generated/*']
    }, {
      expand: true,
      cwd: 'bower_components/bootstrap/dist',
      src: 'fonts/*',
      dest: '<%= yeoman.dist %>'
    }]
  },
  styles: {
    expand: true,
    cwd: '<%= yeoman.app %>/styles',
    dest: '.tmp/styles/',
    src: '{,*/}*.css'
  }
},

将其改为(增加一个小节):

copy: {
  dist: {
    files: [{
      expand: true,
      dot: true,
      cwd: '<%= yeoman.app %>',
      dest: '<%= yeoman.dist %>',
      src: [
        '*.{ico,png,txt}',
        '.htaccess',
        '*.html',
        'views/{,*/}*.html',
        'images/{,*/}*.{webp}',
        'fonts/*'
      ]
    }, {
      expand: true,
      cwd: '.tmp',
      dest: '<%= yeoman.dist %>',
      src: ['{,*/}*.html']
    }, {
      expand: true,
      cwd: '.tmp/images',
      dest: '<%= yeoman.dist %>/images',
      src: ['generated/*']
    }, {
      expand: true,
      cwd: 'bower_components/bootstrap/dist',
      src: 'fonts/*',
      dest: '<%= yeoman.dist %>'
    }]
  },
  styles: {
    expand: true,
    cwd: '<%= yeoman.app %>/styles',
    dest: '.tmp/styles/',
    src: '{,*/}*.css'
  }
},

之后就能够正常的 grunt build 了。

另外,也有的教程中直接修改了 htmlmin 从而直接从 .tmp 文件夹中生成到 dist 文件夹,更加快捷。读者可以根据需要自行选择。


本站地址: http://trotyl.github.io/

posted @ 2014-08-04 17:10  Trotyl  阅读(510)  评论(0编辑  收藏  举报