{"title":"JavaScript","version":"2.0","locale":"pt-br","docname":"internals/contributing/writing-code/javascript","url":"/pt-br/2.0/internals/contributing/writing-code/javascript/","canonical":"https://djangodocs.dev/pt-br/2.0/internals/contributing/writing-code/javascript/","summary":"Embora a maior parte do núcleo do Django seja escrito em Python, alguns apps como o admin e gis contém código JavaScript. Por favor siga esses padrões de código…","html":"<h1>JavaScript<a class=\"heading-anchor\" href=\"#javascript\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Embora a maior parte do núcleo do Django seja escrito em Python, alguns apps como o <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code> e <code class=\"docutils literal notranslate\"><span class=\"pre\">gis</span></code> contém código JavaScript.</p>\n<p>Por favor siga esses padrões de código quando estiver escrevendo código em JavaScript para inclusão no Django.</p>\n<section id=\"code-style\">\n<h2>Estilo de código<a class=\"heading-anchor\" href=\"#code-style\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<ul class=\"simple\">\n<li><p>Por favor adapte-se ao estilo de identação ditado no arquivo <code class=\"docutils literal notranslate\"><span class=\"pre\">.editorconfig</span></code>. Nós recomendamos usar o editor de textos com suporte a <a class=\"reference external\" href=\"http://editorconfig.org/\">EditorConfig</a> para evitar problemas com identação e espaços em branco. A maioria dos arquivos JavaScript usam 4 espaços para identação, mas existem algumas exceções.</p></li>\n<li><p>Quando estiver nomeando variáveis, use <code class=\"docutils literal notranslate\"><span class=\"pre\">camelCase</span></code> ao invés de <code class=\"docutils literal notranslate\"><span class=\"pre\">underscore_case</span></code>. Arquivos JavaScript diferentes algumas vezes usam estilos de código diferentes. Por favor tente se adequar aos padrões de estilo de cada arquivo.</p></li>\n<li><p>Utilize o <a class=\"reference external\" href=\"http://jshint.com/\">JSHint</a> code linter para verificar bugs e erros de estilo no seu código. JSHint irá rodar quando você executar os testes JavaScript. Nós também recomendamos instalar o JSHint no seu editor de textos.</p></li>\n<li><p>Where possible, write code that will work even if the page structure is later\nchanged with JavaScript. For instance, when binding a click handler, use\n<code class=\"docutils literal notranslate\"><span class=\"pre\">$('body').on('click',</span> <span class=\"pre\">selector,</span> <span class=\"pre\">func)</span></code> instead of\n<code class=\"docutils literal notranslate\"><span class=\"pre\">$(selector).click(func)</span></code>. This makes it easier for projects to extend\nDjango’s default behavior with JavaScript.</p></li>\n</ul>\n</section>\n<section id=\"javascript-patches\">\n<span id=\"id1\"></span><h2>Patches JavaScript<a class=\"heading-anchor\" href=\"#javascript-patches\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>O admin do Django usa o framework jQuery para aumentar as capacidades da interface de administração. Além disso, existe uma ênfase na performance do JavaScript do admin e em minimizar o tamanho de arquivos de media do admin. Servir versões comprimidas ou “minificadas” dos arquivos JavaScript é considerado uma boa prática nesse quesito.</p>\n<p>Por isso, patches para arquivos JavaScript devem incluir tanto código original para futuro desenvolvimento (e.g. <code class=\"docutils literal notranslate\"><span class=\"pre\">foo.js</span></code>), quanto uma versão comprimida para uso em produção (e.g. <code class=\"docutils literal notranslate\"><span class=\"pre\">foo.min.js</span></code>). Quaisquer links para o arquivo no projeto devem apontar para a versão comprimida.</p>\n<section id=\"compressing-javascript\">\n<h3>Comprimindo JavaScript<a class=\"heading-anchor\" href=\"#compressing-javascript\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Para simplificar o processo de fornecimento de código JavaScript otimizado, O Django inclui um script Python extremamente útil que deve ser utilizado na criação da versão “minificada”. Para executá-lo:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>pip<span class=\"w\"> </span>install<span class=\"w\"> </span>closure\n<span class=\"gp\">$ </span>python<span class=\"w\"> </span>django/contrib/admin/bin/compress.py\n</code></pre></div>\n<p>Por trás das cortinas, <code class=\"docutils literal notranslate\"><span class=\"pre\">compress.py</span></code> é um front-end para o <a class=\"reference external\" href=\"https://developers.google.com/closure/compiler/\">Compilador Closure `_ do Google que é escrito em Java. A biblioteca do Compilador Closure não é distribuída com o Django, mas você pode instalá-la usando pip como feito acima. A biblioteca do Compilador Closure requer `Java</a> 7 ou versões maiores.</p>\n<p>Por favor não se esqueça de rodar o <code class=\"docutils literal notranslate\"><span class=\"pre\">compress.py</span></code> e incluir o <code class=\"docutils literal notranslate\"><span class=\"pre\">diff</span></code> dos scripts minificados  quando estiver enviando os seus patches para o JavaScript do Django.</p>\n</section>\n</section>\n<section id=\"javascript-tests\">\n<span id=\"id2\"></span><h2>Testes JavaScript<a class=\"heading-anchor\" href=\"#javascript-tests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Os testes para o JavaScript do Django podem ser rodados em um browser ou diretamente da linha de comando. Os testes estão localizados no diretório <code class=\"docutils literal notranslate\"><span class=\"pre\">js_tests</span></code>.</p>\n<section id=\"writing-tests\">\n<h3>Escrevendo testes<a class=\"heading-anchor\" href=\"#writing-tests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Os testes em JavaScript do Django utilizam <a class=\"reference external\" href=\"https://qunitjs.com/\">QUnit</a>. Segue um exemplo de teste de um módulo.</p>\n<div class=\"code-block\" data-language=\"javascript\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">JavaScript</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"JavaScript code\"><code><span class=\"nx\">QUnit</span><span class=\"p\">.</span><span class=\"nx\">module</span><span class=\"p\">(</span><span class=\"s1\">&#39;magicTricks&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"nx\">beforeEach</span><span class=\"o\">:</span><span class=\"w\"> </span><span class=\"kd\">function</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">        </span><span class=\"kd\">var</span><span class=\"w\"> </span><span class=\"nx\">$</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">django</span><span class=\"p\">.</span><span class=\"nx\">jQuery</span><span class=\"p\">;</span>\n<span class=\"w\">        </span><span class=\"nx\">$</span><span class=\"p\">(</span><span class=\"s1\">&#39;#qunit-fixture&#39;</span><span class=\"p\">).</span><span class=\"nx\">append</span><span class=\"p\">(</span><span class=\"s1\">&#39;&lt;button class=&quot;button&quot;&gt;&lt;/button&gt;&#39;</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"p\">}</span>\n<span class=\"p\">});</span>\n\n<span class=\"nx\">QUnit</span><span class=\"p\">.</span><span class=\"nx\">test</span><span class=\"p\">(</span><span class=\"s1\">&#39;removeOnClick removes button on click&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">assert</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"kd\">var</span><span class=\"w\"> </span><span class=\"nx\">$</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">django</span><span class=\"p\">.</span><span class=\"nx\">jQuery</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"nx\">removeOnClick</span><span class=\"p\">(</span><span class=\"s1\">&#39;.button&#39;</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"nx\">assert</span><span class=\"p\">.</span><span class=\"nx\">equal</span><span class=\"p\">(</span><span class=\"nx\">$</span><span class=\"p\">(</span><span class=\"s1\">&#39;.button&#39;</span><span class=\"p\">).</span><span class=\"nx\">length</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mf\">1</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"nx\">$</span><span class=\"p\">(</span><span class=\"s1\">&#39;.button&#39;</span><span class=\"p\">).</span><span class=\"nx\">click</span><span class=\"p\">();</span>\n<span class=\"w\">    </span><span class=\"nx\">assert</span><span class=\"p\">.</span><span class=\"nx\">equal</span><span class=\"p\">(</span><span class=\"nx\">$</span><span class=\"p\">(</span><span class=\"s1\">&#39;.button&#39;</span><span class=\"p\">).</span><span class=\"nx\">length</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mf\">0</span><span class=\"p\">);</span>\n<span class=\"p\">});</span>\n\n<span class=\"nx\">QUnit</span><span class=\"p\">.</span><span class=\"nx\">test</span><span class=\"p\">(</span><span class=\"s1\">&#39;copyOnClick adds button on click&#39;</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kd\">function</span><span class=\"p\">(</span><span class=\"nx\">assert</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">    </span><span class=\"kd\">var</span><span class=\"w\"> </span><span class=\"nx\">$</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nx\">django</span><span class=\"p\">.</span><span class=\"nx\">jQuery</span><span class=\"p\">;</span>\n<span class=\"w\">    </span><span class=\"nx\">copyOnClick</span><span class=\"p\">(</span><span class=\"s1\">&#39;.button&#39;</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"nx\">assert</span><span class=\"p\">.</span><span class=\"nx\">equal</span><span class=\"p\">(</span><span class=\"nx\">$</span><span class=\"p\">(</span><span class=\"s1\">&#39;.button&#39;</span><span class=\"p\">).</span><span class=\"nx\">length</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mf\">1</span><span class=\"p\">);</span>\n<span class=\"w\">    </span><span class=\"nx\">$</span><span class=\"p\">(</span><span class=\"s1\">&#39;.button&#39;</span><span class=\"p\">).</span><span class=\"nx\">click</span><span class=\"p\">();</span>\n<span class=\"w\">    </span><span class=\"nx\">assert</span><span class=\"p\">.</span><span class=\"nx\">equal</span><span class=\"p\">(</span><span class=\"nx\">$</span><span class=\"p\">(</span><span class=\"s1\">&#39;.button&#39;</span><span class=\"p\">).</span><span class=\"nx\">length</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"mf\">2</span><span class=\"p\">);</span>\n<span class=\"p\">});</span>\n</code></pre></div>\n<p>Please consult the QUnit documentation for information on the types of\n<a class=\"reference external\" href=\"https://api.qunitjs.com/assert/\">assertions supported by QUnit</a>.</p>\n</section>\n<section id=\"running-tests\">\n<h3>Rodando testes<a class=\"heading-anchor\" href=\"#running-tests\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Os testes JavaScript pode ser executados de um browser ou diretamente da linha de comando.</p>\n<section id=\"testing-from-a-web-browser\">\n<h4>Testando de um browser<a class=\"heading-anchor\" href=\"#testing-from-a-web-browser\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Para executar os testes através de um browser, abra o arquivo <code class=\"docutils literal notranslate\"><span class=\"pre\">js_tests/tests.html</span></code> dentro do seu browser.</p>\n<p>Para medir a cobertura de código quando estiver executando os testes, você precisará visualizar o arquivo através de um servidor HTTP. Para ver a cobertura de código:</p>\n<ul class=\"simple\">\n<li><p>Execute <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">-m</span> <span class=\"pre\">http.server</span></code> from the root directory (not from inside\n<code class=\"docutils literal notranslate\"><span class=\"pre\">js_tests</span></code>).</p></li>\n<li><p>Acesse o endereço <a class=\"reference external\" href=\"http://localhost:8000/js_tests/tests.html\">http://localhost:8000/js_tests/tests.html</a> no seu browser.</p></li>\n</ul>\n</section>\n<section id=\"testing-from-the-command-line\">\n<h4>Testando da linha de comando<a class=\"heading-anchor\" href=\"#testing-from-the-command-line\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>Para executar os testes da linha de comando, você precisará ter o <a class=\"reference external\" href=\"https://nodejs.org/\">Node.js</a> instalado.</p>\n<p>Depois de instalar o Node.js, instale as dependências dos testes em JavaScript executando o comando seguinte do diretório raiz no qual o código fonte do Django foi baixado:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>npm<span class=\"w\"> </span>install\n</code></pre></div>\n<p>E então rode os testes com:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>npm<span class=\"w\"> </span><span class=\"nb\">test</span>\n</code></pre></div>\n</section>\n</section>\n</section>","rootId":"javascript","toc":[{"title":"Estilo de código","anchor":"code-style","children":[]},{"title":"Patches JavaScript","anchor":"javascript-patches","children":[{"title":"Comprimindo JavaScript","anchor":"compressing-javascript","children":[]}]},{"title":"Testes JavaScript","anchor":"javascript-tests","children":[{"title":"Escrevendo testes","anchor":"writing-tests","children":[]},{"title":"Rodando testes","anchor":"running-tests","children":[{"title":"Testando de um browser","anchor":"testing-from-a-web-browser","children":[]},{"title":"Testando da linha de comando","anchor":"testing-from-the-command-line","children":[]}]}]}],"breadcrumbs":[{"docname":"internals/index","title":"Funcionamento interno do Projeto Django","url":"/pt-br/2.0/internals/"},{"docname":"internals/contributing/index","title":"Contribuindo com o Django","url":"/pt-br/2.0/internals/contributing/"},{"docname":"internals/contributing/writing-code/index","title":"Escrevendo código","url":"/pt-br/2.0/internals/contributing/writing-code/"}],"prev":{"docname":"internals/contributing/writing-code/working-with-git","title":"Trabalhando com Git e GitHub","url":"/pt-br/2.0/internals/contributing/writing-code/working-with-git/"},"next":{"docname":"internals/contributing/writing-documentation","title":"Escrevendo a documentação","url":"/pt-br/2.0/internals/contributing/writing-documentation/"},"formats":{"html":"/pt-br/2.0/internals/contributing/writing-code/javascript/","markdown":"/pt-br/2.0/internals/contributing/writing-code/javascript.md","json":"/pt-br/2.0/internals/contributing/writing-code/javascript.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/internals/contributing/writing-code/javascript.txt","official":"https://docs.djangoproject.com/pt-br/2.0/internals/contributing/writing-code/javascript/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}