Wix Gruntfile

Making the most out of Grunt

Commands You need To Know

  • grunt serve
    • runs a local dev server
  • grunt serve:coverage
    • run a local dev server with coverage (hard to debug)
  • grunt serve:dist
    • run a local server against built code (concat/minified)
  • grunt build
    • build the project (and run protractor against built code)
  • grunt test:e2e
    • run protractor against running server (dev or dist)

Grunt Serve

  • Check code style rules
  • Pre-build files
  • Run unit tests
  • Create local "app" server
  • Repeat after each save
  • Run protractor manually against dev server using "grunt test:e2e"

Grunt Build

  • Check code style rules
  • Pre-build files
  • Run unit tests
  • Concat & Minify
  • Update html tags
  • Create local "dist" server
  • Run protractor against "dist" server (in CI use Sauce Labs)

Check Code Style Rules

  • Tools: jshint, jscs, scsslint
  • Will fail the build!
  • Add plugins to your IDE
  • Delete linter config if   you don't want it

Pre Build Files

  • scss -> css, sprites (+ autoprefixer)
  • haml -> html
  • svg -> font, css
  • json -> js (translations)
  • json -> js (specs, soon)
  • typescript -> javascript
  • and... vm -> html
  • replace.conf.js
  • replace.private.conf.js
  • real velocity - soon

Local Dev Server

app/

    scripts/

    styles/

    views/

    index.vm

.tmp/ (pre-build products)

    scripts/

    styles/

    views/

    index.html

http://localhost:9000/

/_api/*      (not in e2e)

/*

/*

http://local.pizza.wixpress.com:9000/ (for the cookies)

You can add your own rules, it's easy!

Concat And Minify

<!-- build:css({.tmp,app}) styles/main.css -->
<link rel="stylesheet" href="styles/main.css">
<link rel="stylesheet" href="styles/first-time.css">
<!-- endbuild -->
<!-- build:js({.tmp,app}) scripts/scripts.js -->
<script src="scripts/app.js"></script>
<script src="scripts/controllers/main.js"></script>
<!-- endbuild -->
<!-- build:locale({.tmp,app}) scripts/messages_${locale}.js -->
<script src="scripts/locale/messages_${locale}.js"></script>
<script src="scripts/locale/countries_${locale}.js"></script>
<!-- endbuild -->

CSS blocks

JS blocks

Translation blocks

Concat And Minify - Angular

(function () {
  /* @ngInject */
  function MyCtrl($http, $q) {
    ...
  }
  
  angular.module('myApp')
    .controller('MyCtrl', MyCtrl);
})();
(function () {
  function MyCtrl($http, $q) {
    ...
  }
  MyCtrl.$inject = ['$http', '$q'];
  
  angular.module('myApp')
    .controller('MyCtrl', MyCtrl);
})();

Before

After

<div>my-view</div>
angular.module('myAppInternal')
  .run(function($templateCache) {
    $templateCache.put(
      'views/my-view.preload.html',
      "<div>my-view</div>");
  });

views/my-view.preload.html

templates.js (automatically concatenated to scripts/scripts.js)

Update HTML Tags

<!-- process-tags prefix('${staticsUrl}') -->
<!-- build:js({.tmp,app}) scripts/scripts.js -->
<script src="scripts/app.js"></script>
<script src="scripts/controllers/main.js"></script>
<!-- endbuild -->
<!-- end-process-tags -->
<!-- #if( !${debug} ) -->
<script src="${staticsUrl}scripts/scripts.js"></script>
<!-- #else -->
<script src="${staticsUrl}_debug/scripts/app.js"></script>
<script src="${staticsUrl}_debug/scripts/controllers
  /main.js"></script>
<!-- #end -->

Tags are replaced with their concat/minified version (with debug option)

Becomes this:

Update HTML Tags

<script src="bower_components/angular/angular.js"></script>
<script src="${staticBaseUrl}services/third-party/angularjs
  /1.2.28/angular#if(!${debug}).min#{end}.js"></script>

Tags for popular libraries are replaced with references to Wix CDN in order to cache across applications (with debug option)

Becomes this:

Note that Wix CDN is sometimes a bit behind, so you might get Angular 1.2.28 although 1.2.29 was already released

Your Actual Gruntfile



module.exports = function (grunt) {
  require('wix-gruntfile')(grunt, {
    port: 9000,                              //port used by local server
    preloadModule: 'myAppInternal',          //module name for preload html
    translationsModule: 'myAppTranslations', //module name for translation js
    svgFontName: 'my-app',                   //font name for svg icons
    karmaConf: require('./karma.conf.js'),   //inheriting your karma config
    protractor: true                         //should run e2e tests
  });

  grunt.modifyTask('yeoman', {
    api: 'http://www.pizza.wixpress.com/_api/', //the proxied _api
    e2eTestServer: 'http://localhost:3333/', //the proxied _api in e2e
    local: 'http://local.pizza.wixpress.com:9000/' //url opened in grunt serve
  });

  //override sauce labs browser list
  //process.env.SAUCE_BROWSERS = 'Chrome FF';

  //Follow this URL for instructions on how to override built-in definitions:
  //https://github.com/wix/wix-gruntfile/blob/master/README.md
};

How Can We Be Better?

  • Add support for es6 modules
  • Add typescript support for e2e tests
  • Allow to opt-out of typescript and use babel
  • Get source maps to work correctly
  • Add support for react projects
  • Add support for experiments and bi generated code
  • Do less local customizations and more pull requests
  • All of this and more in...

Wix-Gruntfile Heroes

Questions???

wix-gruntfile

By Shahar Talmi

wix-gruntfile

  • 1,969