$30 off During Our Annual Pro Sale. View Details »

Melhorias e performance com Webpack

Melhorias e performance com Webpack

Talk para o JSSP

Caio Incau

March 14, 2018
Tweet

More Decks by Caio Incau

Other Decks in Programming

Transcript

  1. As otimizações podem ser separadas em 3 tópicos principais: DIMINUIR

    O TAMANHO DO FRONT Reduzir o tamanho dos arquivos servidos no Front-End MELHORIAS DE CACHE Melhores práticas de cache para evitar que a aplicação seja toda recarregada. MONITORAR E ANALISAR A APLICAÇÃO Monitoria previne que após aplicar as nossas otimizações, os problemas não voltem a ocorrer.
  2. Minifique seu JS const webpack = require('webpack'); module.exports = {

    plugins: [ new webpack.optimize.UglifyJsPlugin(), ], };
  3. Código compilado "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true });

    /* harmony export (immutable) */ __webpack_exports__["render"] = render; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__comments_css__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__comments_css_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0__comments_css__); function render(data, target) { console.log('Rendered!'); }
  4. Código minificado // minified bundle.js (part of) "use strict";function t(e,n){console.log("Rendered!")}

    Object.defineProperty(n,"__esModule",{value:!0}),n.render=t;var o=r(1);r.n(o)
  5. Minificando CSS module.exports = { module: { rules: [ {

    test: /\.css$/, use: [ 'style-loader', { loader: 'css-loader', options: { minimize: true } }], }, ], } };
  6. module.exports = { plugins: [ new webpack.DefinePlugin({ 'process.env.NODE_ENV': '"production"', }),

    new webpack.optimize.UglifyJsPlugin(), ], }; Como usar o DefinePlugin
  7. VS CÓDIGO PURO CÓDIGO SUBSTÍTUDO if (typeof val === 'string')

    { name = camelize(val); res[name] = { type: null }; } if (process.env.NODE_ENV !== 'production') { warn('props use array syntax.'); } if (typeof val === 'string') { name = camelize(val); res[name] = { type: null }; } if ("production" !== 'production') { warn('props use array syntax.'); }
  8. if (typeof val === 'string') { name = camelize(val); res[name]

    = { type: null }; } Código após Uglify
  9. // comments.js export const render = () => { return

    'Rendered!'; }; export const commentRestEndpoint = '/rest/comments'; // index.js import { render } from './comments.js'; render(); Use ES imports
  10. module.exports = { module: { rules: [ { test: /\.(jpe?g|png|gif)$/,

    loader: 'url-loader', options: { limit: 10 * 1024, }, }], }}; Tratando imagens
  11. const webpack = require('webpack'); module.exports = { plugins: [ new

    webpack.optimize.ModuleConcatenationPlugin(), ], }; ES modules até na compilação
  12. CHUNK HASH module.exports = { entry: './index.js', output: { filename:

    'bundle.[chunkhash].js', // ! bundle.8e0d62a03.js }, };
  13. VENDORS CHUNK module.exports = { plugins: [ new webpack.optimize.CommonsChunkPlugin({ name:

    'vendor', minChunks: module => module.context && module.context.includes('node_modules'), }), ], };
  14. CODE SPLIT module.exports = { entry: { home: './src/Home/index.js', article:

    './src/Article/index.js', profile: './src/Profile/index.js' }, };
  15. BUNDLE SIZE npm install bundlesize --save-dev { "bundlesize": [ {

    "path": "./dist/main.*.js", "maxSize": "20 kB", }, { "path": "./dist/vendor.*.js", "maxSize": "35 kB", } ] }
  16. WEBPACK BUNDLE ANALYZER npm install webpack-bundle-analyzer --save-dev const BundleAnalyzerPlugin =

    require('webpack-bundle- analyzer').BundleAnalyzerPlugin; module.exports = { plugins: [ new BundleAnalyzerPlugin() ] };