UNPKG

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