Собираем простое MariontteJS+ES6 приложение с помощью Brunch

в 7:03, , рубрики: backbone.js, es2015, ES6, javascript, marionette.js

Здравствуйте. Я хотел бы рассказать как с помощью Brunch можно собрать MariontteJS+ES6 приложение.

Собираем простое MariontteJS+ES6 приложение с помощью Brunch - 1

Сегодня уже 2016-й год и способов собирать приложения очень много. Ниже я предлагаю рассмотреть Brunch

Ставим brunch глобально и генерируем пустой скелет

npm install -g brunch
brunch new

Если не хотите его ставить глобально тогда просто

git clone https://github.com/brunch/dead-simple

Все равно будем запускать brunch с помощью npm.

Теперь нужно сконфигурировать package.json и bower.json.

package.json

{
  "name": "marionette-es6-brunch",
  "description": "Marionette brunch es6 simple app",
  "author": "denar90",
  "version": "0.0.1",
  "license": "MIT",
  "repository": {
    "type": "git",
    "url": "https://github.com/denar90/marionette-es6-brunch"
  },
  "scripts": {
    "postinstall": "./node_modules/.bin/bower install",
    "start": "./node_modules/.bin/brunch w --server"
  },
  "dependencies": {
    "javascript-brunch": "~1.8.0",
    "css-brunch": "~1.7.0",
    "stylus-brunch": "~1.8.1",
    "handlebars-brunch": "~1.9.0",
    "uglify-js-brunch": "~1.7.8",
    "clean-css-brunch": "~1.8.0",
    "jshint-brunch": "~1.8.0",
    "babel-brunch": "~6.0.0",
    "babel-preset-es2015": "~6.3.13",
    "babel-plugin-transform-decorators-legacy": "~1.3.4",
    "bower": "~1.7.2",
    "brunch": "~2.1.0"
  }
}

bower.json

{
  "name": "marionette-es6-brunch",
  "version": "0.0.1",
  "dependencies": {
    "marionette": "~2.4.4",
    "bootstrap": "~3.3.2",
    "core.js": "~2.0.2"
  }
}

Нам особенно интересны эти библиотеки:

  • babel-brunch
  • babel-preset-es2015
  • babel-plugin-transform-decorators-legacy
  • core-js

Именно они делают всю магию с es6.

Перейдем к конфигу самого brunch.

brunch-config.js

exports.config = {
  paths: {
    watched: ['app']
  },
  files: {
    javascripts: {
      defaultExtension: "js",
      joinTo: {
        "javascripts/app.js": /^app/,
        "javascripts/vendor.js": /^bower_components/
      },
      order: {
        before: [
          'bower_components/jquery/dist/jquery.js',
          'bower_components/underscore/underscore.js',
          'bower_components/backbone/backbone.js',
          'bower_components/marionette/lib/backbone.marionette.js',
          'bower_components/bootstrap/dist/js/bootstrap.js'
        ]
      }
    },
    stylesheets: {
      defaultExtension: "styl",
      joinTo: "stylesheets/app.css"
    },
    templates: {
      defaultExtension: "hbs",
      joinTo: "javascripts/app.js"
    }
  },
  plugins: {
    babel: {
      presets: ['es2015'],
      ignore: [
        /^(bower_components|vendor|node_modules)/
      ],
      pattern: /.(es6|jsx)$/,
      plugins: ['babel-plugin-transform-decorators-legacy']
    }
  },
  modules: {
      autoRequire: {
        'javascripts/app.js': ['initialize']
    }
  },
  server: {
    port: 8080,
    run: true
  }
};

Вот строчки которые помогают билдить es6

...
plugins: {
    babel: {
      presets: ['es2015'],
      ignore: [
        /^(bower_components|vendor|node_modules)/
      ],
      pattern: /.(es6|jsx)$/,
      plugins: ['babel-plugin-transform-decorators-legacy']
    }
  }
...

Теперь можно спокойно перейти к коду. Здесь все стандартно: Model, View, и т.д.
Единственный момент на который хотелось бы обратить внимание — это установка атрибутов. Есть несколько способов:

export default class ItemView extends Marionette.ItemView {
    tagName() { return "li"; }

    constructor(options) {
        super(options);
    }
}

export default class ItemView extends Marionette.ItemView.extend({
    tagName: 'li',

    initialize(options) {
    }
});

import { props } from 'decorators';

@props({
    tagName: 'li'
})
export default class ItemView extends Marionette.ItemView {
    initialize(options) {
    }
});

Мне нравится последний способ. Я нашел его здесь

Выполняем

npm start

и наслаждаемся своим творением открыв в браузере localhost:8080/.

Единственное что нам еще нужно — это тесты.
Наши тесты будут лежать в папке specs.

Добавим devDependecies в нашем package.json файле

"devDependencies": {
    "phantomjs": "~1.9.18",
    "coveralls": "~2.11.6",
    "karma": "~0.13.19",
    "karma-es6-shim": "~0.2.3",
    "karma-mocha": "~0.2.1",
    "karma-chai-plugins": "~0.6.1",
    "karma-coverage": "~0.5.3",
    "karma-coveralls": "~1.1.2",
    "karma-phantomjs-launcher": "~0.2.3"
  }

Немножко изменим brunch-config.js

brunch-config.js

exports.config = {
  paths: {
    watched: ['app', 'specs']
  },
  files: {
    javascripts: {
      defaultExtension: "js",
      joinTo: {
        "javascripts/app.js": /^app/,
        "javascripts/specs.js": /^specs/,
        "javascripts/vendor.js": /^bower_components/
      },
      order: {
        before: [
          'bower_components/jquery/dist/jquery.js',
          'bower_components/underscore/underscore.js',
          'bower_components/backbone/backbone.js',
          'bower_components/marionette/lib/backbone.marionette.js',
          'bower_components/bootstrap/dist/js/bootstrap.js',
          'bower_components/es6-shim/es6-shim.js'
        ]
      }
    },
    stylesheets: {
      defaultExtension: "styl",
      joinTo: "stylesheets/app.css"
    },
    templates: {
      defaultExtension: "hbs",
      joinTo: "javascripts/app.js"
    }
  },
  plugins: {
    babel: {
      presets: ['es2015'],
      ignore: [
        /^(bower_components|vendor|node_modules)/
      ],
      pattern: /.(es6|jsx)$/,
      plugins: ['babel-plugin-transform-decorators-legacy']
    }
  },
  modules: {
      autoRequire: {
        'javascripts/app.js': ['initialize']
    }
  },
  server: {
    port: 8080,
    run: true
  },
  overrides: {
    testing: {
      modules: {
        autoRequire: {
          'javascripts/specs.js': ['specs/initialize']
        }
      }
    }
  }
};

Создадим наш

karma.conf.js

module.exports = function(config) {
    config.set({<code>
        browsers: ['PhantomJS'],
        frameworks: ['mocha', 'chai', 'es6-shim'],
        files: [
            "public/javascripts/vendor.js",
            "public/javascripts/app.js",
            "public/javascripts/specs.js"
        ],
        reporters: ['coverage', 'coveralls'],
        preprocessors: {
            'public/javascripts/app.js': 'coverage'
        },
        coverageReporter: {
            type: 'lcov',
            dir: 'coverage/',
            subdir: '.'<a href="https://github.com/denar90/marionette-es6-brunch"></a>
        },
        singleRun: true
    });
};

И добавим еще один скрипт в package.json.

"test": "./node_modules/.bin/brunch b --env testing && ./node_modules/.bin/karma start karma.conf.js"

Для полноты картины сделаем интеграцию с Travis CI.

travis.yml

language: node_js
node_js:
  - '4.0'
after_script:
  - cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js

Весь код можно посмотреть здесь.

Спасибо за внимание.

Автор: denar90

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js