UNPKG

32.4 kBMarkdownView Raw
1<p align="center">
2<a href="https://preactjs.com" target="_blank">
3<img alt="Preact" title="Preact" src="https://cdn.rawgit.com/developit/b4416d5c92b743dbaec1e68bc4c27cda/raw/3235dc508f7eb834ebf48418aea212a05df13db1/preact-logo-trans.svg" width="550">
4</a>
5</p>
6<p align="center">Fast <b>3kB</b> alternative to React with the same modern API.</p>
7
8**All the power of Virtual DOM components, without the overhead:**
9
10- Familiar React API & patterns: [ES6 Class] and [Functional Components]
11- Extensive React compatibility via a simple [preact-compat] alias
12- Everything you need: JSX, <abbr title="Virtual DOM">VDOM</abbr>, React DevTools, <abbr title="Hot Module Replacement">HMR</abbr>, <abbr title="Server-Side Rendering">SSR</abbr>..
13- A highly optimized diff algorithm and seamless Server Side Rendering
14- Transparent asynchronous rendering with a pluggable scheduler
15- 🆕💥 **Instant no-config app bundling with [Preact CLI](https://github.com/developit/preact-cli)**
16
17### 💁 More information at the [Preact Website ➞](https://preactjs.com)
18
19
20---
21
22<!-- TOC depthFrom:2 depthTo:6 withLinks:1 updateOnSave:1 orderedList:0 -->
23
24- [Demos](#demos)
25- [Libraries & Add-ons](#libraries--add-ons)
26- [Getting Started](#getting-started)
27 - [Import what you need](#import-what-you-need)
28 - [Rendering JSX](#rendering-jsx)
29 - [Components](#components)
30 - [Props & State](#props--state)
31- [Linked State](#linked-state)
32- [Examples](#examples)
33- [Extensions](#extensions)
34- [Debug Mode](#debug-mode)
35- [Backers](#backers)
36- [Sponsors](#sponsors)
37- [License](#license)
38
39<!-- /TOC -->
40
41
42# Preact
43
44[![npm](https://img.shields.io/npm/v/preact.svg)](http://npm.im/preact)
45[![CDNJS](https://img.shields.io/cdnjs/v/preact.svg)](https://cdnjs.com/libraries/preact)
46[![Preact Slack Community](https://preact-slack.now.sh/badge.svg)](https://preact-slack.now.sh)
47[![OpenCollective Backers](https://opencollective.com/preact/backers/badge.svg)](#backers)
48[![OpenCollective Sponsors](https://opencollective.com/preact/sponsors/badge.svg)](#sponsors)
49[![travis](https://travis-ci.org/developit/preact.svg?branch=master)](https://travis-ci.org/developit/preact)
50[![coveralls](https://img.shields.io/coveralls/developit/preact/master.svg)](https://coveralls.io/github/developit/preact)
51[![gzip size](http://img.badgesize.io/https://unpkg.com/preact/dist/preact.min.js?compression=gzip)](https://unpkg.com/preact/dist/preact.min.js)
52
53Preact supports modern browsers and IE9+:
54
55[![Browsers](https://saucelabs.com/browser-matrix/preact.svg)](https://saucelabs.com/u/preact)
56
57
58---
59
60
61## Demos
62
63#### Real-World Apps
64
65- [**Preact Hacker News**](https://hn.kristoferbaxter.com) _([GitHub Project](https://github.com/kristoferbaxter/preact-hn))_
66- [**Play.cash**](https://play.cash) :notes:
67- [**ESBench**](http://esbench.com) is built using Preact.
68- [**BigWebQuiz**](https://bigwebquiz.com) _([GitHub Project](https://github.com/jakearchibald/big-web-quiz))_
69- [**Nectarine.rocks**](http://nectarine.rocks) _([GitHub Project](https://github.com/developit/nectarine))_ :peach:
70- [**TodoMVC**](https://preact-todomvc.surge.sh) _([GitHub Project](https://github.com/developit/preact-todomvc))_
71- [**OSS.Ninja**](https://oss.ninja) _([GitHub Project](https://github.com/developit/oss.ninja))_
72- [**GuriVR**](https://gurivr.com) _([GitHub Project](https://github.com/opennewslabs/guri-vr))_
73- [**Color Picker**](https://colors.now.sh) _([GitHub Project](https://github.com/lukeed/colors-app))_ :art:
74- [**Rainbow Explorer**](https://use-the-platform.com/rainbow-explorer/) _([GitHub Project](https://github.com/vaneenige/rainbow-explorer/))_ :rainbow:
75- [**Offline Gallery**](https://use-the-platform.com/offline-gallery/) _([GitHub Project](https://github.com/vaneenige/offline-gallery/))_ :balloon:
76- [**Periodic Weather**](https://use-the-platform.com/periodic-weather/) _([GitHub Project](https://github.com/vaneenige/periodic-weather/))_ :sunny:
77- [**Rugby News Board**](http://nbrugby.com) _[(GitHub Project)](https://github.com/rugby-board/rugby-board-node)_
78- [**Preact Gallery**](https://preact.gallery/) an 8KB photo gallery PWA built using Preact.
79- [**Rainbow Explorer**](https://use-the-platform.com/rainbow-explorer/) Preact app to translate real life color to digital color _([Github project](https://github.com/vaneenige/rainbow-explorer))_.
80- [**YASCC**](https://carlosqsilva.github.io/YASCC/#/) Yet Another SoundCloud Client _([Github project](https://github.com/carlosqsilva/YASCC))_.
81- [**Journalize**](https://preact-journal.herokuapp.com/) 14k offline-capable journaling PWA using preact. _([Github project](https://github.com/jpodwys/preact-journal))_.
82
83
84#### Runnable Examples
85
86- [**Flickr Browser**](http://codepen.io/developit/full/VvMZwK/) (@ CodePen)
87- [**Animating Text**](http://codepen.io/developit/full/LpNOdm/) (@ CodePen)
88- [**60FPS Rainbow Spiral**](http://codepen.io/developit/full/xGoagz/) (@ CodePen)
89- [**Simple Clock**](http://jsfiddle.net/developit/u9m5x0L7/embedded/result,js/) (@ JSFiddle)
90- [**3D + ThreeJS**](http://codepen.io/developit/pen/PPMNjd?editors=0010) (@ CodePen)
91- [**Stock Ticker**](http://codepen.io/developit/pen/wMYoBb?editors=0010) (@ CodePen)
92- [*Create your Own!*](https://jsfiddle.net/developit/rs6zrh5f/embedded/result/) (@ JSFiddle)
93
94### Starter Projects
95
96- [**Preact Boilerplate**](https://preact-boilerplate.surge.sh) _([GitHub Project](https://github.com/developit/preact-boilerplate))_ :zap:
97- [**Preact Offline Starter**](https://preact-starter.now.sh) _([GitHub Project](https://github.com/lukeed/preact-starter))_ :100:
98- [**Preact PWA**](https://preact-pwa.appspot.com/) _([GitHub Project](https://github.com/ezekielchentnik/preact-pwa))_ :hamburger:
99- [**Parcel + Preact + Unistore Starter**](https://github.com/hwclass/parcel-preact-unistore-starter)
100- [**Preact Mobx Starter**](https://awaw00.github.io/preact-mobx-starter/) _([GitHub Project](https://github.com/awaw00/preact-mobx-starter))_ :sunny:
101- [**Preact Redux Example**](https://github.com/developit/preact-redux-example) :star:
102- [**Preact Redux/RxJS/Reselect Example**](https://github.com/continuata/preact-seed)
103- [**V2EX Preact**](https://github.com/yanni4night/v2ex-preact)
104- [**Preact Coffeescript**](https://github.com/crisward/preact-coffee)
105- [**Preact + TypeScript + Webpack**](https://github.com/k1r0s/bleeding-preact-starter)
106- [**0 config => Preact + Poi**](https://github.com/k1r0s/preact-poi-starter)
107
108---
109
110## Libraries & Add-ons
111
112- :raised_hands: [**preact-compat**](https://git.io/preact-compat): use any React library with Preact *([full example](http://git.io/preact-compat-example))*
113- :page_facing_up: [**preact-render-to-string**](https://git.io/preact-render-to-string): Universal rendering.
114- :eyes: [**preact-render-spy**](https://github.com/mzgoddard/preact-render-spy): Enzyme-lite: Renderer with access to the produced virtual dom for testing.
115- :loop: [**preact-render-to-json**](https://git.io/preact-render-to-json): Render for Jest Snapshot testing.
116- :earth_americas: [**preact-router**](https://git.io/preact-router): URL routing for your components
117- :bookmark_tabs: [**preact-markup**](https://git.io/preact-markup): Render HTML & Custom Elements as JSX & Components
118- :satellite: [**preact-portal**](https://git.io/preact-portal): Render Preact components into (a) SPACE :milky_way:
119- :pencil: [**preact-richtextarea**](https://git.io/preact-richtextarea): Simple HTML editor component
120- :bookmark: [**preact-token-input**](https://github.com/developit/preact-token-input): Text field that tokenizes input, for things like tags
121- :card_index: [**preact-virtual-list**](https://github.com/developit/preact-virtual-list): Easily render lists with millions of rows ([demo](https://jsfiddle.net/developit/qqan9pdo/))
122- :repeat: [**preact-cycle**](https://git.io/preact-cycle): Functional-reactive paradigm for Preact
123- :triangular_ruler: [**preact-layout**](https://download.github.io/preact-layout/): Small and simple layout library
124- :thought_balloon: [**preact-socrates**](https://github.com/matthewmueller/preact-socrates): Preact plugin for [Socrates](http://github.com/matthewmueller/socrates)
125- :rowboat: [**preact-flyd**](https://github.com/xialvjun/preact-flyd): Use [flyd](https://github.com/paldepind/flyd) FRP streams in Preact + JSX
126- :speech_balloon: [**preact-i18nline**](https://github.com/download/preact-i18nline): Integrates the ecosystem around [i18n-js](https://github.com/everydayhero/i18n-js) with Preact via [i18nline](https://github.com/download/i18nline).
127- :microscope: [**preact-jsx-chai**](https://git.io/preact-jsx-chai): JSX assertion testing _(no DOM, right in Node)_
128- :tophat: [**preact-classless-component**](https://github.com/ld0rman/preact-classless-component): create preact components without the class keyword
129- :hammer: [**preact-hyperscript**](https://github.com/queckezz/preact-hyperscript): Hyperscript-like syntax for creating elements
130- :white_check_mark: [**shallow-compare**](https://github.com/tkh44/shallow-compare): simplified `shouldComponentUpdate` helper.
131- :shaved_ice: [**preact-codemod**](https://github.com/vutran/preact-codemod): Transform your React code to Preact.
132- :construction_worker: [**preact-helmet**](https://github.com/download/preact-helmet): A document head manager for Preact
133- :necktie: [**preact-delegate**](https://github.com/NekR/preact-delegate): Delegate DOM events
134- :art: [**preact-stylesheet-decorator**](https://github.com/k1r0s/preact-stylesheet-decorator): Add Scoped Stylesheets to your Preact Components
135- :electric_plug: [**preact-routlet**](https://github.com/k1r0s/preact-routlet): Simple `Component Driven` Routing for Preact using ES7 Decorators
136- :fax: [**preact-bind-group**](https://github.com/k1r0s/preact-bind-group): Preact Forms made easy, Group Events into a Single Callback
137- :hatching_chick: [**preact-habitat**](https://github.com/zouhir/preact-habitat): Declerative Preact widgets renderer in any CMS or DOM host ([demo](https://codepen.io/zouhir/pen/brrOPB)).
138
139#### UI Component Libraries
140
141> Want to prototype something or speed up your development? Try one of these toolkits:
142
143- [**preact-material-components**](https://github.com/prateekbh/preact-material-components): Material Design Components for Preact ([website](https://material.preactjs.com/))
144- [**preact-mdc**](https://github.com/BerndWessels/preact-mdc): Material Design Components for Preact ([demo](https://github.com/BerndWessels/preact-mdc-demo))
145- [**preact-mui**](https://git.io/v1aVO): The MUI CSS Preact library.
146- [**preact-photon**](https://git.io/preact-photon): build beautiful desktop UI with [photon](http://photonkit.com)
147- [**preact-mdl**](https://git.io/preact-mdl): [Material Design Lite](https://getmdl.io) for Preact
148- [**preact-weui**](https://github.com/afeiship/preact-weui): [Weui](https://github.com/afeiship/preact-weui) for Preact
149
150
151---
152
153## Getting Started
154
155> 💁 _**Note:** You [don't need ES2015 to use Preact](https://github.com/developit/preact-in-es3)... but give it a try!_
156
157The easiest way to get started with Preact is to install [Preact CLI](https://github.com/developit/preact-cli). This simple command-line tool wraps up the best possible Webpack and Babel setup for you, and even keeps you up-to-date as the underlying tools change. Best of all, it's easy to understand! It builds your app in a single command (`preact build`), doesn't need any configuration, and bakes in best-practises 🙌.
158
159The following guide assumes you have some sort of ES2015 build set up using babel and/or webpack/browserify/gulp/grunt/etc.
160
161You can also start with [preact-boilerplate] or a [CodePen Template](http://codepen.io/developit/pen/pgaROe?editors=0010).
162
163
164### Import what you need
165
166The `preact` module provides both named and default exports, so you can either import everything under a namespace of your choosing, or just what you need as locals:
167
168##### Named:
169
170```js
171import { h, render, Component } from 'preact';
172
173// Tell Babel to transform JSX into h() calls:
174/** @jsx h */
175```
176
177##### Default:
178
179```js
180import preact from 'preact';
181
182// Tell Babel to transform JSX into preact.h() calls:
183/** @jsx preact.h */
184```
185
186> Named imports work well for highly structured applications, whereas the default import is quick and never needs to be updated when using different parts of the library.
187>
188> Instead of declaring the `@jsx` pragma in your code, it's best to configure it globally in a `.babelrc`:
189>
190> **For Babel 5 and prior:**
191>
192> ```json
193> { "jsxPragma": "h" }
194> ```
195>
196> **For Babel 6:**
197>
198> ```json
199> {
200> "plugins": [
201> ["transform-react-jsx", { "pragma":"h" }]
202> ]
203> }
204> ```
205> **For using Preact along with TypeScript add to `tsconfig.json`:**
206>
207> ```json
208> {
209> "jsx": "react",
210> "jsxFactory": "h",
211> }
212> ```
213
214
215### Rendering JSX
216
217Out of the box, Preact provides an `h()` function that turns your JSX into Virtual DOM elements _([here's how](http://jasonformat.com/wtf-is-jsx))_. It also provides a `render()` function that creates a DOM tree from that Virtual DOM.
218
219To render some JSX, just import those two functions and use them like so:
220
221```js
222import { h, render } from 'preact';
223
224render((
225 <div id="foo">
226 <span>Hello, world!</span>
227 <button onClick={ e => alert("hi!") }>Click Me</button>
228 </div>
229), document.body);
230```
231
232This should seem pretty straightforward if you've used hyperscript or one of its many friends. If you're not, the short of it is that the `h()` function import gets used in the final, transpiled code as a drop in replacement for `React.createElement()`, and so needs to be imported even if you don't explicitly use it in the code you write. Also note that if you're the kind of person who likes writing your React code in "pure JavaScript" (you know who you are) you will need to use `h()` wherever you would otherwise use `React.createElement()`.
233
234Rendering hyperscript with a virtual DOM is pointless, though. We want to render components and have them updated when data changes - that's where the power of virtual DOM diffing shines. :star2:
235
236
237### Components
238
239Preact exports a generic `Component` class, which can be extended to build encapsulated, self-updating pieces of a User Interface. Components support all of the standard React [lifecycle methods], like `shouldComponentUpdate()` and `componentWillReceiveProps()`. Providing specific implementations of these methods is the preferred mechanism for controlling _when_ and _how_ components update.
240
241Components also have a `render()` method, but unlike React this method is passed `(props, state)` as arguments. This provides an ergonomic means to destructure `props` and `state` into local variables to be referenced from JSX.
242
243Let's take a look at a very simple `Clock` component, which shows the current time.
244
245```js
246import { h, render, Component } from 'preact';
247
248class Clock extends Component {
249 render() {
250 let time = new Date().toLocaleTimeString();
251 return <span>{ time }</span>;
252 }
253}
254
255// render an instance of Clock into <body>:
256render(<Clock />, document.body);
257```
258
259
260That's great. Running this produces the following HTML DOM structure:
261
262```html
263<span>10:28:57 PM</span>
264```
265
266In order to have the clock's time update every second, we need to know when `<Clock>` gets mounted to the DOM. _If you've used HTML5 Custom Elements, this is similar to the `attachedCallback` and `detachedCallback` lifecycle methods._ Preact invokes the following lifecycle methods if they are defined for a Component:
267
268| Lifecycle method | When it gets called |
269|-----------------------------|--------------------------------------------------|
270| `componentWillMount` | before the component gets mounted to the DOM |
271| `componentDidMount` | after the component gets mounted to the DOM |
272| `componentWillUnmount` | prior to removal from the DOM |
273| `componentWillReceiveProps` | before new props get accepted |
274| `shouldComponentUpdate` | before `render()`. Return `false` to skip render |
275| `componentWillUpdate` | before `render()` |
276| `componentDidUpdate` | after `render()` |
277
278
279
280So, we want to have a 1-second timer start once the Component gets added to the DOM, and stop if it is removed. We'll create the timer and store a reference to it in `componentDidMount()`, and stop the timer in `componentWillUnmount()`. On each timer tick, we'll update the component's `state` object with a new time value. Doing this will automatically re-render the component.
281
282```js
283import { h, render, Component } from 'preact';
284
285class Clock extends Component {
286 constructor() {
287 super();
288 // set initial time:
289 this.state = {
290 time: Date.now()
291 };
292 }
293
294 componentDidMount() {
295 // update time every second
296 this.timer = setInterval(() => {
297 this.setState({ time: Date.now() });
298 }, 1000);
299 }
300
301 componentWillUnmount() {
302 // stop when not renderable
303 clearInterval(this.timer);
304 }
305
306 render(props, state) {
307 let time = new Date(state.time).toLocaleTimeString();
308 return <span>{ time }</span>;
309 }
310}
311
312// render an instance of Clock into <body>:
313render(<Clock />, document.body);
314```
315
316Now we have [a ticking clock](http://jsfiddle.net/developit/u9m5x0L7/embedded/result,js/)!
317
318
319### Props & State
320
321The concept (and nomenclature) for `props` and `state` is the same as in React. `props` are passed to a component by defining attributes in JSX, `state` is internal state. Changing either triggers a re-render, though by default Preact re-renders Components asynchronously for `state` changes and synchronously for `props` changes. You can tell Preact to render `prop` changes asynchronously by setting `options.syncComponentUpdates` to `false`.
322
323
324---
325
326
327## Linked State
328
329One area Preact takes a little further than React is in optimizing state changes. A common pattern in ES2015 React code is to use Arrow functions within a `render()` method in order to update state in response to events. Creating functions enclosed in a scope on every render is inefficient and forces the garbage collector to do more work than is necessary.
330
331One solution to this is to bind component methods declaratively.
332Here is an example using [decko](http://git.io/decko):
333
334```js
335class Foo extends Component {
336 @bind
337 updateText(e) {
338 this.setState({ text: e.target.value });
339 }
340 render({ }, { text }) {
341 return <input value={text} onInput={this.updateText} />;
342 }
343}
344```
345
346While this achieves much better runtime performance, it's still a lot of unnecessary code to wire up state to UI.
347
348Fortunately there is a solution, in the form of a module called [linkstate](https://github.com/developit/linkstate). Calling `linkState(component, 'text')` returns a function that accepts an Event and uses its associated value to update the given property in your component's state. Calls to `linkState()` with the same arguments are cached, so there is no performance penalty. Here is the previous example rewritten using _Linked State_:
349
350```js
351import linkState from 'linkstate';
352
353class Foo extends Component {
354 render({ }, { text }) {
355 return <input value={text} onInput={linkState(this, 'text')} />;
356 }
357}
358```
359
360Simple and effective. It handles linking state from any input type, or an optional second parameter can be used to explicitly provide a keypath to the new state value.
361
362> **Note:** In Preact 7 and prior, `linkState()` was built right into Component. In 8.0, it was moved to a separate module. You can restore the 7.x behavior by using linkstate as a polyfill - see [the linkstate docs](https://github.com/developit/linkstate#usage).
363
364
365
366## Examples
367
368Here is a somewhat verbose Preact `<Link>` component:
369
370```js
371class Link extends Component {
372 render(props, state) {
373 return <a href={props.href}>{props.children}</a>;
374 }
375}
376```
377
378Since this is ES6/ES2015, we can further simplify:
379
380```js
381class Link extends Component {
382 render({ href, children }) {
383 return <a {...{ href, children }} />;
384 }
385}
386
387// or, for wide-open props support:
388class Link extends Component {
389 render(props) {
390 return <a {...props} />;
391 }
392}
393
394// or, as a stateless functional component:
395const Link = ({ children, ...props }) => (
396 <a {...props}>{ children }</a>
397);
398```
399
400
401## Extensions
402
403It is likely that some projects based on Preact would wish to extend Component with great new functionality.
404
405Perhaps automatic connection to stores for a Flux-like architecture, or mixed-in context bindings to make it feel more like `React.createClass()`. Just use ES2015 inheritance:
406
407```js
408class BoundComponent extends Component {
409 constructor(props) {
410 super(props);
411 this.bind();
412 }
413 bind() {
414 this.binds = {};
415 for (let i in this) {
416 this.binds[i] = this[i].bind(this);
417 }
418 }
419}
420
421// example usage
422class Link extends BoundComponent {
423 click() {
424 open(this.href);
425 }
426 render() {
427 let { click } = this.binds;
428 return <span onclick={ click }>{ children }</span>;
429 }
430}
431```
432
433
434The possibilities are pretty endless here. You could even add support for rudimentary mixins:
435
436```js
437class MixedComponent extends Component {
438 constructor() {
439 super();
440 (this.mixins || []).forEach( m => Object.assign(this, m) );
441 }
442}
443```
444
445## Debug Mode
446
447You can inspect and modify the state of your Preact UI components at runtime using the
448[React Developer Tools](https://github.com/facebook/react-devtools) browser extension.
449
4501. Install the [React Developer Tools](https://github.com/facebook/react-devtools) extension
4512. Import the "preact/debug" module in your app
4523. Set `process.env.NODE_ENV` to 'development'
4534. Reload and go to the 'React' tab in the browser's development tools
454
455
456```js
457import { h, Component, render } from 'preact';
458
459// Enable debug mode. You can reduce the size of your app by only including this
460// module in development builds. eg. In Webpack, wrap this with an `if (module.hot) {...}`
461// check.
462require('preact/debug');
463```
464
465### Runtime Error Checking
466
467To enable debug mode, you need to set `process.env.NODE_ENV=development`. You can do this
468with webpack via a builtin plugin.
469
470```js
471// webpack.config.js
472
473// Set NODE_ENV=development to enable error checking
474new webpack.DefinePlugin({
475 'process.env': {
476 'NODE_ENV': JSON.stringify('development')
477 }
478});
479```
480
481When enabled, warnings are logged to the console when undefined components or string refs
482are detected.
483
484### Developer Tools
485
486If you only want to include devtool integration, without runtime error checking, you can
487replace `preact/debug` in the above example with `preact/devtools`. This option doesn't
488require setting `NODE_ENV=development`.
489
490
491
492## Backers
493Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/preact#backer)]
494
495<a href="https://opencollective.com/preact/backer/0/website" target="_blank"><img src="https://opencollective.com/preact/backer/0/avatar.svg"></a>
496<a href="https://opencollective.com/preact/backer/1/website" target="_blank"><img src="https://opencollective.com/preact/backer/1/avatar.svg"></a>
497<a href="https://opencollective.com/preact/backer/2/website" target="_blank"><img src="https://opencollective.com/preact/backer/2/avatar.svg"></a>
498<a href="https://opencollective.com/preact/backer/3/website" target="_blank"><img src="https://opencollective.com/preact/backer/3/avatar.svg"></a>
499<a href="https://opencollective.com/preact/backer/4/website" target="_blank"><img src="https://opencollective.com/preact/backer/4/avatar.svg"></a>
500<a href="https://opencollective.com/preact/backer/5/website" target="_blank"><img src="https://opencollective.com/preact/backer/5/avatar.svg"></a>
501<a href="https://opencollective.com/preact/backer/6/website" target="_blank"><img src="https://opencollective.com/preact/backer/6/avatar.svg"></a>
502<a href="https://opencollective.com/preact/backer/7/website" target="_blank"><img src="https://opencollective.com/preact/backer/7/avatar.svg"></a>
503<a href="https://opencollective.com/preact/backer/8/website" target="_blank"><img src="https://opencollective.com/preact/backer/8/avatar.svg"></a>
504<a href="https://opencollective.com/preact/backer/9/website" target="_blank"><img src="https://opencollective.com/preact/backer/9/avatar.svg"></a>
505<a href="https://opencollective.com/preact/backer/10/website" target="_blank"><img src="https://opencollective.com/preact/backer/10/avatar.svg"></a>
506<a href="https://opencollective.com/preact/backer/11/website" target="_blank"><img src="https://opencollective.com/preact/backer/11/avatar.svg"></a>
507<a href="https://opencollective.com/preact/backer/12/website" target="_blank"><img src="https://opencollective.com/preact/backer/12/avatar.svg"></a>
508<a href="https://opencollective.com/preact/backer/13/website" target="_blank"><img src="https://opencollective.com/preact/backer/13/avatar.svg"></a>
509<a href="https://opencollective.com/preact/backer/14/website" target="_blank"><img src="https://opencollective.com/preact/backer/14/avatar.svg"></a>
510<a href="https://opencollective.com/preact/backer/15/website" target="_blank"><img src="https://opencollective.com/preact/backer/15/avatar.svg"></a>
511<a href="https://opencollective.com/preact/backer/16/website" target="_blank"><img src="https://opencollective.com/preact/backer/16/avatar.svg"></a>
512<a href="https://opencollective.com/preact/backer/17/website" target="_blank"><img src="https://opencollective.com/preact/backer/17/avatar.svg"></a>
513<a href="https://opencollective.com/preact/backer/18/website" target="_blank"><img src="https://opencollective.com/preact/backer/18/avatar.svg"></a>
514<a href="https://opencollective.com/preact/backer/19/website" target="_blank"><img src="https://opencollective.com/preact/backer/19/avatar.svg"></a>
515<a href="https://opencollective.com/preact/backer/20/website" target="_blank"><img src="https://opencollective.com/preact/backer/20/avatar.svg"></a>
516<a href="https://opencollective.com/preact/backer/21/website" target="_blank"><img src="https://opencollective.com/preact/backer/21/avatar.svg"></a>
517<a href="https://opencollective.com/preact/backer/22/website" target="_blank"><img src="https://opencollective.com/preact/backer/22/avatar.svg"></a>
518<a href="https://opencollective.com/preact/backer/23/website" target="_blank"><img src="https://opencollective.com/preact/backer/23/avatar.svg"></a>
519<a href="https://opencollective.com/preact/backer/24/website" target="_blank"><img src="https://opencollective.com/preact/backer/24/avatar.svg"></a>
520<a href="https://opencollective.com/preact/backer/25/website" target="_blank"><img src="https://opencollective.com/preact/backer/25/avatar.svg"></a>
521<a href="https://opencollective.com/preact/backer/26/website" target="_blank"><img src="https://opencollective.com/preact/backer/26/avatar.svg"></a>
522<a href="https://opencollective.com/preact/backer/27/website" target="_blank"><img src="https://opencollective.com/preact/backer/27/avatar.svg"></a>
523<a href="https://opencollective.com/preact/backer/28/website" target="_blank"><img src="https://opencollective.com/preact/backer/28/avatar.svg"></a>
524<a href="https://opencollective.com/preact/backer/29/website" target="_blank"><img src="https://opencollective.com/preact/backer/29/avatar.svg"></a>
525
526
527## Sponsors
528Become a sponsor and get your logo on our README on GitHub with a link to your site. [[Become a sponsor](https://opencollective.com/preact#sponsor)]
529
530<a href="https://opencollective.com/preact/sponsor/0/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/0/avatar.svg"></a>
531<a href="https://opencollective.com/preact/sponsor/1/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/1/avatar.svg"></a>
532<a href="https://opencollective.com/preact/sponsor/2/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/2/avatar.svg"></a>
533<a href="https://opencollective.com/preact/sponsor/3/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/3/avatar.svg"></a>
534<a href="https://opencollective.com/preact/sponsor/4/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/4/avatar.svg"></a>
535<a href="https://opencollective.com/preact/sponsor/5/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/5/avatar.svg"></a>
536<a href="https://opencollective.com/preact/sponsor/6/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/6/avatar.svg"></a>
537<a href="https://opencollective.com/preact/sponsor/7/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/7/avatar.svg"></a>
538<a href="https://opencollective.com/preact/sponsor/8/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/8/avatar.svg"></a>
539<a href="https://opencollective.com/preact/sponsor/9/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/9/avatar.svg"></a>
540<a href="https://opencollective.com/preact/sponsor/10/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/10/avatar.svg"></a>
541<a href="https://opencollective.com/preact/sponsor/11/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/11/avatar.svg"></a>
542<a href="https://opencollective.com/preact/sponsor/12/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/12/avatar.svg"></a>
543<a href="https://opencollective.com/preact/sponsor/13/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/13/avatar.svg"></a>
544<a href="https://opencollective.com/preact/sponsor/14/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/14/avatar.svg"></a>
545<a href="https://opencollective.com/preact/sponsor/15/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/15/avatar.svg"></a>
546<a href="https://opencollective.com/preact/sponsor/16/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/16/avatar.svg"></a>
547<a href="https://opencollective.com/preact/sponsor/17/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/17/avatar.svg"></a>
548<a href="https://opencollective.com/preact/sponsor/18/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/18/avatar.svg"></a>
549<a href="https://opencollective.com/preact/sponsor/19/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/19/avatar.svg"></a>
550<a href="https://opencollective.com/preact/sponsor/20/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/20/avatar.svg"></a>
551<a href="https://opencollective.com/preact/sponsor/21/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/21/avatar.svg"></a>
552<a href="https://opencollective.com/preact/sponsor/22/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/22/avatar.svg"></a>
553<a href="https://opencollective.com/preact/sponsor/23/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/23/avatar.svg"></a>
554<a href="https://opencollective.com/preact/sponsor/24/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/24/avatar.svg"></a>
555<a href="https://opencollective.com/preact/sponsor/25/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/25/avatar.svg"></a>
556<a href="https://opencollective.com/preact/sponsor/26/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/26/avatar.svg"></a>
557<a href="https://opencollective.com/preact/sponsor/27/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/27/avatar.svg"></a>
558<a href="https://opencollective.com/preact/sponsor/28/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/28/avatar.svg"></a>
559<a href="https://opencollective.com/preact/sponsor/29/website" target="_blank"><img src="https://opencollective.com/preact/sponsor/29/avatar.svg"></a>
560
561## License
562
563MIT
564
565
566
567[![Preact](http://i.imgur.com/YqCHvEW.gif)](https://preactjs.com)
568
569
570[preact-compat]: https://github.com/developit/preact-compat
571[ES6 Class]: https://facebook.github.io/react/docs/reusable-components.html#es6-classes
572[Functional Components]: https://facebook.github.io/react/blog/2015/10/07/react-v0.14.html#stateless-functional-components
573[hyperscript]: https://github.com/dominictarr/hyperscript
574[preact-boilerplate]: https://github.com/developit/preact-boilerplate
575[lifecycle methods]: https://facebook.github.io/react/docs/component-specs.html