Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[RubyConf Brazil 2015] Front-end tooling - Porque e como?

[RubyConf Brazil 2015] Front-end tooling - Porque e como?

Talysson de Oliveira Cassiano

September 19, 2015
Tweet

More Decks by Talysson de Oliveira Cassiano

Other Decks in Programming

Transcript

  1. (•_•) Testes Styleguide Minificação Dependências Transpilação Precompilação Lint jquery. plugin2.css

    script.js jquery. plugin2.js jquery.js style.css jquery. plugin.js Sprites
  2. (•□•) Testes Styleguide Minificação Dependências Sprites Transpilação Precompilação Lint Modularização

    jquery. plugin2.css script.js jquery. plugin2.js jquery.js style.css jquery. plugin.js
  3. (」゜ロ゜)」 Escrever código → Copiar dependência para a pasta →

    Copiar código todo pro minificador Tentar executar → Falhar miseravelmente → Testar na mão Corrigir o código → Esquecer de adicionar dependência → → Atualizar dependência → Resolver conflito De dependência → → Entrar em desespero → Ir vender arte na praia → →
  4. Vantagens • Redução de erro humano • Maior produtividade •

    Criação de um fluxo de desenvolvimento • Aplicações mais confiáveis
  5. Tooling • Gerenciadores de dependência • Transpilers, preprocessors e bundlers

    • Scaffolders e generators • Task runners e builders • Test runners, linters, minifiers, etc.
  6. Gerenciadores de dependência • Dependências explícitas • Fácil versionamento (teoricamente

    (^-^;) ) • Dependências não precisam fazer parte do codebase
  7. Exemplo: npm + package.json { "name": "front-end-tooling", "version": "1.0.0", "description":

    “Front-end tooling", "main": "index.js", "dependencies": { "jquery": "^2.1.4", "lodash.template": "^3.6.2" }, "devDependencies": { "browserify": "^11.0.0" } }
  8. Exemplo: npm + package.json + npm install { "name": "front-end-tooling",

    "version": "1.0.0", "description": “Front-end tooling", "main": "index.js", "dependencies": { "jquery": "^2.1.4", "lodash.template": "^3.6.2" }, "devDependencies": { "browserify": "^11.0.0" } }
  9. Exemplo: npm + package.json + npm install = ~(*0*)~ {

    "name": "front-end-tooling", "version": "1.0.0", "description": “Front-end tooling", "main": "index.js", "dependencies": { "jquery": "^2.1.4", "lodash.template": "^3.6.2" }, "devDependencies": { "browserify": "^11.0.0" } }
  10. Transpilers, preprocessors e bundlers • Código mais organizado • Maior

    programmer experience • Maior manutenibilidade
  11. Exemplo: Browserify • Permite módulos no padrão CommonJS executáveis no

    browser • Utiliza pacotes do npm como dependências • Remove a necessidade de várias tags script • npm install –g browserify app.js React + Immutable +
  12. Exemplo: Browserify app.js React + Immutable + + browserify app.js

    • Permite módulos no padrão CommonJS executáveis no browser • Utiliza pacotes do npm como dependências • Remove a necessidade de várias tags script • npm install –g browserify
  13. Exemplo: Browserify app.js React + Immutable + + browserify app.js

    = bundle.js (*0*) • Permite módulos no padrão CommonJS executáveis no browser • Utiliza pacotes do npm como dependências • Remove a necessidade de várias tags script • npm install –g browserify
  14. Exemplo: SASS • Possibilita escrita de CSS com uso de

    variáveis • Aninhamento de seletores • Funções e mixins • Permite usar pacotes do npm como dependências • npm install –g node-sass style.scss Foundation + React-Modal +
  15. Exemplo: SASS style.scss Foundation + React-Modal + node-sass + style.scss

    style.css • Possibilita escrita de CSS com uso de variáveis • Aninhamento de seletores • Funções e mixins • Permite usar pacotes do npm como dependências • npm install –g node-sass
  16. Exemplo: SASS style.scss Foundation + React-Modal + node-sass + style.scss

    style.css = style.css (*0*) • Possibilita escrita de CSS com uso de variáveis • Aninhamento de seletores • Funções e mixins • Permite usar pacotes do npm como dependências • npm install –g node-sass
  17. Exemplo: Babel • Compila JavaScript ES6 para JavaScript ES5 •

    Adiciona somente funcionalidades que possuem polyfill • npm install –g babel
  18. Exemplo: Babel var User = (function () { function User()

    { _classCallCheck(this, User); } _createClass(User, [{ key: "construtor", value: function construtor(name) { this.name = name; } }]); return User; })(); = ~(*0*)~ + babel script.js class User { construtor(name) { this.name = name; } }
  19. Scaffolders e generators • Gera código inicial • Gera arquivos

    baseados em padrões (controllers, models...) • Prepara o ambiente • Evita criação de boilerplate na mão
  20. Exemplo: yeoman + generator-flux $ npm install –g yo $

    npm install –g generator-flux + yo flux = ~(*0*)~
  21. Exemplo: yeoman + generator-flux $ npm install –g yo $

    npm install –g generator-flux + yo flux:component MyComponent = ~(*0*)~
  22. Task runners e builders • Organizar tarefas rotineiras • Integrar

    outras ferramentas • Automatizar tarefas • Gerar código final
  23. Exemplo: Gulp + gulpfile.js var gulp = require('gulp'); var sass

    = require('gulp-sass'); var path = require('path'); var cssGlob = 'src/css/**/*.scss'; gulp.task('css', function () { return gulp.src(cssGlob) .pipe(sass({ includePaths: [path.resolve('./node_modules')] }).on('error', sass.logError)) .pipe(gulp.dest('build/css')); }); gulp.task('watch', ['css'], function () { gulp.watch(cssGlob, ['css']); });
  24. Exemplo: Gulp + gulpfile.js + gulp watch var gulp =

    require('gulp'); var sass = require('gulp-sass'); var path = require('path'); var cssGlob = 'src/css/**/*.scss'; gulp.task('css', function () { return gulp.src(cssGlob) .pipe(sass({ includePaths: [path.resolve('./node_modules')] }).on('error', sass.logError)) .pipe(gulp.dest('build/css')); }); gulp.task('watch', ['css'], function () { gulp.watch(cssGlob, ['css']); });
  25. Exemplo: Gulp + gulpfile.js + gulp watch = ~(*0*)~ var

    gulp = require('gulp'); var sass = require('gulp-sass'); var path = require('path'); var cssGlob = 'src/css/**/*.scss'; gulp.task('css', function () { return gulp.src(cssGlob) .pipe(sass({ includePaths: [path.resolve('./node_modules')] }).on('error', sass.logError)) .pipe(gulp.dest('build/css')); }); gulp.task('watch', ['css'], function () { gulp.watch(cssGlob, ['css']); });
  26. Integrando à sua stack • Ferramentas providas pela stack •

    Ferramentas que deixam o desenvolvedor mais confortável/ágil • Independente de qual seja, automatizar de alguma forma
  27. RoR - Dependências Gemfile + Bower = Rails assets source

    'https://rails-assets.org' do gem 'rails-assets-react' gem 'rails-assets-immutable' end
  28. RoR – Transpilers, preprocessors e packers • Geralmente plugins para

    o Sprockets • Transpilers: sprockets-es6, coffee-rails, etc. • Preprocessors: sassc-rails, autoprefixer-rails, etc. • Packers: browserify-rails (sem rails-assets)
  29. RoR – Scaffolders, generators e task runners • Gems geralmente

    já vem com seus próprios scaffolders e tasks do Rake • Exemplo: react-rails: rails g react:component Message content:string
  30. Node.js - Dependências • npm (geralmente JS, no padrão CommonJS)

    • Bower (todo tipo de asset, porém estático)
  31. Node.js – Transpilers, preprocessors e packers • Favorecer ferramentas em

    JavaScript ou compiladas* • Transpilers: babel, coffee-script, typescript • Preprocessors: node-sass*, less, stylus • Packers: browserify, webpack
  32. Laravel - Dependências composer.json + npm + bower = composer-extra-assets

    { "require": { "koala-framework/composer-extra-assets": "~1.1" }, "extra": { "require-npm": { "react": "0.13.3" }, "require-bower": { "bootstrap": "4.0.0" } } }
  33. Laravel – Transpilers, preprocessors, packers e task runners • Laravel

    + Gulp = Elixir elixir(function(mix) { mix.sass('app.scss') .browserify('App.js'); }); • Larasset (semelhante ao do Rails)
  34. Cordova – Dependências, transpilers, preprocessors e packers • Igual ao

    Node.js • Próprio Cordova está no npm • Plugins do Cordova estão no npm
  35. Cordova – Task runner e builder • Cordova hooks •

    Exemplos: after_build, before_compile, etc. • Permite escrever hooks em qualquer linguagem, inclusive JavaScript • Hooks em JavaScript já aceitam o padrão CommonJS • Liberdade para escrever próprias tasks