ESX

ECMAScript

The Ecma International
Technical Committee 39

TС39

  1. 1997
  2. 1998
  3. 1999
  4. выбросили
  5. 2009
    1. 2011
  6. 2015
  7. 2016
  1. Strawman (Идея)
  2. Proposal (Предложение)
  3. Draft (Черновик)
  4. Candidate (Кандидат)
  5. Finished (Завершено)

Идея

Может внести член TC39 или
зарегистрированный контрибьютор TC39

  • Pассмотреть на встрече TC39
  • Добавить на страничку со Stage-0

Предложение

  • Должен быть выбран человек,
    формально ответственный за предложение
  • Либо этот человек,
    либо его помошник должен быть членом TC39
  • Должна быть описана проблема, которая решается
  • Должны быть обозначены проблемы,
    которые будут с внесением в спецификацию
  • Примеры, полифилы

Черновик

  • Максимально полное формальное описание,
    но могут быть и todo
  • Нужны две имплементации,
    но одна может быть в транспайлере,
    например Babel

Кандидат

  • Текст спецификации должен быть закончен
  • Назначены рецензенты
  • Редактор спецификации ECMAScript
    должен её подписать
  • Минимум две имплементации

STAGE 1
STAGE 2
STAGE 3

QRCODE cо ссылкой на Stage 1-3

http://github.com/tc39/proposals

Завершено

  • Тесты
  • Две имплементации которые их проходят
  • Опыт использования имплементаций
  • Редактор спецификации ECMAScript
    должен её подписать
  • V8 — Chrome, Chromium, Node.js, Opera, Electron, …
  • SpiderMonkey — Firefox
  • JavaScriptCore — Safari
  • Chakra — IE

Допустим, но зачем?

Сравните
cкорость

Сравнение быстродействия нативных функций и jQuery

QRCODE cо ссылкой на статью о сравнении скоростей

https://codepen.io/doughensel/post/10-libraries

169.310ms

693.480ms

164.063ms

1 164.516ms

222.696ms

464.386ms

Наши инструменты

Can we?

Yes, we can!

Поддержка ES6 в браузерах

QRCODE cо ссылкой на статью о сравнении скоростей

http://kangax.github.io/compat-table/es6/

Транспайлеры

Babel.js

npm init
npm install --save grunt
npm install --save grunt-babel
npm install --save babel-preset-es2015
npm install --save load-grunt-tasks
vi Gruntfile.js
// Gruntfile.js
module.exports = function (grunt) {
  require("load-grunt-tasks")(grunt);
  grunt.initConfig (
      //…
  );
  grunt.registerTask("default", ["babel"]);
};"
// Gruntfile.js, Задача
{babel: {
  options: {
      sourceMap: true,
      presets: ['babel-preset-es2015']
  },
  dist: {files: [
      //…
  ]}}}
// Gruntfile.js, Пути к файлам, статические
{
  'js/script_1.js': 'js/source/script_1.js',
  'js/script_2.js': 'js/source/script_2.js'
}
// Gruntfile.js, Пути к файлам, динамические
{
      expand: true,
      cwd: 'js/source/',
      src: ['**/*.js'],
      dest: 'js/'
}
# package.info
…
"scripts": {
  "build": "grunt --verbose"
},
…
npm run build
npm install --save grunt-contrib-watch
// Gruntfile.js, Задача
watch: {
  scripts: {
      files: ['js/source/**/*.js'],   
      tasks: ['babel'],
  }
}
// …
grunt.registerTask("dev", ["babel","watch"]);
# package.info
# …
"scripts": {
  "build": "grunt --verbose"
  "watch": "grunt watch --verbose"
},
# …
npm run watch
npm init
npm install --save gulp
npm install --save gulp-sourcemaps
npm install --save gulp-babel
npm install --save babel-preset-es2015
vi gulpfile.js
// gulpfile.js
var gulp = require("gulp");
var sourcemaps = require("gulp-sourcemaps");
var babel = require("gulp-babel");
gulp.task("babel", function () {
  return gulp.src("js/source/**/*.js")
      .pipe(sourcemaps.init())
      .pipe(babel({presets: ['es2015']}))
      .pipe(sourcemaps.write("."))
      .pipe(gulp.dest("js/"));
});
gulp.task("default", ["babel"]);
# package.info
# …
"scripts": {
  "build": "gulp --verbose"
},
# …
npm run build
gulp.task("watch", ["babel"], function() {
  var watcher = gulp.watch('js/source/**/*.js',
                          ['babel']);
});
# package.info
# …
"scripts": {
  "build": "gulp --verbose"
  "watch": "gulp watch --verbose"
},
# …
npm run watch
// moses.js
class Moses {
    constructor () {
        let myPeopleGo = "Moses";
        alert(myPeopleGo);
    }
}
new Moses;
aja project add-module vaimo/themebuilder:dev-develop
cd ./vendor/vaimo/themebuilder/
hg update 0d1c77d
nvm install 6.3.1
npm cache clean
npm install
qrc
script.es6
npm run gulp
qrc
Фотография

Андрей Головин

m2:root/
  package.json
  Gruntfile.js
npm install
npm install --save grunt-babel
npm install --save babel-preset-es2015
composer require demo-vendor/demo-m2-theme
m2:root/
      dev/
          tools/
              grunt/
                  configs/
                      themes.js
                      combo.js
                      babel.js

Magento 2 конфигурация
транспайлера

QRCODE cо ссылкой на файлы конфигурацц

https://goo.gl/GJakUU

// themes.js
dm2: {
        area: 'frontend',
        name: 'demo-vendor/demo-m2-theme',
        locale: 'en_US',
        files: ['css/styles-m','css/styles-l'],
        dsl: 'less'
        // …
    },
// themes.js, конфиг babel.js
babelFiles: [{
    expand: true,
    cwd: 'js/source/',
    src: ['**/*.js'],
    dest: 'js/'
}]
// combo.js
var theme = require('./themes'),
    path = require('./path'),
    refine_path = function (theme, file_path) {
      return path.pub +
          theme.area + '/' +
          theme.name + '/' +
          theme.locale + '/' + 
          file_path;
    };
// combo.js
babelFiles: function (themeName) {
    var es6Files = [],
        ourTheme = theme[themeName],
        files = ourTheme.babelFiles;
    for (var i = 0; i < files.length; i++) {
        if (typeof files[i].src == "undefined") {
            // static file mapping
        } else {
            // dynamic file mapping
        }
    }
    return es6Files;
},
// combo.js, static file mapping
var path_collection = {};
for (var target in files[i]) {
    path_collection[refine_path(ourTheme, target)] = 
          refine_path(ourTheme, files[i][target]); 
}
es6Files.push(path_collection);
// combo.js, dynamic file mapping
files.cwd = refine_path(ourTheme, files.cwd);
files.dest = refine_path(ourTheme, files.dest);
es6Files.push(files);
// babel.js, переменные
'use strict';
var combo  = require('./combo'),
    themes = require('./themes'),
    _      = require('underscore'),
    themeOptions = {};
// babel.js, пути к файлам
_.each(themes, function(theme, name) {
    if (typeof theme.babelFiles != "undefined") {
        themeOptions[name] = {
            files: combo.babelFiles(name)
        };
    }
});
// babel.js, настройки транспайлера
var babelOptions = {
    options: {
        sourceMap: true,
        presets: ['babel-preset-es2015']
    }
};
// babel.js, экспорт конфигурации
module.exports = _.extend(themeOptions, babelOptions);
php bin/magento setup:static-content:deploy
grunt less:dm2
grunt babel:dm2
php bin/magento cache:flush

Антон Немцев

skype: ravencry

QRCODE cо ссылкой на доклад

https://github.com/SilentImp/ES6Intro