Aphrodite example. (#634)

* add aphrodite example

* fix props

* Update README.md
This commit is contained in:
Arana Jhonny 2017-01-03 14:06:04 -04:00 committed by Guillermo Rauch
parent 0a3313d1b9
commit 1d700d0240
5 changed files with 98 additions and 1 deletions

View file

@ -95,7 +95,7 @@ export default () => (
<p><details>
<summary><b>Examples</b></summary>
<ul><li><a href="./examples/with-styled-components">Styled components</a></li><li><a href="./examples/with-styletron">Styletron</a></li><li><a href="./examples/with-glamor">Glamor</a></li><li><a href="./examples/with-cxs">Cxs</a></li></ul>
<ul><li><a href="./examples/with-styled-components">Styled components</a></li><li><a href="./examples/with-styletron">Styletron</a></li><li><a href="./examples/with-glamor">Glamor</a></li><li><a href="./examples/with-cxs">Cxs</a></li><li><a href="./examples/with-aphrodite">Aphrodite</a></li></ul>
</details></p>
It's possible to use any existing CSS-in-JS solution. The simplest one is inline styles:

View file

@ -0,0 +1,30 @@
# Example app with aphrodite
## How to use
Download the example (or clone the repo)[https://github.com/zeit/next.js.git]:
```bash
curl https://codeload.github.com/zeit/next.js/tar.gz/master | tar -xz --strip=2 next.js-master/examples/with-aphrodite
cd with-aphrodite
```
Install it and run:
```bash
npm install
npm run dev
```
Deploy it to the cloud with [now](https://zeit.co/now) ([download](https://zeit.co/download))
```bash
now
```
## The idea behind the example
This example features how yo use a different styling solution than [styled-jsx](https://github.com/zeit/styled-jsx) that also supports universal styles. That means we can serve the required styles for the first render within the HTML and then load the rest in the client. In this case we are using [Aphrodite](https://github.com/Khan/aphrodite/).
For this purpose we are extending the `<Document />` and injecting the server side rendered styles into the `<head>`.

View file

@ -0,0 +1,15 @@
{
"name": "with-aphrodite",
"version": "1.0.0",
"scripts": {
"dev": "next",
"build": "next build",
"start": "next start"
},
"dependencies": {
"aphrodite": "^1.1.0",
"next": "^2.0.0-beta"
},
"author": "",
"license": "ISC"
}

View file

@ -0,0 +1,24 @@
import Document, { Head, Main, NextScript } from 'next/document'
import { StyleSheetServer } from 'aphrodite'
export default class MyDocument extends Document {
static async getInitialProps ({ renderPage }) {
const { html, css } = StyleSheetServer.renderStatic(() => renderPage())
return { ...html, css }
}
render () {
return (
<html>
<Head>
<title>My page</title>
<style dangerouslySetInnerHTML={{ __html: this.props.css.content }} />
</Head>
<body>
<Main />
<NextScript />
</body>
</html>
)
}
}

View file

@ -0,0 +1,28 @@
import React from 'react'
import { StyleSheet, css } from 'aphrodite'
export default () => (
<div className={css(styles.root)}>
<h1 className={css(styles.title)}>My page</h1>
</div>
)
const styles = StyleSheet.create({
root: {
width: 80,
height: 60,
background: 'white',
':hover': {
background: 'black'
}
},
title: {
marginLeft: 5,
color: 'black',
fontSize: 22,
':hover': {
color: 'white'
}
}
})