Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(bundle): update bundle strategy #3260

Merged
merged 39 commits into from
Dec 13, 2018
Merged

feat(bundle): update bundle strategy #3260

merged 39 commits into from
Dec 13, 2018

Conversation

francoischalifour
Copy link
Member

@francoischalifour francoischalifour commented Nov 12, 2018

This updates the bundle strategy.

Migrate from Webpack to Rollup

Rollup is now used to bundle InstantSearch.js. Rollup is more suited for libraries. It allows us to create lighter bundles and multiple bundle strategies.

Webpack Rollup
Bundle 372 kB 301 kB
GZipped 97 kB 84 kB

This sizes are without any further optimizations (will come gradually).

Different bundles

This is what is exported:

dist
├── instantsearch.development.js
├── instantsearch.development.js.map
├── instantsearch.production.min.js
└── instantsearch.production.min.js.map
cjs
├── components
├── connectors
├── helpers
├── index.js
├── lib
├── src
└── widgets
es
├── components
├── connectors
├── helpers
├── index.js
├── lib
└── widgets
See outdated (probably for InstantSearch.js version 4)
dist
├── cjs
│   ├── components
│   ├── connectors
│   ├── helpers
│   ├── index.js
│   ├── lib
│   └── widgets
├── es
│   ├── components
│   ├── connectors
│   ├── helpers
│   ├── index.js
│   ├── lib
│   └── widgets
└── umd
    ├── instantsearch.development.js
    ├── instantsearch.development.js.map
    ├── instantsearch.production.min.js
    └── instantsearch.production.min.js.map

UMD

The files have been renamed to become clearer for the users.

Usage

<script src="instantsearch.production.min.js"></script>

CJS

Usage

const instantsearch = require('instantsearch.js').default

ES

No changes.

See outdated (probably for InstantSearch.js version 4)

The ES bundle now exports instantsearch, and all widgets, connectors and helpers (highlight and snippet) at the root level.

Usage

import instantsearch, {
  searchbox,
  connectHits,
  highlight,
} from 'instantsearch.js';

const search = instantsearch();
search.addWidget(searchbox());

search.start();

The developer won't have to specify the old path:

import { searchbox } from 'instantsearch.js/es/widgets';

This is a pattern that we started with React InstantSearch (see new packages).

Development and production bundles

Since the bundle is getting heavy, the migration to Rollup has made it easier to create separate UMD bundles:

  • instantsearch.development.js
  • instantsearch.production.min.js

These names were inspired by the React strategy.

The development bundle will include everything that the default bundle has so far. The production bundle will not include the warnings (everything that is runtime) and the verbose widget/connector usages.

Everything under this condition will get stripped in the production bundle:

if (__DEV__) {
  // development only
}

In the CJS and ES bundle, it's converted to:

if (process.env.NODE_ENV === 'development') {
  // development only
}

What's next

This new bundle strategy allows to gradually remove development feature from the production bundle.

- Migrate from Webpack to Rollup
- Create "development" and "production" builds
The widget, connectors and helpers are now available at the root level:

```js
import instantsearch, { searchbox } from 'instantsearch.js';

const search = instantsearch();
search.addWidget(
  searchbox()
);

search.start();
```
@francoischalifour francoischalifour requested a review from a team November 12, 2018 14:19
scripts/rollup.config.js Outdated Show resolved Hide resolved
scripts/rollup.config.js Outdated Show resolved Hide resolved
@algobot
Copy link
Contributor

algobot commented Nov 13, 2018

Deploy preview for instantsearchjs ready!

Built with commit d5f1543

https://deploy-preview-3260--instantsearchjs.netlify.com

Copy link
Contributor

@samouss samouss left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you tried to run an application with each of the version (cjs, es, umd) ?

.babelrc Show resolved Hide resolved
.babelrc Outdated Show resolved Hide resolved
.babelrc Show resolved Hide resolved
.babelrc Show resolved Hide resolved
package.json Outdated Show resolved Hide resolved
scripts/rollup.config.js Outdated Show resolved Hide resolved
@francoischalifour
Copy link
Member Author

@samouss Yes, I created an app for each bundle. I also updated the PR description to add each usage.

Copy link
Contributor

@samouss samouss left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be nice to build the Vue version with the new build to see any size differences. It might be possible that the build will increase because Rollup will not be able to correctly tree shake the InstantSearch imports.

package.json Outdated Show resolved Hide resolved
src/index.es.js Outdated Show resolved Hide resolved
@francoischalifour francoischalifour changed the base branch from feat/3.0 to v3 November 26, 2018 12:30
@francoischalifour
Copy link
Member Author

The branch has been updated to not rename the CJS and ES bundle in order to facilitate the usage in other libraries for now (the original post has been updated).

Happy to review this PR as a group since the changes can seem quite consequent.

Copy link
Contributor

@Haroenv Haroenv left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yay 🙌

@francoischalifour francoischalifour merged commit a7dab81 into v3 Dec 13, 2018
@francoischalifour francoischalifour deleted the feat/3.0-bundle branch December 13, 2018 14:30
@francoischalifour
Copy link
Member Author

🎉

francoischalifour added a commit that referenced this pull request Dec 14, 2018
<a name=3.0.0-beta.1></a>
# [3.0.0-beta.1](v2.10.3...v3.0.0-beta.1) (2018-12-14)

### Bug Fixes

* **api:** remove transformData ([#3241](#3241)) ([5232936](5232936))
* **breadcrumb:** fix story with transformed label ([5a39312](5a39312))
* **breadcrumb:** rename item's name to label ([#3273](#3273)) ([0189cb4](0189cb4))
* **breadcrumb:** rename noRefinement to noRefinementRoot ([#3272](#3272)) ([21a5c61](21a5c61))
* **community:** fix search config ([#3142](#3142)) ([2b41982](2b41982))
* **configure:** make lifecycle functions optional ([#3339](#3339)) ([2b88cfa](2b88cfa))
* **connectRangeSlider:** remove deprecated connector ([#3189](#3189)) ([096ebeb](096ebeb))
* **current-refinements:** remove alphabetic sorting ([#3249](#3249)) ([9914f87](9914f87)), closes [/github.com/algolia/instantsearch.js/blob/011d47909894837f2c2da5088bc81803135d201b/src/lib/utils.js#L249](https://github.com//github.com/algolia/instantsearch.js/blob/011d47909894837f2c2da5088bc81803135d201b/src/lib/utils.js/issues/L249)
* **getRefinements:** provide attributeName for type: query ([6006fe1](6006fe1)), closes [#3205](#3205)
* **highlight:** avoid to ignore highlightedTagName ([#3323](#3323)) ([9871829](9871829))
* **highlight:** HighLight -> Highlight ([#3324](#3324)) ([5b4600d](5b4600d))
* **hits:** transform items after escaping ([#3251](#3251)) ([c46b82a](c46b82a)), closes [#3250](#3250)
* **infiniteHits:** move  option to templates ([#3300](#3300)) ([1828d66](1828d66))
* **InfiniteHits:** set the correct class for the last page ([#3232](#3232)) ([f604835](f604835))
* **lint:** remove unused import ([a9ec14c](a9ec14c))
* **pagination:** rename  to  ([#3275](#3275)) ([336945b](336945b))
* **poweredBy:** export connectPoweredBy connector ([#3331](#3331)) ([7d48c46](7d48c46))
* **poweredBy:** fix CSS classes ([#3332](#3332)) ([abc9b82](abc9b82))
* **range-input:** fix button classname ([#3234](#3234)) ([56695e1](56695e1)), closes [algolia/instantsearch-specs#92](algolia/instantsearch-specs#92)
* **range-input:** remove templates ([#3128](#3128)) ([94a1ce5](94a1ce5))
* **rangeInput:** convert labels to templates ([#3312](#3312)) ([cdf91e8](cdf91e8))
* **rangeSlider:** fix CSS classes ([#3316](#3316)) ([56a5255](56a5255))
* **refinement-list:** remove  in story ([0bf8db1](0bf8db1))
* **routing:** enforce RoutingManager is the last widget ([#3149](#3149)) ([1e86b2e](1e86b2e)), closes [#3148](#3148)
* **searchbox:** fix  and  templates ([#3313](#3313)) ([4e13122](4e13122))
* **tests:** add react-test-renderer ([176494b](176494b))
* **toggleRefinement:** provide  to templates ([#3303](#3303)) ([f515b62](f515b62))

### Features

* **3.0:** remove named exports on widgets ([#3129](#3129)) ([e718ea3](e718ea3))
* **breadcrumb:** implement InstantSearch.css ([#3115](#3115)) ([84d9f18](84d9f18))
* **bundle:** update bundle strategy ([#3260](#3260)) ([a7dab81](a7dab81))
* **clearRefinements:** implement InstantSearch.css ([#3308](#3308)) ([d98ecaf](d98ecaf)), closes [#3299](#3299)
* **clearRefinements:** implement is.css ([#3114](#3114)) ([11cdc14](11cdc14))
* **current-refinements:** implement InstantSearch.css ([#3190](#3190)) ([a70917d](a70917d))
* **GeoSearch:** implement InstantSearch.css ([#3138](#3138)) ([1867d30](1867d30))
* **hierarchical-menu:** implement InstantSearch.css ([#3182](#3182)) ([be0890d](be0890d))
* **hierarchical-menu:** implement show more feature ([#3151](#3151)) ([f54fccd](f54fccd))
* **hierarchicalMenu:** merge showMore templates ([#3318](#3318)) ([0059251](0059251))
* **highlight:** export highlight function ([#3137](#3137)) ([d4b6fb1](d4b6fb1))
* **highlight:** implement InstantSearch.css ([#3132](#3132)) ([260a0b8](260a0b8))
* **hits:** implement InstantSearch.css ([#3096](#3096)) ([b3cc413](b3cc413))
* **hits-per-page:** implement InstantSearch.css ([#3125](#3125)) ([49e7096](49e7096))
* **infiniteHits:** rename showMore template to showMoreText ([#3330](#3330)) ([babad39](babad39))
* **menu:** implement InstantSearch.css ([#3181](#3181)) ([a274ab7](a274ab7))
* **menu:** merge showMore templates ([#3328](#3328)) ([73a450b](73a450b))
* **menuSelect:** implement is.css ([#3109](#3109)) ([43e654a](43e654a))
* **numeric-menu:** implement InstantSearch.css ([#3162](#3162)) ([f5358f4](f5358f4))
* **numericSelector:** remove widget ([#3183](#3183)) ([e9063c0](e9063c0))
* **pagination:** implement InstantSearch.css ([#3119](#3119)) ([f3c3343](f3c3343))
* **pagination:** rename labels to templates ([#3333](#3333)) ([9f24098](9f24098))
* **panel:** add Panel widget ([#3253](#3253)) ([82e19fc](82e19fc))
* **poweredBy:** disable setting URL from widget ([#3334](#3334)) ([a5ff6af](a5ff6af))
* **poweredBy:** implement InstantSearch.css ([#3164](#3164)) ([bcc18a0](bcc18a0))
* **poweredBy:** update logo ([#3256](#3256)) ([838abec](838abec))
* **price-ranges:** implement InstantSearch.css ([#3124](#3124)) ([335339b](335339b))
* **range-input:** implement InstantSearch.css ([#3098](#3098)) ([ee6bc7e](ee6bc7e))
* **range-slider:** implement InstantSearch.css ([#3126](#3126)) ([b9b8d31](b9b8d31))
* **rating-menu:** implement InstantSearch.css ([#3161](#3161)) ([d039e11](d039e11))
* **ratingMenu:** merge labels and templates ([#3317](#3317)) ([505a2e7](505a2e7))
* **refinement-list:** implement InstantSearch.css ([#3152](#3152)) ([11c5580](11c5580))
* **refinement-list:** implement InstantSearch.css (2) ([#3179](#3179)) ([0365641](0365641))
* **refinement-list:** implement InstantSearch.css to searchbox ([#3263](#3263)) ([ad905c7](ad905c7))
* **refinementList:** merge showMore templates ([#3329](#3329)) ([9b6a9c4](9b6a9c4))
* **search-client:** use search client ([#3133](#3133)) ([8e70a3e](8e70a3e))
* **searchbox:** implement InstantSearch.css ([#3127](#3127)) ([c68c1fe](c68c1fe))
* **snippet:** implement InstantSearch.css ([#3134](#3134)) ([fa56657](fa56657))
* **sort-by:** implement InstantSearch.css ([#3120](#3120)) ([5f21723](5f21723))
* **sortBy:** rename item  to  ([#3230](#3230)) ([9e24a68](9e24a68))
* **stats:** implement InstantSearch.css ([#3097](#3097)) ([63a688e](63a688e))
* **stories:** add default CurrentRefinements story ([#3252](#3252)) ([45a8fd5](45a8fd5))
* **suit:** Default component names to empty object ([0b26356](0b26356))
* **suit-helper:** provide a helper to create suit css classnames ([f142496](f142496))
* **toggleRefinement:** implement InstantSearch.css ([#3135](#3135)) ([d67a437](d67a437))
* **widgets:** use warn utils ([#3175](#3175)) ([3164b06](3164b06))
* compress templates ([#3176](#3176)) ([54f2f77](54f2f77)), closes [#3095](#3095)
francoischalifour added a commit to algolia/autocomplete that referenced this pull request Nov 9, 2020
This adopts a similar strategy to InstantSearch (algolia/instantsearch#3260) for our bundles as well as our development warnings (algolia/instantsearch#3574).
francoischalifour added a commit to algolia/autocomplete that referenced this pull request Nov 9, 2020
This adopts a similar strategy to InstantSearch (algolia/instantsearch#3260) for our bundles as well as our development warnings (algolia/instantsearch#3574).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants