preact v10.0.0-alpha.2 Release Notes

Release Date: 2019-03-14 // about 5 years ago
  • ๐Ÿš€ The weekend is coming and we thought it be a good time to make another alpha release for everyone to play with ๐ŸŽ‰

    ๐Ÿฑ This was a wonderful week for us. More and more bug reports contain links to a reproducible test case. You all are simply amazing! We wouldn't be able to fix this many bugs without all your help ๐Ÿ‘ Even our contributions had an alltime high with excellent PRs from the community!

    ๐Ÿ“ฆ Despite fixing many bugs we landed a new package to help you test hooks in Preact ๐ŸŽ‰

    โœ… Introducing preact/test-utils

    โฑ With hooks having their own scheduling logic, we didn't have a good testing story up until now! First-time contributor @JoviDeCroock went right into it and quickly had a prototype running. With the blink of an eye he had a PR that was ready to be merged. These testing utilities are inspired by the excellent react-dom/test-utils tools and share a similar act() function ๐Ÿ‘

    ๐Ÿ”€ For testing hooks effectively we need to flush pending effects synchronously. The brand new act() function allows you to do just that:

    import { act } from "preact/test-utils";let spy = sinon.spy();function StateContainer() { useEffect(spy); return \<div /\>; }// Wrap the render() with `act` to flush hooks automaticallyact(() =\> render(\<StateContainer /\>, document.body));// Do your assertions ๐ŸŽ‰expect(spy).to.be.calledOnce;
    

    โšก๏ธ If you're working with class-based components you can use the new setupRerender function to flush pending state updates in your tests:

    import { setupRerender, Component } from "preact/test-utils";// Setup rerender logic firstconst rerender = setupRerender();let updateState;class App extends Component { constructor() { super(); this.state = { count: 0 }; updateState = () =\> this.setState(prev =\> ({ count: ++prev.count })); } render() { return \<div\>count: {this.state.count]}\</div\>; } }// Render your componentrender(\<App /\>, dom);expect(dom.textContent).to.equal("count: 0");// Trigger a state updateupdateState();// Flush all state updatesrerender();expect(dom.textContent).to.equal("count: 1");
    

    ๐Ÿฑ It's his first contribution to Preact and we couldn't be more ecstatic about his work. Give him a round of applause ๐Ÿ‘ It's also good to know for us that our code remains very accessible for new contributors.

    ๐Ÿ› Bug-Fixes

    ๐ŸŽ Performance

    • ๐Ÿšš Move _prevState for devtools out of core (#1379, thanks @developit)
    • Reuse oldChildrenLength to save bytes (#1386, thanks @yuqianma)
    • ๐Ÿ’… Don't call setProperty for style strings (#1394, thanks @choumx)

    Other