SlideShare una empresa de Scribd logo
1 de 79
Descargar para leer sin conexión
Guia de sobrevivência JS
no mundo Open Source
Rio.JS Conference 2013 - Leo Balter
JS no mundo
Open Source?
JS no mundo
Open Source?

JS de terceiros!

    WAT?
Desafio Desenvolvedor

• 1 ambiente
• 1 versão da linguagem
• sem script no nome
Desafio Desenvolvedor
      JavaScript
• Vários ambientes (mobile, desktop,
  geladeira)
 • Chrome, Firefox, Opera
 • IE 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17...
• Qual é mesmo a versão do JS?
JS que funciona em
qualquer site, inclusive
nos que não são seus!
Primeiros perigos
Same Origin Policy

         HTTP     HTTP
        HTTPS     HTTPS
www.foo.com/bla   www.foo.com/bos
Same Origin Policy
     HTTP     HTTPS
    HTTPS     HTTP
bla.foo.com   bos.foo.com
Como driblar o SOP?

• JSONP (Jaydson P)
• CORS (Cross Origin Resource Sharing)
• Post Message    https://developer.mozilla.org/en-US/docs/DOM/window.postMessage



• easyXDM  http://easyxdm.net/wp/
Como se não
 bastasse...
Peraí, um JS de
terceiros está
bloqueando a
 apresentação
Nunca bloquear
páginas alheias
<div id="fb-root"></div>
<script>
  // Load the SDK Asynchronously
  (function(d){
    var js,
           id = 'facebook-jssdk',
           ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
    ref.parentNode.insertBefore(js, ref);
  }(document));
</script>
<div class="fb-like"></div>
<div id="fb-root"></div>
<script>
  // Load the SDK Asynchronously
  (function(d){
    var js,
           id = 'facebook-jssdk',
           ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
    ref.parentNode.insertBefore(js, ref);
  }(document));
</script>
<div class="fb-like"></div>
<div id="fb-root"></div>
<script>
  // Load the SDK Asynchronously
  (function(d){
    var js,
           id = 'facebook-jssdk',
           ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
    ref.parentNode.insertBefore(js, ref);
  }(document));
</script>
<div class="fb-like"></div>
<div id="fb-root"></div>
<script>
  // Load the SDK Asynchronously
  (function(d){
    var js,
           id = 'facebook-jssdk',
           ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
    ref.parentNode.insertBefore(js, ref);
  }(document));
</script>
<div class="fb-like"></div>
<div id="fb-root"></div>
<script>
  // Load the SDK Asynchronously
  (function(d){
    var js,
           id = 'facebook-jssdk',
           ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
    ref.parentNode.insertBefore(js, ref);
  }(document));
</script>
<div class="fb-like"></div>
<div id="fb-root"></div>
<script>
  // Load the SDK Asynchronously
  (function(d){
    var js,
           id = 'facebook-jssdk',
           ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
    ref.parentNode.insertBefore(js, ref);
  }(document));
</script>
<div class="fb-like"></div>
<div id="fb-root"></div>
<script>
  // Load the SDK Asynchronously
  (function(d){
    var js,
           id = 'facebook-jssdk',
           ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
    ref.parentNode.insertBefore(js, ref);
  }(document));
</script>
<div class="fb-like"></div>
<div id="fb-root"></div>
<script>
  // Load the SDK Asynchronously
  (function(d){
    var js,
           id = 'facebook-jssdk',
           ref = d.getElementsByTagName('script')[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement('script'); js.id = id; js.async = true;
    js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
    ref.parentNode.insertBefore(js, ref);
  }(document));
</script>
<div class="fb-like"></div>
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxxx-x']);
  _gaq.push(['_trackPageview']);
  (function() {
    var ga = document.createElement('script');
    ga.type = 'text/javascript';
    ga.async = true;
    ga.src = ('https:' == document.location.protocol ?
              'https://ssl' : 'http://www')
             + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga, s);
  })();
</script>
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxxx-x']);
  _gaq.push(['_trackPageview']);
  (function() {
    var ga = document.createElement('script');
    ga.type = 'text/javascript';
    ga.async = true;
    ga.src = ('https:' == document.location.protocol ?
              'https://ssl' : 'http://www')
             + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga, s);
  })();
</script>
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxxx-x']);
  _gaq.push(['_trackPageview']);
  (function() {
    var ga = document.createElement('script');
    ga.type = 'text/javascript';
    ga.async = true;
    ga.src = ('https:' == document.location.protocol ?
              'https://ssl' : 'http://www')
             + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga, s);
  })();
</script>
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxxx-x']);
  _gaq.push(['_trackPageview']);
  (function() {
    var ga = document.createElement('script');
    ga.type = 'text/javascript';
    ga.async = true;
    ga.src = ('https:' == document.location.protocol ?
              'https://ssl' : 'http://www')
             + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga, s);
  })();
</script>
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxxx-x']);
  _gaq.push(['_trackPageview']);
  (function() {
    var ga = document.createElement('script');
    ga.type = 'text/javascript';
    ga.async = true;
    ga.src = ('https:' == document.location.protocol ?
              'https://ssl' : 'http://www')
             + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga, s);
  })();
</script>
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxxx-x']);
  _gaq.push(['_trackPageview']);
  (function() {
    var ga = document.createElement('script');
    ga.type = 'text/javascript';
    ga.async = true;
    ga.src = ('https:' == document.location.protocol ?
              'https://ssl' : 'http://www')
             + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga, s);
  })();
</script>
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxxx-x']);
  _gaq.push(['_trackPageview']);
  (function() {
    var ga = document.createElement('script');
    ga.type = 'text/javascript';
    ga.async = true;
    ga.src = ('https:' == document.location.protocol ?
              'https://ssl' : 'http://www')
             + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga, s);
  })();
</script>
Você pode otimizar o
    seu Google Analytics
http://mathiasbynens.be/notes/async-analytics-snippet
Antipatterns




http://addyosmani.com/resources/essentialjsdesignpatterns/book/#antipatterns
Antipatterns comuns

• Muitas globais poluindo o contexto da
  página
• Modificar os objetos nativos do JS
• JavaScript inline
• document.write()
Addy Osmani:

“Knowledge of anti-patterns is critical
   for success. Once we are able to
  recognize such anti-patterns, we're
 able to refactor our code to negate
them so that the overall quality of our
     solutions improves instantly.”
 http://addyosmani.com/resources/essentialjsdesignpatterns/book/#antipatterns
Addy Osmani (em pt-BR):

 “Conhecer os antipadrões é crítico
para alcançar sucesso. Uma vez que
     conseguimos reconhecer os
 antipadrões, conseguimos refatorar
nosso código para evitá-los de modo
  que a qualidade geral de nossas
soluções melhore instantaneamente.”
 http://addyosmani.com/resources/essentialjsdesignpatterns/book/#antipatterns
Agora para tudo e
vamos falar de jQuery!
Repositório de
Plugins jQuery

   Como faz?
Passo a passo

   • Após criar um repositório no GitHub, crie
     um webhook apontando para a URL:
http://plugins.jquery.com/postreceive-hook
https://help.github.com/articles/post-receive-hooks
???
Você ainda não tem
 conta no GitHub?
    É de graça!
Passo a passo


•   Repositório GitHub WebHook para
    http://plugins.jquery.com/postreceive-hook

•   Criar um arquivo de manifesto “seu-plugin.jquery.json”
Arquivo de Manifesto?
 http://plugins.jquery.com/docs/publish/
{
    "name": "color",
    "title": "jQuery Color",
    "description": "jQuery plugin for color manipulation and animation support.",
    "keywords": [
        "color",
        "animation"
    ],
    "version": "2.1.2",
    "author": {
        "name": "jQuery Foundation and other contributors",
        "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt"
    },
    "maintainers": [
        {
            "name": "Corey Frang",
            "email": "gnarf37@gmail.com",
            "url": "http://gnarf.net"
        }
    ],
    "licenses": [
        {
            "type": "MIT",
            "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt"
        }
    ],
    "bugs": "https://github.com/jquery/jquery-color/issues",
    "homepage": "https://github.com/jquery/jquery-color",
    "docs": "https://github.com/jquery/jquery-color",
    "download": "http://code.jquery.com/#color",
    "dependencies": {
        "jquery": ">=1.5"
    }
}
{
    "name": "color",
    "title": "jQuery Color",
    "description": "jQuery plugin for color manipulation and animation support.",
    "keywords": [
        "color",
        "animation"
    ],
    "version": "2.1.2",
    "author": {
        "name": "jQuery Foundation and other contributors",
        "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt"
    },
    "maintainers": [
        {
            "name": "Corey Frang",
            "email": "gnarf37@gmail.com",
            "url": "http://gnarf.net"
        }
    ],
    "licenses": [
        {
            "type": "MIT",
            "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt"
        }
    ],
    "bugs": "https://github.com/jquery/jquery-color/issues",
    "homepage": "https://github.com/jquery/jquery-color",
    "docs": "https://github.com/jquery/jquery-color",
    "download": "http://code.jquery.com/#color",
    "dependencies": {
        "jquery": ">=1.5"
    }
}
{
    "name": "color",
    "title": "jQuery Color",
    "description": "jQuery plugin for color manipulation and animation support.",
    "keywords": [
        "color",
        "animation"
    ],
    "version": "2.1.2",
    "author": {
        "name": "jQuery Foundation and other contributors",
        "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt"
    },
    "maintainers": [
        {
            "name": "Corey Frang",
            "email": "gnarf37@gmail.com",
            "url": "http://gnarf.net"
        }
    ],
    "licenses": [
        {
            "type": "MIT",
            "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt"
        }
    ],
    "bugs": "https://github.com/jquery/jquery-color/issues",
    "homepage": "https://github.com/jquery/jquery-color",
    "docs": "https://github.com/jquery/jquery-color",
    "download": "http://code.jquery.com/#color",
    "dependencies": {
        "jquery": ">=1.5"
    }
}
{
    "name": "color",
    "title": "jQuery Color",
    "description": "jQuery plugin for color manipulation and animation support.",
    "keywords": [
        "color",
        "animation"
    ],
    "version": "2.1.2",
    "author": {
        "name": "jQuery Foundation and other contributors",
        "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt"
    },
    "maintainers": [
        {
            "name": "Corey Frang",
            "email": "gnarf37@gmail.com",
            "url": "http://gnarf.net"
        }
    ],
    "licenses": [
        {
            "type": "MIT",
            "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt"
        }
    ],
    "bugs": "https://github.com/jquery/jquery-color/issues",
    "homepage": "https://github.com/jquery/jquery-color",
    "docs": "https://github.com/jquery/jquery-color",
    "download": "http://code.jquery.com/#color",
    "dependencies": {
        "jquery": ">=1.5"
    }
}
{
    "name": "color",
    "title": "jQuery Color",
    "description": "jQuery plugin for color manipulation and animation support.",
    "keywords": [
        "color",
        "animation"
    ],
    "version": "2.1.2",
    "author": {
        "name": "jQuery Foundation and other contributors",
        "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt"
    },
    "maintainers": [
        {
            "name": "Corey Frang",
            "email": "gnarf37@gmail.com",
            "url": "http://gnarf.net"
        }
    ],
    "licenses": [
        {
            "type": "MIT",
            "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt"
        }
    ],
    "bugs": "https://github.com/jquery/jquery-color/issues",
    "homepage": "https://github.com/jquery/jquery-color",
    "docs": "https://github.com/jquery/jquery-color",
    "download": "http://code.jquery.com/#color",
    "dependencies": {
        "jquery": ">=1.5"
    }
}
{
    "name": "color",
    "title": "jQuery Color",
    "description": "jQuery plugin for color manipulation and animation support.",
    "keywords": [
        "color",
        "animation"
    ],
    "version": "2.1.2",
    "author": {
        "name": "jQuery Foundation and other contributors",
        "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt"
    },
    "maintainers": [
        {
            "name": "Corey Frang",
            "email": "gnarf37@gmail.com",
            "url": "http://gnarf.net"
        }
    ],
    "licenses": [
        {
            "type": "MIT",
            "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt"
        }
    ],
    "bugs": "https://github.com/jquery/jquery-color/issues",
    "homepage": "https://github.com/jquery/jquery-color",
    "docs": "https://github.com/jquery/jquery-color",
    "download": "http://code.jquery.com/#color",
    "dependencies": {
        "jquery": ">=1.5"
    }
}
{
    "name": "color",
    "title": "jQuery Color",
    "description": "jQuery plugin for color manipulation and animation support.",
    "keywords": [
        "color",
        "animation"
    ],
    "version": "2.1.2",
    "author": {
        "name": "jQuery Foundation and other contributors",
        "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt"
    },
    "maintainers": [
        {
            "name": "Corey Frang",
            "email": "gnarf37@gmail.com",
            "url": "http://gnarf.net"
        }
    ],
    "licenses": [
        {
            "type": "MIT",
            "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt"
        }
    ],
    "bugs": "https://github.com/jquery/jquery-color/issues",
    "homepage": "https://github.com/jquery/jquery-color",
    "docs": "https://github.com/jquery/jquery-color",
    "download": "http://code.jquery.com/#color",
    "dependencies": {
        "jquery": ">=1.5"
    }
}
{
    "name": "color",
    "title": "jQuery Color",
    "description": "jQuery plugin for color manipulation and animation support.",
    "keywords": [
        "color",
        "animation"
    ],
    "version": "2.1.2",
    "author": {
        "name": "jQuery Foundation and other contributors",
        "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt"
    },
    "maintainers": [
        {
            "name": "Corey Frang",
            "email": "gnarf37@gmail.com",
            "url": "http://gnarf.net"
        }
    ],
    "licenses": [
        {
            "type": "MIT",
            "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt"
        }
    ],
    "bugs": "https://github.com/jquery/jquery-color/issues",
    "homepage": "https://github.com/jquery/jquery-color",
    "docs": "https://github.com/jquery/jquery-color",
    "download": "http://code.jquery.com/#color",
    "dependencies": {
        "jquery": ">=1.5"
    }
}
O que queremos
 automatizar?
Se você tem instalada a
versão 0.3.x ou anterior
       do Grunt:
  npm uninstall -g grunt
‣ npm   install -g grunt-cli
‣ npm   install -g grunt-cli

‣ npm   install -g grunt-init
‣ npm   install -g grunt-cli

‣ npm   install -g grunt-init

‣ gitclone git@github.com:gruntjs/grunt-init-jquery.git
 ~/.grunt-init/jquery
‣ npm   install -g grunt-cli

‣ npm   install -g grunt-init

‣ gitclone git@github.com:gruntjs/grunt-init-jquery.git
 ~/.grunt-init/jquery

‣#   entre na pasta que vai criar o seu projeto
‣ npm   install -g grunt-cli

‣ npm   install -g grunt-init

‣ gitclone git@github.com:gruntjs/grunt-init-jquery.git
 ~/.grunt-init/jquery

‣#   entre na pasta que vai criar o seu projeto

‣ grunt-init   jquery
‣ npm   install -g grunt-cli

‣ npm   install -g grunt-init

‣ gitclone git@github.com:gruntjs/grunt-init-jquery.git
 ~/.grunt-init/jquery

‣#   entre na pasta que vai criar o seu projeto

‣ grunt-init   jquery

‣ npm   install grunt --save-dev
‣ npm   install -g grunt-cli

‣ npm   install -g grunt-init

‣ gitclone git@github.com:gruntjs/grunt-init-jquery.git
 ~/.grunt-init/jquery

‣#   entre na pasta que vai criar o seu projeto

‣ grunt-init      jquery

‣ npm   install grunt --save-dev

‣ npm   install
‣#   brincou com o plugin?
‣#   brincou com o plugin?

‣#   fez commit?
‣#   brincou com o plugin?

‣#   fez commit?

‣ git   tag 0.1.0
‣#   brincou com o plugin?

‣#   fez commit?

‣ git   tag 0.1.0

‣ git   push origin --tags
Obrigado!
@leobalter

Más contenido relacionado

La actualidad más candente

jQuery Mobile - Desenvolvimento para dispositivos móveis
jQuery Mobile - Desenvolvimento para dispositivos móveisjQuery Mobile - Desenvolvimento para dispositivos móveis
jQuery Mobile - Desenvolvimento para dispositivos móveisPablo Garrido
 
Front End Development: The Important Parts
Front End Development: The Important PartsFront End Development: The Important Parts
Front End Development: The Important PartsSergey Bolshchikov
 
jQuery Internals + Cool Stuff
jQuery Internals + Cool StuffjQuery Internals + Cool Stuff
jQuery Internals + Cool Stuffjeresig
 
Doctype html public
Doctype html publicDoctype html public
Doctype html publicEddy_TKJ
 
Performance monitoring measurement angualrjs single page apps with phantomas
Performance monitoring measurement angualrjs single page apps with phantomasPerformance monitoring measurement angualrjs single page apps with phantomas
Performance monitoring measurement angualrjs single page apps with phantomasDavid Amend
 
Introduction to Ruby on Rails
Introduction to Ruby on RailsIntroduction to Ruby on Rails
Introduction to Ruby on RailsDiki Andeas
 
"今" 使えるJavaScriptのトレンド
"今" 使えるJavaScriptのトレンド"今" 使えるJavaScriptのトレンド
"今" 使えるJavaScriptのトレンドHayato Mizuno
 
HTML5 and Mobile
HTML5 and MobileHTML5 and Mobile
HTML5 and Mobiledoodoofish
 
How to identify bad third parties on your page
How to identify bad third parties on your pageHow to identify bad third parties on your page
How to identify bad third parties on your pageCharles Vazac
 
JavaScript Library Overview
JavaScript Library OverviewJavaScript Library Overview
JavaScript Library Overviewjeresig
 
MVC pattern for widgets
MVC pattern for widgetsMVC pattern for widgets
MVC pattern for widgetsBehnam Taraghi
 
JavaScript Libraries (@Media)
JavaScript Libraries (@Media)JavaScript Libraries (@Media)
JavaScript Libraries (@Media)jeresig
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterpriseDave Artz
 
jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009Remy Sharp
 

La actualidad más candente (20)

jQuery Mobile - Desenvolvimento para dispositivos móveis
jQuery Mobile - Desenvolvimento para dispositivos móveisjQuery Mobile - Desenvolvimento para dispositivos móveis
jQuery Mobile - Desenvolvimento para dispositivos móveis
 
Drupal Security
Drupal SecurityDrupal Security
Drupal Security
 
Front End Development: The Important Parts
Front End Development: The Important PartsFront End Development: The Important Parts
Front End Development: The Important Parts
 
jQuery Internals + Cool Stuff
jQuery Internals + Cool StuffjQuery Internals + Cool Stuff
jQuery Internals + Cool Stuff
 
Doctype html public
Doctype html publicDoctype html public
Doctype html public
 
Introduction to jQuery
Introduction to jQueryIntroduction to jQuery
Introduction to jQuery
 
JQuery UI
JQuery UIJQuery UI
JQuery UI
 
Intro to jQuery
Intro to jQueryIntro to jQuery
Intro to jQuery
 
Performance monitoring measurement angualrjs single page apps with phantomas
Performance monitoring measurement angualrjs single page apps with phantomasPerformance monitoring measurement angualrjs single page apps with phantomas
Performance monitoring measurement angualrjs single page apps with phantomas
 
Introduction to Ruby on Rails
Introduction to Ruby on RailsIntroduction to Ruby on Rails
Introduction to Ruby on Rails
 
"今" 使えるJavaScriptのトレンド
"今" 使えるJavaScriptのトレンド"今" 使えるJavaScriptのトレンド
"今" 使えるJavaScriptのトレンド
 
HTML5 and Mobile
HTML5 and MobileHTML5 and Mobile
HTML5 and Mobile
 
How to identify bad third parties on your page
How to identify bad third parties on your pageHow to identify bad third parties on your page
How to identify bad third parties on your page
 
JavaScript Library Overview
JavaScript Library OverviewJavaScript Library Overview
JavaScript Library Overview
 
MVC pattern for widgets
MVC pattern for widgetsMVC pattern for widgets
MVC pattern for widgets
 
FuncUnit
FuncUnitFuncUnit
FuncUnit
 
JavaScript Libraries (@Media)
JavaScript Libraries (@Media)JavaScript Libraries (@Media)
JavaScript Libraries (@Media)
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] Enterprise
 
jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009jQuery Loves Developers - Oredev 2009
jQuery Loves Developers - Oredev 2009
 
jQuery for beginners
jQuery for beginnersjQuery for beginners
jQuery for beginners
 

Destacado

NUDOS Y AMARRES
NUDOS Y AMARRESNUDOS Y AMARRES
NUDOS Y AMARREStatto1787
 
Plano de Transição: De Local a Global (Palestra no ZDAY 2013)
Plano de Transição: De Local a Global (Palestra no ZDAY 2013)Plano de Transição: De Local a Global (Palestra no ZDAY 2013)
Plano de Transição: De Local a Global (Palestra no ZDAY 2013)Victor Mendes
 
Palestra no ZDAY 2014
Palestra no ZDAY 2014Palestra no ZDAY 2014
Palestra no ZDAY 2014Victor Mendes
 
Porque uma economia cooperativa? ( Palestra 07.02.2015)
Porque uma economia cooperativa? ( Palestra 07.02.2015)Porque uma economia cooperativa? ( Palestra 07.02.2015)
Porque uma economia cooperativa? ( Palestra 07.02.2015)Victor Mendes
 
Como limpar um peixe
Como limpar um peixeComo limpar um peixe
Como limpar um peixeJoyce Muzy
 
Israel
IsraelIsrael
IsraelTorah
 
A sobrevivência em tempos de crise
A sobrevivência em tempos de criseA sobrevivência em tempos de crise
A sobrevivência em tempos de criseCelso Napoleon
 
A fusão do calvinismo com o mundanismo (peter master)
A fusão do calvinismo com o mundanismo (peter master)A fusão do calvinismo com o mundanismo (peter master)
A fusão do calvinismo com o mundanismo (peter master)Deusdete Soares
 
Guerra das duas Rosas - Prof. Altair Aguilar
Guerra das duas Rosas - Prof. Altair AguilarGuerra das duas Rosas - Prof. Altair Aguilar
Guerra das duas Rosas - Prof. Altair AguilarAltair Moisés Aguilar
 
LiderançA CarismáTica
LiderançA CarismáTicaLiderançA CarismáTica
LiderançA CarismáTicaLívia Dutra
 
Proposta comercial - curso de capacitação e liderança modulo sobrevivencia
Proposta comercial  - curso de capacitação e liderança modulo sobrevivenciaProposta comercial  - curso de capacitação e liderança modulo sobrevivencia
Proposta comercial - curso de capacitação e liderança modulo sobrevivenciaDjalma Mangabeira
 
CURSOS DE CAPACITAÇÃO E LIDERANÇA RAPOSAS RADICAIS Pista de Orientação e In...
CURSOS DE CAPACITAÇÃO E LIDERANÇA RAPOSAS RADICAIS   Pista de Orientação e In...CURSOS DE CAPACITAÇÃO E LIDERANÇA RAPOSAS RADICAIS   Pista de Orientação e In...
CURSOS DE CAPACITAÇÃO E LIDERANÇA RAPOSAS RADICAIS Pista de Orientação e In...Djalma Mangabeira
 
Introdução à Permacultura - BILL MOLLISON
Introdução à Permacultura - BILL MOLLISONIntrodução à Permacultura - BILL MOLLISON
Introdução à Permacultura - BILL MOLLISONMíriam Morata Novaes
 
MAIORES PALESTRANTES DO BRASIL- JULIO CESAR
MAIORES PALESTRANTES DO BRASIL- JULIO CESARMAIORES PALESTRANTES DO BRASIL- JULIO CESAR
MAIORES PALESTRANTES DO BRASIL- JULIO CESARJulio C França Franco
 
Knots and ropes
Knots and ropesKnots and ropes
Knots and ropesdine_ross
 

Destacado (20)

NUDOS Y AMARRES
NUDOS Y AMARRESNUDOS Y AMARRES
NUDOS Y AMARRES
 
Plano de Transição: De Local a Global (Palestra no ZDAY 2013)
Plano de Transição: De Local a Global (Palestra no ZDAY 2013)Plano de Transição: De Local a Global (Palestra no ZDAY 2013)
Plano de Transição: De Local a Global (Palestra no ZDAY 2013)
 
Palestra no ZDAY 2014
Palestra no ZDAY 2014Palestra no ZDAY 2014
Palestra no ZDAY 2014
 
Porque uma economia cooperativa? ( Palestra 07.02.2015)
Porque uma economia cooperativa? ( Palestra 07.02.2015)Porque uma economia cooperativa? ( Palestra 07.02.2015)
Porque uma economia cooperativa? ( Palestra 07.02.2015)
 
Como limpar um peixe
Como limpar um peixeComo limpar um peixe
Como limpar um peixe
 
Israel
IsraelIsrael
Israel
 
A sobrevivencia em tempos de crise
A sobrevivencia  em tempos de criseA sobrevivencia  em tempos de crise
A sobrevivencia em tempos de crise
 
A sobrevivência em tempos de crise
A sobrevivência em tempos de criseA sobrevivência em tempos de crise
A sobrevivência em tempos de crise
 
A fusão do calvinismo com o mundanismo (peter master)
A fusão do calvinismo com o mundanismo (peter master)A fusão do calvinismo com o mundanismo (peter master)
A fusão do calvinismo com o mundanismo (peter master)
 
Kit de sobrevivência
Kit de sobrevivênciaKit de sobrevivência
Kit de sobrevivência
 
Guerra das duas Rosas - Prof. Altair Aguilar
Guerra das duas Rosas - Prof. Altair AguilarGuerra das duas Rosas - Prof. Altair Aguilar
Guerra das duas Rosas - Prof. Altair Aguilar
 
Nudos y amarres 2
Nudos y amarres 2Nudos y amarres 2
Nudos y amarres 2
 
LiderançA CarismáTica
LiderançA CarismáTicaLiderançA CarismáTica
LiderançA CarismáTica
 
Proposta comercial - curso de capacitação e liderança modulo sobrevivencia
Proposta comercial  - curso de capacitação e liderança modulo sobrevivenciaProposta comercial  - curso de capacitação e liderança modulo sobrevivencia
Proposta comercial - curso de capacitação e liderança modulo sobrevivencia
 
CURSOS DE CAPACITAÇÃO E LIDERANÇA RAPOSAS RADICAIS Pista de Orientação e In...
CURSOS DE CAPACITAÇÃO E LIDERANÇA RAPOSAS RADICAIS   Pista de Orientação e In...CURSOS DE CAPACITAÇÃO E LIDERANÇA RAPOSAS RADICAIS   Pista de Orientação e In...
CURSOS DE CAPACITAÇÃO E LIDERANÇA RAPOSAS RADICAIS Pista de Orientação e In...
 
Introdução à Permacultura - BILL MOLLISON
Introdução à Permacultura - BILL MOLLISONIntrodução à Permacultura - BILL MOLLISON
Introdução à Permacultura - BILL MOLLISON
 
Permacultura fundamentos
Permacultura fundamentosPermacultura fundamentos
Permacultura fundamentos
 
MAIORES PALESTRANTES DO BRASIL- JULIO CESAR
MAIORES PALESTRANTES DO BRASIL- JULIO CESARMAIORES PALESTRANTES DO BRASIL- JULIO CESAR
MAIORES PALESTRANTES DO BRASIL- JULIO CESAR
 
Horta em pequenos_espacos
Horta em pequenos_espacosHorta em pequenos_espacos
Horta em pequenos_espacos
 
Knots and ropes
Knots and ropesKnots and ropes
Knots and ropes
 

Similar a Survival Guide for JS in the Open Source World

Styling components with JavaScript
Styling components with JavaScriptStyling components with JavaScript
Styling components with JavaScriptbensmithett
 
Building iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoBuilding iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoRob Bontekoe
 
JavaScript Performance (at SFJS)
JavaScript Performance (at SFJS)JavaScript Performance (at SFJS)
JavaScript Performance (at SFJS)Steve Souders
 
JavaScript Perfomance
JavaScript PerfomanceJavaScript Perfomance
JavaScript PerfomanceAnatol Alizar
 
Private slideshow
Private slideshowPrivate slideshow
Private slideshowsblackman
 
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)Igor Bronovskyy
 
The Future of CSS with Web components
The Future of CSS with Web componentsThe Future of CSS with Web components
The Future of CSS with Web componentsdevObjective
 
The Future of CSS with Web Components
The Future of CSS with Web ComponentsThe Future of CSS with Web Components
The Future of CSS with Web ComponentsColdFusionConference
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenerytoddbr
 
Front End Development for Back End Developers - Denver Startup Week 2017
Front End Development for Back End Developers - Denver Startup Week 2017Front End Development for Back End Developers - Denver Startup Week 2017
Front End Development for Back End Developers - Denver Startup Week 2017Matt Raible
 
Personas: Understanding the User Behind the Visit
Personas: Understanding the User Behind the VisitPersonas: Understanding the User Behind the Visit
Personas: Understanding the User Behind the VisitMichael King
 
Front End Development for Back End Java Developers - Jfokus 2020
Front End Development for Back End Java Developers - Jfokus 2020Front End Development for Back End Java Developers - Jfokus 2020
Front End Development for Back End Java Developers - Jfokus 2020Matt Raible
 
Advanced Javascript Unit Testing
Advanced Javascript Unit TestingAdvanced Javascript Unit Testing
Advanced Javascript Unit TestingLars Thorup
 
Django + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar DjangoDjango + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar DjangoJavier Abadía
 
Scout xss csrf_security_presentation_chicago
Scout xss csrf_security_presentation_chicagoScout xss csrf_security_presentation_chicago
Scout xss csrf_security_presentation_chicagoknaddison
 
After max+phonegap
After max+phonegapAfter max+phonegap
After max+phonegapyangdj
 
混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaver混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaveryangdj
 
Mozilla Web Apps - Super-VanJS
Mozilla Web Apps - Super-VanJSMozilla Web Apps - Super-VanJS
Mozilla Web Apps - Super-VanJSRobert Nyman
 

Similar a Survival Guide for JS in the Open Source World (20)

Styling components with JavaScript
Styling components with JavaScriptStyling components with JavaScript
Styling components with JavaScript
 
Building iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoBuilding iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" Domino
 
JavaScript Performance (at SFJS)
JavaScript Performance (at SFJS)JavaScript Performance (at SFJS)
JavaScript Performance (at SFJS)
 
JavaScript Perfomance
JavaScript PerfomanceJavaScript Perfomance
JavaScript Perfomance
 
Private slideshow
Private slideshowPrivate slideshow
Private slideshow
 
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
 
The Future of CSS with Web components
The Future of CSS with Web componentsThe Future of CSS with Web components
The Future of CSS with Web components
 
The Future of CSS with Web Components
The Future of CSS with Web ComponentsThe Future of CSS with Web Components
The Future of CSS with Web Components
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
 
Front End Development for Back End Developers - Denver Startup Week 2017
Front End Development for Back End Developers - Denver Startup Week 2017Front End Development for Back End Developers - Denver Startup Week 2017
Front End Development for Back End Developers - Denver Startup Week 2017
 
Personas: Understanding the User Behind the Visit
Personas: Understanding the User Behind the VisitPersonas: Understanding the User Behind the Visit
Personas: Understanding the User Behind the Visit
 
Web-Performance
Web-PerformanceWeb-Performance
Web-Performance
 
Front End Development for Back End Java Developers - Jfokus 2020
Front End Development for Back End Java Developers - Jfokus 2020Front End Development for Back End Java Developers - Jfokus 2020
Front End Development for Back End Java Developers - Jfokus 2020
 
Advanced Javascript Unit Testing
Advanced Javascript Unit TestingAdvanced Javascript Unit Testing
Advanced Javascript Unit Testing
 
WCLA12 JavaScript
WCLA12 JavaScriptWCLA12 JavaScript
WCLA12 JavaScript
 
Django + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar DjangoDjango + Vue, JavaScript de 3ª generación para modernizar Django
Django + Vue, JavaScript de 3ª generación para modernizar Django
 
Scout xss csrf_security_presentation_chicago
Scout xss csrf_security_presentation_chicagoScout xss csrf_security_presentation_chicago
Scout xss csrf_security_presentation_chicago
 
After max+phonegap
After max+phonegapAfter max+phonegap
After max+phonegap
 
混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaver混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaver
 
Mozilla Web Apps - Super-VanJS
Mozilla Web Apps - Super-VanJSMozilla Web Apps - Super-VanJS
Mozilla Web Apps - Super-VanJS
 

Más de Leonardo Balter

Potencial de Vendas do e-Commerce no Frontend - WOB2012
Potencial de Vendas do e-Commerce no Frontend - WOB2012Potencial de Vendas do e-Commerce no Frontend - WOB2012
Potencial de Vendas do e-Commerce no Frontend - WOB2012Leonardo Balter
 
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open WebNovo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open WebLeonardo Balter
 
Receita do Sucesso no Mercado Front End
Receita do Sucesso no Mercado Front EndReceita do Sucesso no Mercado Front End
Receita do Sucesso no Mercado Front EndLeonardo Balter
 
Realize mais com HTML 5 e CSS 3 - EDTED / RS
Realize mais com HTML 5 e CSS 3 - EDTED / RSRealize mais com HTML 5 e CSS 3 - EDTED / RS
Realize mais com HTML 5 e CSS 3 - EDTED / RSLeonardo Balter
 
EDTED BH - HTML 5 e CSS 3 - Julho de 2011
EDTED BH - HTML 5 e CSS 3 - Julho de 2011EDTED BH - HTML 5 e CSS 3 - Julho de 2011
EDTED BH - HTML 5 e CSS 3 - Julho de 2011Leonardo Balter
 
WTF Javascript - FrontInRio 2011
WTF Javascript - FrontInRio 2011WTF Javascript - FrontInRio 2011
WTF Javascript - FrontInRio 2011Leonardo Balter
 
EDTED SP - HTML 5 e CSS 3 - Junho de 2011
EDTED SP - HTML 5 e CSS 3 - Junho de 2011EDTED SP - HTML 5 e CSS 3 - Junho de 2011
EDTED SP - HTML 5 e CSS 3 - Junho de 2011Leonardo Balter
 
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJRealize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJLeonardo Balter
 
HTML 5 - Semana da Computação - UFF
HTML 5 - Semana da Computação - UFFHTML 5 - Semana da Computação - UFF
HTML 5 - Semana da Computação - UFFLeonardo Balter
 

Más de Leonardo Balter (15)

Unit testing
Unit testingUnit testing
Unit testing
 
Insustentavel js
Insustentavel jsInsustentavel js
Insustentavel js
 
GruntJS + Wordpress
GruntJS + WordpressGruntJS + Wordpress
GruntJS + Wordpress
 
Potencial de Vendas do e-Commerce no Frontend - WOB2012
Potencial de Vendas do e-Commerce no Frontend - WOB2012Potencial de Vendas do e-Commerce no Frontend - WOB2012
Potencial de Vendas do e-Commerce no Frontend - WOB2012
 
Testing sucks
Testing sucksTesting sucks
Testing sucks
 
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open WebNovo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
Novo Cinto de Utilidades do Desenvolvedor JavaScript, WebAPIs e Open Web
 
Extreme Web Performance
Extreme Web PerformanceExtreme Web Performance
Extreme Web Performance
 
temp EWP
temp EWPtemp EWP
temp EWP
 
Receita do Sucesso no Mercado Front End
Receita do Sucesso no Mercado Front EndReceita do Sucesso no Mercado Front End
Receita do Sucesso no Mercado Front End
 
Realize mais com HTML 5 e CSS 3 - EDTED / RS
Realize mais com HTML 5 e CSS 3 - EDTED / RSRealize mais com HTML 5 e CSS 3 - EDTED / RS
Realize mais com HTML 5 e CSS 3 - EDTED / RS
 
EDTED BH - HTML 5 e CSS 3 - Julho de 2011
EDTED BH - HTML 5 e CSS 3 - Julho de 2011EDTED BH - HTML 5 e CSS 3 - Julho de 2011
EDTED BH - HTML 5 e CSS 3 - Julho de 2011
 
WTF Javascript - FrontInRio 2011
WTF Javascript - FrontInRio 2011WTF Javascript - FrontInRio 2011
WTF Javascript - FrontInRio 2011
 
EDTED SP - HTML 5 e CSS 3 - Junho de 2011
EDTED SP - HTML 5 e CSS 3 - Junho de 2011EDTED SP - HTML 5 e CSS 3 - Junho de 2011
EDTED SP - HTML 5 e CSS 3 - Junho de 2011
 
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJRealize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
 
HTML 5 - Semana da Computação - UFF
HTML 5 - Semana da Computação - UFFHTML 5 - Semana da Computação - UFF
HTML 5 - Semana da Computação - UFF
 

Último

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 

Último (20)

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 

Survival Guide for JS in the Open Source World

  • 1. Guia de sobrevivência JS no mundo Open Source Rio.JS Conference 2013 - Leo Balter
  • 3. JS no mundo Open Source? JS de terceiros! WAT?
  • 4. Desafio Desenvolvedor • 1 ambiente • 1 versão da linguagem • sem script no nome
  • 5.
  • 6. Desafio Desenvolvedor JavaScript • Vários ambientes (mobile, desktop, geladeira) • Chrome, Firefox, Opera • IE 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17... • Qual é mesmo a versão do JS?
  • 7.
  • 8. JS que funciona em qualquer site, inclusive nos que não são seus!
  • 10. Same Origin Policy HTTP HTTP HTTPS HTTPS www.foo.com/bla www.foo.com/bos
  • 11. Same Origin Policy HTTP HTTPS HTTPS HTTP bla.foo.com bos.foo.com
  • 12. Como driblar o SOP? • JSONP (Jaydson P) • CORS (Cross Origin Resource Sharing) • Post Message https://developer.mozilla.org/en-US/docs/DOM/window.postMessage • easyXDM http://easyxdm.net/wp/
  • 13. Como se não bastasse...
  • 14. Peraí, um JS de terceiros está bloqueando a apresentação
  • 15.
  • 17. <div id="fb-root"></div> <script> // Load the SDK Asynchronously (function(d){ var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; if (d.getElementById(id)) {return;} js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all.js#xfbml=1"; ref.parentNode.insertBefore(js, ref); }(document)); </script> <div class="fb-like"></div>
  • 18. <div id="fb-root"></div> <script> // Load the SDK Asynchronously (function(d){ var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; if (d.getElementById(id)) {return;} js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all.js#xfbml=1"; ref.parentNode.insertBefore(js, ref); }(document)); </script> <div class="fb-like"></div>
  • 19. <div id="fb-root"></div> <script> // Load the SDK Asynchronously (function(d){ var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; if (d.getElementById(id)) {return;} js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all.js#xfbml=1"; ref.parentNode.insertBefore(js, ref); }(document)); </script> <div class="fb-like"></div>
  • 20. <div id="fb-root"></div> <script> // Load the SDK Asynchronously (function(d){ var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; if (d.getElementById(id)) {return;} js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all.js#xfbml=1"; ref.parentNode.insertBefore(js, ref); }(document)); </script> <div class="fb-like"></div>
  • 21. <div id="fb-root"></div> <script> // Load the SDK Asynchronously (function(d){ var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; if (d.getElementById(id)) {return;} js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all.js#xfbml=1"; ref.parentNode.insertBefore(js, ref); }(document)); </script> <div class="fb-like"></div>
  • 22. <div id="fb-root"></div> <script> // Load the SDK Asynchronously (function(d){ var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; if (d.getElementById(id)) {return;} js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all.js#xfbml=1"; ref.parentNode.insertBefore(js, ref); }(document)); </script> <div class="fb-like"></div>
  • 23. <div id="fb-root"></div> <script> // Load the SDK Asynchronously (function(d){ var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; if (d.getElementById(id)) {return;} js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all.js#xfbml=1"; ref.parentNode.insertBefore(js, ref); }(document)); </script> <div class="fb-like"></div>
  • 24. <div id="fb-root"></div> <script> // Load the SDK Asynchronously (function(d){ var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0]; if (d.getElementById(id)) {return;} js = d.createElement('script'); js.id = id; js.async = true; js.src = "//connect.facebook.net/en_US/all.js#xfbml=1"; ref.parentNode.insertBefore(js, ref); }(document)); </script> <div class="fb-like"></div>
  • 25. <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-xxxxxxx-x']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script>
  • 26. <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-xxxxxxx-x']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script>
  • 27. <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-xxxxxxx-x']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script>
  • 28. <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-xxxxxxx-x']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script>
  • 29. <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-xxxxxxx-x']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script>
  • 30. <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-xxxxxxx-x']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script>
  • 31. <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-xxxxxxx-x']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); </script>
  • 32. Você pode otimizar o seu Google Analytics http://mathiasbynens.be/notes/async-analytics-snippet
  • 34. Antipatterns comuns • Muitas globais poluindo o contexto da página • Modificar os objetos nativos do JS • JavaScript inline • document.write()
  • 35. Addy Osmani: “Knowledge of anti-patterns is critical for success. Once we are able to recognize such anti-patterns, we're able to refactor our code to negate them so that the overall quality of our solutions improves instantly.” http://addyosmani.com/resources/essentialjsdesignpatterns/book/#antipatterns
  • 36. Addy Osmani (em pt-BR): “Conhecer os antipadrões é crítico para alcançar sucesso. Uma vez que conseguimos reconhecer os antipadrões, conseguimos refatorar nosso código para evitá-los de modo que a qualidade geral de nossas soluções melhore instantaneamente.” http://addyosmani.com/resources/essentialjsdesignpatterns/book/#antipatterns
  • 37. Agora para tudo e vamos falar de jQuery!
  • 38.
  • 39.
  • 41. Passo a passo • Após criar um repositório no GitHub, crie um webhook apontando para a URL: http://plugins.jquery.com/postreceive-hook
  • 43.
  • 44.
  • 45.
  • 46. ???
  • 47. Você ainda não tem conta no GitHub? É de graça!
  • 48. Passo a passo • Repositório GitHub WebHook para http://plugins.jquery.com/postreceive-hook • Criar um arquivo de manifesto “seu-plugin.jquery.json”
  • 49. Arquivo de Manifesto? http://plugins.jquery.com/docs/publish/
  • 50. { "name": "color", "title": "jQuery Color", "description": "jQuery plugin for color manipulation and animation support.", "keywords": [ "color", "animation" ], "version": "2.1.2", "author": { "name": "jQuery Foundation and other contributors", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt" }, "maintainers": [ { "name": "Corey Frang", "email": "gnarf37@gmail.com", "url": "http://gnarf.net" } ], "licenses": [ { "type": "MIT", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt" } ], "bugs": "https://github.com/jquery/jquery-color/issues", "homepage": "https://github.com/jquery/jquery-color", "docs": "https://github.com/jquery/jquery-color", "download": "http://code.jquery.com/#color", "dependencies": { "jquery": ">=1.5" } }
  • 51. { "name": "color", "title": "jQuery Color", "description": "jQuery plugin for color manipulation and animation support.", "keywords": [ "color", "animation" ], "version": "2.1.2", "author": { "name": "jQuery Foundation and other contributors", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt" }, "maintainers": [ { "name": "Corey Frang", "email": "gnarf37@gmail.com", "url": "http://gnarf.net" } ], "licenses": [ { "type": "MIT", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt" } ], "bugs": "https://github.com/jquery/jquery-color/issues", "homepage": "https://github.com/jquery/jquery-color", "docs": "https://github.com/jquery/jquery-color", "download": "http://code.jquery.com/#color", "dependencies": { "jquery": ">=1.5" } }
  • 52. { "name": "color", "title": "jQuery Color", "description": "jQuery plugin for color manipulation and animation support.", "keywords": [ "color", "animation" ], "version": "2.1.2", "author": { "name": "jQuery Foundation and other contributors", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt" }, "maintainers": [ { "name": "Corey Frang", "email": "gnarf37@gmail.com", "url": "http://gnarf.net" } ], "licenses": [ { "type": "MIT", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt" } ], "bugs": "https://github.com/jquery/jquery-color/issues", "homepage": "https://github.com/jquery/jquery-color", "docs": "https://github.com/jquery/jquery-color", "download": "http://code.jquery.com/#color", "dependencies": { "jquery": ">=1.5" } }
  • 53. { "name": "color", "title": "jQuery Color", "description": "jQuery plugin for color manipulation and animation support.", "keywords": [ "color", "animation" ], "version": "2.1.2", "author": { "name": "jQuery Foundation and other contributors", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt" }, "maintainers": [ { "name": "Corey Frang", "email": "gnarf37@gmail.com", "url": "http://gnarf.net" } ], "licenses": [ { "type": "MIT", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt" } ], "bugs": "https://github.com/jquery/jquery-color/issues", "homepage": "https://github.com/jquery/jquery-color", "docs": "https://github.com/jquery/jquery-color", "download": "http://code.jquery.com/#color", "dependencies": { "jquery": ">=1.5" } }
  • 54. { "name": "color", "title": "jQuery Color", "description": "jQuery plugin for color manipulation and animation support.", "keywords": [ "color", "animation" ], "version": "2.1.2", "author": { "name": "jQuery Foundation and other contributors", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt" }, "maintainers": [ { "name": "Corey Frang", "email": "gnarf37@gmail.com", "url": "http://gnarf.net" } ], "licenses": [ { "type": "MIT", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt" } ], "bugs": "https://github.com/jquery/jquery-color/issues", "homepage": "https://github.com/jquery/jquery-color", "docs": "https://github.com/jquery/jquery-color", "download": "http://code.jquery.com/#color", "dependencies": { "jquery": ">=1.5" } }
  • 55. { "name": "color", "title": "jQuery Color", "description": "jQuery plugin for color manipulation and animation support.", "keywords": [ "color", "animation" ], "version": "2.1.2", "author": { "name": "jQuery Foundation and other contributors", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt" }, "maintainers": [ { "name": "Corey Frang", "email": "gnarf37@gmail.com", "url": "http://gnarf.net" } ], "licenses": [ { "type": "MIT", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt" } ], "bugs": "https://github.com/jquery/jquery-color/issues", "homepage": "https://github.com/jquery/jquery-color", "docs": "https://github.com/jquery/jquery-color", "download": "http://code.jquery.com/#color", "dependencies": { "jquery": ">=1.5" } }
  • 56. { "name": "color", "title": "jQuery Color", "description": "jQuery plugin for color manipulation and animation support.", "keywords": [ "color", "animation" ], "version": "2.1.2", "author": { "name": "jQuery Foundation and other contributors", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt" }, "maintainers": [ { "name": "Corey Frang", "email": "gnarf37@gmail.com", "url": "http://gnarf.net" } ], "licenses": [ { "type": "MIT", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt" } ], "bugs": "https://github.com/jquery/jquery-color/issues", "homepage": "https://github.com/jquery/jquery-color", "docs": "https://github.com/jquery/jquery-color", "download": "http://code.jquery.com/#color", "dependencies": { "jquery": ">=1.5" } }
  • 57. { "name": "color", "title": "jQuery Color", "description": "jQuery plugin for color manipulation and animation support.", "keywords": [ "color", "animation" ], "version": "2.1.2", "author": { "name": "jQuery Foundation and other contributors", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/AUTHORS.txt" }, "maintainers": [ { "name": "Corey Frang", "email": "gnarf37@gmail.com", "url": "http://gnarf.net" } ], "licenses": [ { "type": "MIT", "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt" } ], "bugs": "https://github.com/jquery/jquery-color/issues", "homepage": "https://github.com/jquery/jquery-color", "docs": "https://github.com/jquery/jquery-color", "download": "http://code.jquery.com/#color", "dependencies": { "jquery": ">=1.5" } }
  • 58.
  • 59.
  • 60. O que queremos automatizar?
  • 61.
  • 62.
  • 63. Se você tem instalada a versão 0.3.x ou anterior do Grunt: npm uninstall -g grunt
  • 64.
  • 65. ‣ npm install -g grunt-cli
  • 66. ‣ npm install -g grunt-cli ‣ npm install -g grunt-init
  • 67. ‣ npm install -g grunt-cli ‣ npm install -g grunt-init ‣ gitclone git@github.com:gruntjs/grunt-init-jquery.git ~/.grunt-init/jquery
  • 68. ‣ npm install -g grunt-cli ‣ npm install -g grunt-init ‣ gitclone git@github.com:gruntjs/grunt-init-jquery.git ~/.grunt-init/jquery ‣# entre na pasta que vai criar o seu projeto
  • 69. ‣ npm install -g grunt-cli ‣ npm install -g grunt-init ‣ gitclone git@github.com:gruntjs/grunt-init-jquery.git ~/.grunt-init/jquery ‣# entre na pasta que vai criar o seu projeto ‣ grunt-init jquery
  • 70. ‣ npm install -g grunt-cli ‣ npm install -g grunt-init ‣ gitclone git@github.com:gruntjs/grunt-init-jquery.git ~/.grunt-init/jquery ‣# entre na pasta que vai criar o seu projeto ‣ grunt-init jquery ‣ npm install grunt --save-dev
  • 71. ‣ npm install -g grunt-cli ‣ npm install -g grunt-init ‣ gitclone git@github.com:gruntjs/grunt-init-jquery.git ~/.grunt-init/jquery ‣# entre na pasta que vai criar o seu projeto ‣ grunt-init jquery ‣ npm install grunt --save-dev ‣ npm install
  • 72.
  • 73. ‣# brincou com o plugin?
  • 74. ‣# brincou com o plugin? ‣# fez commit?
  • 75. ‣# brincou com o plugin? ‣# fez commit? ‣ git tag 0.1.0
  • 76. ‣# brincou com o plugin? ‣# fez commit? ‣ git tag 0.1.0 ‣ git push origin --tags
  • 77.
  • 78.