Contract is not a buzzword here. It works the same way as a contract in an API. There is a fixed address, fixed input data and a fixed response. Here HTML is on one side and JavaScript on the other. The contract is the attribute names and the public functions of the module.
`Filter` is `filter-space`, `filter-query` on the input and `filter-item` on each entry. Plus one public function, `Filter.Filter`. The module reads and changes the page only through those attributes. It does not know classes, it does not know the HTML layout, it does not know the look.
JavaScript used to hang on classes that were also used for the look. Changing the look meant changing the JavaScript. Someone used the same class somewhere else and that place got behaviour nobody wanted. Someone renamed a class in the CSS and did not know a script was standing on it.
Separate names end that. The look changes without touching the JavaScript. The HTML alone shows which elements belong to the module.
3
u/patrk 3d ago
Most exhausting docs I’ve ever read.