-
Notifications
You must be signed in to change notification settings - Fork 332
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(js): change renderer implementation to virtual DOM #381
Conversation
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. Latest deployment of this branch, based on commit 4a3d11c:
|
I think |
@Haroenv I initially called it |
Those are indeed the name of the options, but not really what you interact with as a user, which is h, createElement or jsx |
Yeah that makes perfect sense. Wdyt about keeping |
I'm in favor of going fully. |
}); | ||
}, | ||
templates: { | ||
item({ item }) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what does an example using a provided pragma / createElement look like (without using jsx directly)?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure whether the main example should be using jsx, since it might confuse people unfamiliar with it (Shopify, magento...)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what does an example using a provided pragma / createElement look like (without using jsx directly)?
You can see in the plugins implementations.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure whether the main example should be using jsx, since it might confuse people unfamiliar with it (Shopify, magento...)
The main example is used as a playground. We'll provide code samples for people relying on HTML.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I created this sandbox to demo how you can use Autocomplete with HTML.
packages/autocomplete-plugin-query-suggestions/src/getTemplates.ts
Outdated
Show resolved
Hide resolved
packages/autocomplete-plugin-query-suggestions/src/getTemplates.ts
Outdated
Show resolved
Hide resolved
packages/autocomplete-plugin-recent-searches/src/getTemplates.ts
Outdated
Show resolved
Hide resolved
Since 3a9d69b, the two options are renamed |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🙌
packages/autocomplete-preset-algolia/src/highlight/reverseHighlightedParts.ts
Outdated
Show resolved
Hide resolved
* feat(js): change renderer implementation to virtual DOM * feat(highlighting): revamp highlighting system to VDOM (#399)
* feat(js): change renderer implementation to virtual DOM * feat(highlighting): revamp highlighting system to VDOM (#399)
* docs(website): bootstrap new doc structure * docs(website): add doc for `createAlgoliaInsightsPlugin` * docs(website): add draft sections * docs: rewrite "Integrating keyboard navigation" (#389) * feat: add intro * Apply suggestions from code review Co-authored-by: Sarah Dayan <[email protected]> * fix: remove conflicting sentence * docs: rewrite "Accessing data with Context" (#390) * docs: rewrote "Controlling behavior with State" (#391) * fix: bold and underline text * docs: rewrite "Populating autocomplete with Sources" (#396) * docs: write "Displaying items with Templates" (#397) * fix(core): update query conditions * chore(test): add tests for getEnvironmentProps onTouchMove (#398) * feat(emptyStates): implements empty source template and renderEmpty method (#395) * Implements `empty` template and `renderEmpty` method * Add wait function to `test/utils` folder Co-authored-by: François Chalifour <[email protected]> * Add tests for `onActive` and `onSelect` on plugins (#400) * feat(js): change renderer implementation to virtual DOM (#381) * feat(js): change renderer implementation to virtual DOM * feat(highlighting): revamp highlighting system to VDOM (#399) * fix: fix code example (#403) * docs: switch core usage with autocomplete-js (#401) * docs: write "Basic configuration options" (#402) * docs: write "help and discussion" page (#394) * docs: add help page * Apply suggestions from code review Co-authored-by: François Chalifour <[email protected]> Co-authored-by: François Chalifour <[email protected]> * feat: put in a placeholder input * fix: update links * fix: links * fix: merge conflict * fix: merge conflict * feat: add AutocompleteExample * feat: add AutocompleteItem * fix: remove htm package * fix: remove htm package * fix: rename AutocompleteItem -> AutocompleteDocSearchItem * fix(website): use React renderer in `AutocompleteExample` * fix(website): support content record types Co-authored-by: François Chalifour <[email protected]> Co-authored-by: Sarah Dayan <[email protected]> Co-authored-by: Yannick Croissant <[email protected]> Co-authored-by: Clément Vannicatte <[email protected]> Co-authored-by: François Chalifour <[email protected]>
* docs(website): bootstrap new doc structure * docs(website): add doc for `createAlgoliaInsightsPlugin` * docs(website): add draft sections * docs: rewrite "Integrating keyboard navigation" (#389) * docs: rewrite "Accessing data with Context" (#390) * docs: rewrote "Controlling behavior with State" (#391) * docs: rewrite "Populating autocomplete with Sources" (#396) * docs: write "Displaying items with Templates" (#397) * fix(core): update query conditions * chore(test): add tests for getEnvironmentProps onTouchMove (#398) * feat(emptyStates): implements empty source template and renderEmpty method (#395) * Implements `empty` template and `renderEmpty` method * Add wait function to `test/utils` folder Co-authored-by: François Chalifour <[email protected]> * Add tests for `onActive` and `onSelect` on plugins (#400) * feat(js): change renderer implementation to virtual DOM (#381) * feat(js): change renderer implementation to virtual DOM * feat(highlighting): revamp highlighting system to VDOM (#399) * fix: fix code example (#403) * docs: switch core usage with autocomplete-js (#401) * docs: write "Basic configuration options" (#402) * docs: write "help and discussion" page (#394) * docs: add help page * Apply suggestions from code review Co-authored-by: François Chalifour <[email protected]> Co-authored-by: François Chalifour <[email protected]> * feat: getting started first draft * Apply suggestions from code review Co-authored-by: François Chalifour <[email protected]> * feat: update code example * fix: copy-edit * feat: add placeholders * fix: remove unnecessary code snippets * fix: links * fix: add record example * fix: rename titles to be more user focused * fix: correct URL * fix: update links * Apply suggestions from code review Co-authored-by: Sarah Dayan <[email protected]> * fix: update installation headers and add note * fix: remove headless installation and add 3rd party caveat * Update packages/website/docs/getting-started.md Co-authored-by: François Chalifour <[email protected]> * fix: remove CDNJS * Update packages/website/docs/getting-started.md Co-authored-by: François Chalifour <[email protected]> * Update packages/website/docs/getting-started.md * Update packages/website/docs/getting-started.md Co-authored-by: Sarah Dayan <[email protected]> * feat: add AutocompleteExample * fix: merge docs-1 Co-authored-by: François Chalifour <[email protected]> Co-authored-by: Sarah Dayan <[email protected]> Co-authored-by: Yannick Croissant <[email protected]> Co-authored-by: Clément Vannicatte <[email protected]> Co-authored-by: François Chalifour <[email protected]>
This is a complete rework of the rendering system of Autocomplete from a DOM implementation to an agnostic virtual DOM implementation.
Problems
Here's a list of the problems we have with the current DOM implementation:
debug
mode because it triggered a state change and you lost the DOM reference of the element you wanted to inspect.Templates
Templates used to accept a
string
in return, orvoid
. Users were allowed to trigger side effects when returningvoid
(e.g., appending to theroot
element and attaching events).We don't pass the
root
element anymore because it's now transparent; you need to return a VNode that contains this logic and that the library appends to its parent.How do I render HTML?
We now internally manipulate virtual nodes, which isn't compatible with HTML. There are still two ways to write HTML.
Using
dangerouslySetInnerHTML
Using the
htm
libraryThe
htm
library allows to create HTML elements from virtual DOM.See example →
API
We introduced two new options:
pragma
andpragmaFrag
(names taken from@babel/plugin-transform-react-jsx
). These two options default topreact.createElement
andpreact.Fragment
.These two pragmas are passed to the template functions so that users (and plugin authors) can leverage the pragmas passed to the Autocomplete instance, making the rendering environment-agnostic.
Impact on plugins
Until now, plugins were manipulating DOM elements, no matter the frontend framework you were using. This new element API allows plugins to be framework agnostic by using the template-provided
pragma
andpragmaFrag
params.Bundle size impact
Since we now embed Preact in Autocomplete JS, the gzipped UMD bundle size increased from 10KB to 13KB. This is not a great impact because we already embed Preact in InstantSearch.js. Besides, it'll allow community to build better and more interactive templates.
Future
Perhaps that this API is actually enough to unlock our React, Vue and Angular implementations. These framework-based flavors could only be syntax sugar on top of Autocomplete JS.
Next steps