{"id":13465080,"url":"https://github.com/GoogleChromeLabs/webpack-libs-optimizations","last_synced_at":"2025-03-25T13:33:01.626Z","repository":{"id":50276198,"uuid":"118178782","full_name":"GoogleChromeLabs/webpack-libs-optimizations","owner":"GoogleChromeLabs","description":"Using a library in your webpack project? Here’s how to optimize it","archived":false,"fork":false,"pushed_at":"2022-11-12T19:25:48.000Z","size":52,"stargazers_count":3366,"open_issues_count":9,"forks_count":111,"subscribers_count":93,"default_branch":"master","last_synced_at":"2024-10-10T16:42:27.106Z","etag":null,"topics":["frontend","performance","webpack"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GoogleChromeLabs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-01-19T21:09:35.000Z","updated_at":"2024-10-09T04:44:59.000Z","dependencies_parsed_at":"2022-08-03T08:00:37.299Z","dependency_job_id":null,"html_url":"https://github.com/GoogleChromeLabs/webpack-libs-optimizations","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GoogleChromeLabs%2Fwebpack-libs-optimizations","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GoogleChromeLabs%2Fwebpack-libs-optimizations/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GoogleChromeLabs%2Fwebpack-libs-optimizations/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GoogleChromeLabs%2Fwebpack-libs-optimizations/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GoogleChromeLabs","download_url":"https://codeload.github.com/GoogleChromeLabs/webpack-libs-optimizations/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":222074960,"owners_count":16926640,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["frontend","performance","webpack"],"created_at":"2024-07-31T14:00:57.818Z","updated_at":"2024-10-29T16:30:33.101Z","avatar_url":"https://github.com/GoogleChromeLabs.png","language":null,"funding_links":[],"categories":["Others","miscellaneous","Other web performance lists"],"sub_categories":["Various tools"],"readme":"# Optimize your libraries with webpack\n\nUsing a library in your webpack project? Use these tips to make your bundle smaller!\n\nWant to add a tip? See [the contribution guide](/CONTRIBUTING.md) and make a pull request!\n\n\u003cimg src=\"https://i.imgur.com/tjFWoUj.png\" width=\"600\" /\u003e\n\nContents:\n\n* [`async`](#async)\n* [`async-es`](#async-es)\n* [`babel-polyfill`](#babel-polyfill)\n* [`core-js`](#core-js)\n* [`date-fns`](#date-fns)\n* [`handlebars`](#handlebars)\n* [`lodash`](#lodash)\n* [`lodash-es`](#lodash-es)\n* [`moment`](#moment)\n* [`moment-timezone`](#moment-timezone)\n* [`react`](#react)\n* [`ractive`](#ractive)\n* [`reactstrap`](#reactstrap)\n* [`react-bootstrap`](#react-bootstrap)\n* [`react-router`](#react-router)\n* [`styled-components`](#styled-components)\n* [`whatwg-fetch`](#whatwg-fetch)\n* [Solutions that work with multiple libraries](#solutions-that-work-with-multiple-libraries)\n    * [`babel-plugin-transform-imports`](#babel-plugin-transform-imports)\n    * [Templating languages: bundle just the runtime](#templating-languages-bundle-just-the-runtime)\n\n## async\n\n`async` is a collection of utilities for working with async functions. [npm package](https://www.npmjs.com/package/async)\n\nGenerally, you should use [the `async-es` package ⤵](#async-es) instead. It ships with ES modules and is more optimized for bundling with webpack.\n\nStill, even if prefer to use `async`, for the list of optimizations, see [the `async-es` section ⤵](#async-es).\n\n## async-es\n\n`async-es` is a collection of utilities for working with async functions. It’s the same package as [`async` ⤴](#async), but it’s more optimized for bundling with webpack. [npm package](https://www.npmjs.com/package/async-es)\n\n### Remove unused methods with `babel-plugin-lodash`\n\n\u003e ✅ Safe to use by default / How to enable is ↓ / Added by [@iamakulov](https://twitter.com/iamakulov)\n\nIf you use `async-es` as a single import, you’re bundling the whole library into the application – even if you only use a couple of its methods:\n\n```js\n// You only use `async.map`, but the whole library gets bundled\nimport async from 'async-es';\n\nasync.map(['file1', 'file2', 'file3'], fs.stat, function(err, results) {\n  console.log(results);\n});\n```\n\nUse [`babel-plugin-lodash`](https://github.com/lodash/babel-plugin-lodash) to pick only those `async-es` methods you need:\n\n```js\n// Before Babel is applied\nimport async from 'async-es';\n\nasync.map(['file1', 'file2', 'file3'], fs.stat, function(err, results) {\n  console.log(results);\n});\n\n↓\n\n// After Babel is applied\nimport _map from 'async-es/map';\n\n_map(['file1', 'file2', 'file3'], fs.stat, function(err, results) {\n  console.log(results);\n});\n```\n\nEnable this plugin as follows:\n\n```json\n// .babelrc\n{\n  \"plugins\": [[\"lodash\", { \"id\": [\"async-es\"] }]],\n}\n```\n\n## babel-polyfill\n\n`babel-polyfill` is a Babel’s package that loads `core-js` and a custom regenerator runtime. [Babel docs](https://babeljs.io/docs/usage/polyfill/) · [npm package](https://www.npmjs.com/package/babel-polyfill)\n\nFor the list of optimizations, see [the `core-js` section ⤵](#core-js).\n\n## core-js\n\n`core-js` is a set of polyfills for ES5 and ES2015+. [npm package](https://www.npmjs.com/package/core-js)\n\n### Remove unnecessary polyfills with `babel-preset-env`\n\n\u003e ✅ Safe to use by default / [How to enable](https://babeljs.io/docs/plugins/preset-env/#usebuiltins) / Added by [@iamakulov](https://twitter.com/iamakulov)\n\nIf you compile your code with Babel and `babel-preset-env`, add [the `useBuiltIns: true` option](https://babeljs.io/docs/plugins/preset-env/#usebuiltins). This option configures Babel to only include polyfills that are necessary for target browsers. I.e., if you target your app to support Internet Explorer 11:\n\n```json\n// .babelrc\n{\n  \"presets\": [\n    [\n      \"env\",\n      {\n        \"targets\": {\n          \"browsers\": [\"last 2 versions\", \"ie \u003e= 11\"]\n        }\n      }\n    ]\n  ]\n}\n```\n\nenabling `useBuiltIns: true` will remove polyfills for all features that Internet Explorer 11 already supports (such as `Object.create`, `Object.keys` and so on).\n\n### Ship non-transpiled code to modern browsers\n\n\u003e ✅ Safe to use by default / [How to enable](https://philipwalton.com/articles/deploying-es2015-code-in-production-today/) / Added by [@iamakulov](https://twitter.com/iamakulov)\n\nAll browsers that support `\u003cscript type=\"module\"\u003e` also support modern JS features like `async`/`await`, arrow functions and classes. Use this feature to build two versions of the bundle and make modern browsers load only the modern code. For the guide, see [the Philip Walton’s article](https://philipwalton.com/articles/deploying-es2015-code-in-production-today/).\n\n## date-fns\n\ndate-fns is a date utility library. [npm package](https://www.npmjs.com/package/date-fns)\n\n### Enable `babel-plugin-date-fns`\n\n\u003e ✅ Safe to use by default / [How to enable](https://github.com/date-fns/babel-plugin-date-fns) / Added by [@chentsulin](https://twitter.com/chentsulin)\n\n[`babel-plugin-date-fns`](https://github.com/date-fns/babel-plugin-date-fns) replaces full imports of date-fns with imports of specific date-fns functions:\n\n```js\nimport { format } from 'date-fns';\nformat(new Date(2014, 1, 11), 'MM/DD/YYYY');\n```\n\n↓\n\n```js\nimport _format from 'date-fns/format';\n_format(new Date(2014, 1, 11), 'MM/DD/YYYY');\n```\n\n## handlebars\n\nHandlebars is a templating library. [npm package](https://www.npmjs.com/package/handlebars)\n\n### Switch to build-time compiling\n\n\u003e ⚠ Use with caution / How to enable is ↓ / Added by [@danburzo](https://github.com/danburzo)\n\nIf you use `Handlebars.compile()` to compile templates in your app, switch to [`handlebars-loader`](https://github.com/pcardune/handlebars-loader). This way, you’ll compile templates during a webpack build – and won’t need to bundle the template-parsing part of the library.\n\nHere’s how to avoid bundling the template-parsing part of Handlebars:\n\n* Switch to [`handlebars-loader`](https://github.com/pcardune/handlebars-loader), if you haven’t yet\n* And either:\n   * replace all `import Handlebars from 'handlebars'` with `import Handlebars from 'handlebars/runtime'`\n   * or alias the module using `resolve.alias`:\n   \n      ```js\n      // webpack.config.js\n      {\n        // ...\n        resolve: {\n          alias: {\n            // Tip: `$` in the end of `handlebars$` means “exact match”: https://webpack.js.org/configuration/resolve/#resolvealias\n            // This’d disable aliasing – and prevent breaking the code – for imports like `handlebars/something.js`\n            handlebars$: path.resolve(__dirname, 'node_modules/handlebars/runtime.js')\n          }\n        }\n        // ...\n      }\n      ```\n\n**Use this optimization with caution.** Make sure your code does not use `Handlebars.compile()` anywhere, or your app will break.\n\n## lodash\n\nLodash is an utility library. [npm package](https://www.npmjs.com/package/lodash)\n\n### Enable `babel-plugin-lodash`\n\n\u003e ✅ Safe to use by default / [How to enable](https://github.com/lodash/babel-plugin-lodash) / Added by [@iamakulov](https://twitter.com/iamakulov)\n\n[`babel-plugin-lodash`](https://github.com/lodash/babel-plugin-lodash) replaces full imports of Lodash with imports of specific Lodash functions:\n\n```js\nimport _ from 'lodash';\n_.map([1, 2, 3], i =\u003e i + 1);\n```\n\n↓\n\n```js\nimport _map from 'lodash/map';\n_map([1, 2, 3], i =\u003e i + 1);\n```\n\nNote: the plugin doesn’t work with chain sequences – i.e. code like\n\n```js\n_([1, 2, 3]).map(i =\u003e i + 1).value();\n```\n\nwon’t be optimized.\n\n### Alias `lodash-es` to `lodash`\n\n\u003e ✅ Safe to use by default / How to enable is ↓ / Added by [@7rulnik](https://twitter.com/7rulnik)\n\nSome of your dependencies might use [the `lodash-es` package](https://www.npmjs.com/package/lodash-es) instead of `lodash`. If that’s the case, Lodash will be bundled twice.\n\nTo avoid this, alias the `lodash-es` package to `lodash`:\n\n```js\n// webpack.config.js\nmodule.exports = {\n  resolve: {\n    alias: {\n      'lodash-es': 'lodash',\n    },\n  },\n};\n```\n\n### Enable `lodash-webpack-plugin`\n\n\u003e ⚠ Use with caution / [How to enable](https://github.com/lodash/lodash-webpack-plugin) / Added by [@iamakulov](https://twitter.com/iamakulov)\n\n[`lodash-webpack-plugin`](https://github.com/lodash/lodash-webpack-plugin) strips parts of Lodash functionality that you don’t need. For example, if you use `_.get()` but don’t need deep path support, this plugin can remove it. Add it to your webpack config to make the bundle smaller.\n\n**Use the plugin with caution.** The default settings remove a lot of features, and your app might use some of them.\n\n## lodash-es\n\n`lodash-es` is Lodash with ES imports and exports. [npm package](https://www.npmjs.com/package/lodash-es)\n\nFor the list of optimizations, see [the `lodash` section ⤴](#lodash).\n\n## moment\n\nMoment.js is a library for working with dates. [npm package](https://www.npmjs.com/package/moment)\n\n### Remove unused locales with `moment-locales-webpack-plugin`\n\n\u003e ⚠ Use with caution / [How to enable](https://github.com/iamakulov/moment-locales-webpack-plugin) / Added by [@iamakulov](https://twitter.com/iamakulov)\n\nBy default, Moment.js ships with 160+ minified KBs of localization files. If your app is only available in a few languages, you won’t need all these files. Use [`moment-locales-webpack-plugin`](https://github.com/iamakulov/moment-locales-webpack-plugin) to remove the unused ones.\n\n**Use the plugin with caution.** The default settings remove all locales; this might break your app if you use some of them.\n\n## moment-timezone\n\nMoment Timezone is a plugin for Moment.js with full support for time zone calculations. [npm package](https://www.npmjs.com/package/moment-timezone)\n\n### Remove unused data with `moment-timezone-data-webpack-plugin`\n\n\u003e ⚠ Use with caution / [How to enable](https://github.com/gilmoreorless/moment-timezone-data-webpack-plugin) / Added by [@iamnotyourbroom](https://twitter.com/iamnotyourbroom)\n\nBy default, Moment Timezone includes as much time zone data as possible via a 900+ KB JSON file. In some cases this data includes dates in the 19th century. If your app can work with a smaller range of dates, or only needs specific time zones, most of that data is redundant. Use [`moment-timezone-data-webpack-plugin`](https://github.com/gilmoreorless/moment-timezone-data-webpack-plugin) to remove the unused data.\n\n**Use the plugin with caution.** Removing too much time zone data can cause subtle date calculation bugs. Make sure your app still has all the data it needs to function correctly.\n\n## ractive\n\nRactive is a UI templating library. [npm package](https://www.npmjs.com/package/ractive)\n\n### Switch to build-time compiling\n\n\u003e ⚠ Use with caution / How to enable is ↓ / Added by [@danburzo](https://github.com/danburzo)\n\nIf you’re compiling your Ractive templates on the go (e.g., by passing strings to `Ractive({ template })`, switch to [`ractive-loader`](https://www.npmjs.com/package/ractive-loader). This way, you’ll compile templates during a webpack build – and won’t need to bundle the template-parsing part of the library.\n\nHere’s how to avoid bundling the template-parsing part of Ractive:\n\n* Switch to [`ractive-loader`](https://www.npmjs.com/package/ractive-loader), if you haven’t yet\n* And alias the `ractive` module to the Ractive runtime using `resolve.alias`:\n   \n   ```js\n   // webpack.config.js\n   {\n     // ...\n     resolve: {\n       alias: {\n         // Tip: `$` in the end of `ractive$` means “exact match”: https://webpack.js.org/configuration/resolve/#resolvealias\n         // This’d disable aliasing – and prevent breaking the code – for imports like `ractive/something.js`\n         ractive$: path.resolve(__dirname, 'node_modules/ractive/runtime.min.js')\n       }\n     }\n     // ...\n   }\n   ```\n   \n**Use this optimization with caution.** Make sure your code does not compile any templates on the fly, or your app will break. Compiling templates on the fly happens whenever you pass a string to `Ractive({ template: ... })` or `Ractive.parse()`.\n\n## react\n\nReact is a library for building user interfaces. [npm package](https://www.npmjs.com/package/react)\n\n### Remove `propTypes` declarations in production\n\n\u003e ✅ Safe to use by default / [How to enable](https://www.npmjs.com/package/babel-plugin-transform-react-remove-prop-types) / Added by [@iamakulov](https://twitter.com/iamakulov)\n\nReact doesn’t perform `propTypes` checks in production, but the `propTypes` declarations still occupy a part of the bundle. Use [`babel-plugin-transform-react-remove-prop-types`](https://www.npmjs.com/package/babel-plugin-transform-react-remove-prop-types) to remove them from during building.\n\n### Migrate to an alternative React-like Library\n\n\u003e ⚠ Use with caution / Added by [@iamakulov](https://twitter.com/iamakulov) \u0026 [@kurtextrem](https://twitter.com/kurtextrem)\n\nThere are alternatives to React with a similar API that have a smaller size or a higher performance, but lack some features (e.g., fragments, portals, or synthetic events).\n\n- [Preact](https://github.com/developit/preact) | The smallest React alternative (`preact@8.3.1` + `preact-compat@3.18.3` is 7.6 kB gzipped; `react@16.4.0` + `react-dom@16.4.0` is 31.4 kB gzipped) | No synthetic events | IE8 supported with polyfills\n\n- [Nerv](https://github.com/NervJS/nerv) | Smaller than React, larger than Preact (`nervjs@1.3.3` is 9.8 kB gzipped, compat is not needed; `react@16.4.0` + `react-dom@16.4.0` is 31.4 kB gzipped) | The goal of Nerv is to have 100% the same API (without Fiber and Suspense), see [NervJS/nerv#10](https://github.com/NervJS/nerv/issues/10#issuecomment-356913486) for details | IE8 supported\n\n- [Inferno](https://github.com/infernojs/inferno) | Smaller than React, larger than Preact and Nerv (`inferno@5.4.2` + `inferno-compat@5.4.2` is 11.3 kB gzipped; `react@16.4.0` + `react-dom@16.4.0` is 31.4 kB gzipped) | Higher runtime performance than React, the highest performance among all React alternatives, [manual optimization possibilities offered](https://infernojs.org/docs/guides/optimizations) | Partial synthetic events | IE8 unsupported natively\n\n**Migrate to alternatives with caution.** Some of the alternatives don’t have synthetic events or are lacking some React 16 features ([Preact issue](https://github.com/developit/preact-compat/issues/432), [Inferno issue](https://github.com/infernojs/inferno/issues/501), [Nerv issue](https://github.com/NervJS/nerv/issues/5)). However, many projects still can be migrated without any codebase changes. See the migration guides: [Preact](https://preactjs.com/guide/switching-to-preact), [Inferno](https://infernojs.org/docs/guides/switching-to-inferno), [Nerv](https://github.com/NervJS/nerv#switching-to-nerv-from-react).\n\n## reactstrap\n\nReactstrap is a Bootstrap 4 library for React. [npm package](https://www.npmjs.com/package/reactstrap)\n\n### Remove unused modules with `babel-plugin-transform-imports`\n\n\u003e ✅ Safe to use by default / How to enable is ↓ / Added by [@kurtextrem](https://twitter.com/kurtextrem)\n\nWhen you import a module from Reactstrap:\n\n```js\nimport { Alert } from 'reactstrap';\n```\n\nother Reactstrap modules also get bundled into the app and make it larger.\n\nUse [`babel-plugin-transform-imports`](https://www.npmjs.com/package/babel-plugin-transform-imports) to strip unused modules:\n\n```json\n// .babelrc\n{\n  \"plugins\": [\n    [\"transform-imports\", {\n      \"reactstrap\": {\n        \"transform\": \"reactstrap/lib/${member}\",\n        \"preventFullImport\": true\n      }\n    }]\n  ]\n}\n```\n\nTo see how it works, check [the `babel-plugin-transform-imports` section ⤵️](#babel-plugin-transform-imports).\n\n## react-bootstrap\n\n`react-bootstrap` is a Bootstrap 3 library for React. [npm package](https://www.npmjs.com/package/react-bootstrap)\n\n### Remove unused modules with `babel-plugin-transform-imports`\n\n\u003e ✅ Safe to use by default / How to enable is ↓ / Added by [@kurtextrem](https://twitter.com/kurtextrem)\n\nWhen you import a module from `react-bootstrap`:\n\n```js\nimport { Alert } from 'react-bootstrap';\n```\n\nother `react-bootstrap` modules also get bundled into the app and make it larger.\n\nUse [`babel-plugin-transform-imports`](https://www.npmjs.com/package/babel-plugin-transform-imports) to strip unused modules:\n\n```json\n// .babelrc\n{\n  \"plugins\": [\n    [\"transform-imports\", {\n      \"react-bootstrap\": {\n        \"transform\": \"react-bootstrap/es/${member}\",\n        \"preventFullImport\": true\n      }\n    }]\n  ]\n}\n```\n\nTo see how it works, check [the `babel-plugin-transform-imports` section ⤵️](#babel-plugin-transform-imports).\n\n## react-router\n\nReact Router is a popular router solution for React. [npm package](https://www.npmjs.com/package/react-router)\n\n### Remove unused modules with `babel-plugin-transform-imports`\n\n\u003e ✅ Safe to use by default / How to enable is ↓ / Added by [@kurtextrem](https://twitter.com/kurtextrem)\n\nWhen you import a module from React Router:\n\n```js\nimport { withRouter } from 'react-router';\n```\n\nother React Router modules also get bundled into the app and make it larger.\n\nUse [`babel-plugin-transform-imports`](https://www.npmjs.com/package/babel-plugin-transform-imports) to strip unused modules:\n\n```json\n// .babelrc\n{\n  \"plugins\": [\n    [\"transform-imports\", {\n      \"react-router\": {\n        \"transform\": \"react-router/${member}\",\n        \"preventFullImport\": true\n      }\n    }]\n  ]\n}\n```\n\n(This was tested with React Router v4.)\n\nTo see how it works, check [the `babel-plugin-transform-imports` section ⤵️](#babel-plugin-transform-imports).\n\n## styled-components\n\n`styled-components` is a CSS-in-JS library. [npm package](https://www.npmjs.com/package/styled-components)\n\n### Minify the code with `babel-plugin-styled-components`\n\n\u003e ✅ Safe to use by default / [How to enable](https://github.com/styled-components/babel-plugin-styled-components) / Added by [@iamakulov](https://twitter.com/iamakulov)\n\nThere’s [`babel-plugin-styled-components`](https://github.com/styled-components/babel-plugin-styled-components) that minifies the CSS code you write with `styled-components`. See [the minification docs](https://www.styled-components.com/docs/tooling#minification).\n\n## whatwg-fetch\n\n`whatwg-fetch` is a complete `window.fetch()` polyfill. [npm package](https://www.npmjs.com/package/whatwg-fetch)\n\n### Replace with `unfetch`\n\n\u003e ⚠ Use with caution / How to migrate is ↓ / Added by [@iamakulov](https://twitter.com/iamakulov)\n\n[`unfetch`](https://github.com/developit/unfetch) is a 500 bytes polyfill for `window.fetch()`. Unlike `whatwg-fetch`, it doesn’t support the full `window.fetch()` API, but instead focuses on polyfilling the most used parts.\n\n**Migrate to `unfetch` with caution.** While it supports the most popular API parts, your app might break if it relies on something less common.\n\n## Solutions that work with multiple libraries\n\nOf course, there are also optimization tips for other libraries too. You can use them with common sense to get smaller or more performant bundles.\n\n### `babel-plugin-transform-imports`\n\n\u003e ✅ Safe to use by default / [How to enable](https://www.npmjs.com/package/babel-plugin-transform-imports) / Added by [@kurtextrem](https://twitter.com/kurtextrem) / More Insight about this on [Twitter](https://twitter.com/iamakulov/status/962991382213398529)\n\nThis handy babel plugin will transform your imports to only import specific components, which ensures not the whole library gets included (if tree-shaking is ineffective for the specific library).\n```js\n// Before\nimport { Grid, Row, Col } from 'react-bootstrap';\n// After\nimport Grid from 'react-bootstrap/lib/Grid';\nimport Row from 'react-bootstrap/lib/Row';\nimport Col from 'react-bootstrap/lib/Col';\n```\n\n# License\n\nCopyright 2018 Google Inc. All Rights Reserved. Licensed under [the Apache License, Version 2.0](/LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGoogleChromeLabs%2Fwebpack-libs-optimizations","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FGoogleChromeLabs%2Fwebpack-libs-optimizations","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGoogleChromeLabs%2Fwebpack-libs-optimizations/lists"}