6.0.7 • Published 6 years ago

@compositor/x0 v6.0.7

Weekly downloads
814
License
MIT
Repository
github
Last release
6 years ago

x0

Document & develop React components without breaking a sweat

Build Status

npm install -g @compositor/x0

Features

  • Zero-config
  • No plugins
  • Components over configuration
  • Use markdown, MDX, or React components
  • Automatic file system based routing
  • Completely customizable
  • Export static sites
  • Works as an isolated development environment

Read more about x0 in our blog post.

Getting Started

x0 renders a directory of React components, automatically handling routing based on filename. Create a docs folder and add an index.js file.

// index.js
import React from 'react'

export default class extends React.Component {
  render () {
    return (
      <h1>Hello</h1>
    )
  }
}

Start a development server by running:

x0 docs --open

To add more pages, add a new component for each route. For example, create an about page:

// about.js
import React from 'react'

export default props =>
  <h1>About</h1>

The about page should now render when navigating to http://localhost:8080/about.

Isolated development environment

x0 docs

Options:

-o --open       Open dev server in default browser
-p --port       Custom port for dev server
-t --template   Path to custom HTML template
--webpack       Path to custom webpack configuration
x0 docs -op 8080

Static Build

Export static HTML and client-side bundle

x0 build docs

Export static HTML without bundle

x0 build docs --static

Options

-d --out-dir    Output directory (default dist)
-s --static     Output static HTML without JS bundle
-t --template   Path to custom HTML template
--webpack       Path to custom webpack configuration

Fetching Data

Use the async getInitialProps static method to fetch data for static rendering. This method was inspired by Next.js.

const Index = props => (
  <h1>Hello {props.data}</h1>
)

Index.getInitialProps = async () => {
  const fetch = require('isomorphic-fetch')
  const res = await fetch('http://example.com/data')
  const data = await res.json()

  return { data }
}

Custom App

A custom App component can be provided by including an _app.js file. The App component uses the render props pattern to provide additional state and props to its child routes.

// example _app.js
import React from 'react'

export default class extends React.Component {
  state = {
    count: 0
  }

  update = fn => this.setState(fn)

  render () {
    const { render, routes } = this.props

    return render({
      ...this.state,
      decrement: () => this.update(s => ({ count: s.count - 1 })),
      increment: () => this.update(s => ({ count: s.count + 1 }))
    })
  }
}

Layouts

The App component can also be used to provide a common layout for all routes.

// example _app.js
import React from 'react'
import Nav from '../components/Nav'
import Header from '../components/Header'
import Footer from '../components/Footer'

export default class extends React.Component {
  render () {
    const {
      location,
      render,
      routes
    } = this.props

    const route = routes.find(route => route.path === location.pathname)

    return (
      <React.Fragment>
        <Nav />
        <Header
          route={route}
        />
        {render()}
        <Footer />
      </React.Fragment>
    )
  }
}

CSS-in-JS

x0 supports server-side rendering for styled-components and emotion with zero configuration.

Styled Components

To enable CSS rendering for static export, ensure that styled-components is installed as a dependency in your package.json

"dependencies": {
  "styled-components": "^3.2.6"
}

Emotion

Ensure emotion is installed as a dependency in your package.json

"dependencies": {
  "emotion": "^9.1.3"
}

Configuration

Default options can be set in the x0 field in package.json.

"x0": {
  "static": true,
  "outDir": "site",
  "title": "Hello",
}

Head content

Head elements such as <title>, <meta>, and <style> can be configured with the x0 field in package.json.

"x0": {
  "title": "My Site",
  "meta": [
    { "name": "twitter:card", "content": "summary" }
    { "name": "twitter:image", "content": "kitten.png" }
  ],
  "links": [
    {
      "rel": "stylesheet",
      "href": "https://fonts.googleapis.com/css?family=Roboto"
    }
  ]
}

Custom HTML Template

A custom HTML template can be passed as the template option.

"x0": {
  "template": "./html.js"
}
// example template
module.exports = ({
  html,
  css,
  scripts,
  title,
  meta = [],
  links = [],
  static: isStatic
}) => `<!DOCTYPE html>
<head>
  <title>{title}</title>
  ${css}
</head>
<div id=root>${html}</div>
${scripts}
`

Routing

x0 creates routes based on the file system, using react-router. To set the base URL for static builds, use the basename option.

"x0": {
  "basename": "/my-site"
}

Links

To link between different components, install react-router-dom and use the Link component.

npm i react-router-dom
import React from 'react'
import { Link } from 'react-router-dom'

export default () => (
  <div>
    <h1>Home</h1>
    <nav>
      <Link to='/'>Home</Link>
      <Link to='/about'>About</Link>
    </nav>
  </div>
)

JSX Format

x0 includes support for the Compositor JSX file format.

---
title: Hello
---
import { Box, Heading } from 'rebass'

<Box px={2} py={4}>
  <Heading>
    {frontMatter.title}
  </Heading>
</Box>

MDX Format

x0 includes support for the MDX file format.

import { Box } from 'rebass'

# Hello MDX

<Box p={4} bg='tomato'>
  Beep Boop
</Box>

webpack

Webpack configuration files named webpack.config.js will automatically be merged with the built-in configuration, using webpack-merge. To use a custom filename, pass the file path to the --webpack flag.

// webpack.config.js example
module.exports = {
  module: {
    rules: [
      { test: /\.txt$/, loader: 'raw-loader' }
    ]
  }
}

See the example.

Related


Made by Compositor | MIT License

6.0.7

6 years ago

6.0.6

6 years ago

6.0.6-0

6 years ago

6.0.5

6 years ago

6.0.4

6 years ago

6.0.3

6 years ago

6.0.2

6 years ago

6.0.1

6 years ago

6.0.1-0

6 years ago

6.0.0

6 years ago

6.0.0-4

6 years ago

6.0.0-3

6 years ago

6.0.0-2

6 years ago

6.0.0-1

6 years ago

6.0.0-0

6 years ago

5.1.0-6

6 years ago

5.1.0-5

6 years ago

5.1.0-4

6 years ago

5.1.0-3

6 years ago

5.1.0-2

6 years ago

5.1.0-0

6 years ago

5.0.8

6 years ago

5.0.7

6 years ago

5.0.6

6 years ago

5.0.6-0

6 years ago

5.0.5

6 years ago

5.0.4-3

6 years ago

5.0.4-2

6 years ago

5.0.4

6 years ago

5.0.4-1

6 years ago

5.0.4-0

6 years ago

5.0.3

6 years ago

5.0.2

6 years ago

5.0.1

6 years ago

5.0.0

6 years ago

5.0.0-13

6 years ago

5.0.0-12

6 years ago

5.0.0-11

6 years ago

5.0.0-10

6 years ago

5.0.0-9

6 years ago

5.0.0-8

6 years ago

4.0.3

6 years ago

5.0.0-7

6 years ago

5.0.0-6

6 years ago

5.0.0-5

6 years ago

5.0.0-4

6 years ago

5.0.0-3

6 years ago

5.0.0-2

6 years ago

5.0.0-1

6 years ago

5.0.0-0

6 years ago

4.0.2

6 years ago

4.0.1

6 years ago

4.0.0

6 years ago

4.0.0-0

6 years ago

3.2.1

6 years ago

3.2.1-0

6 years ago

3.2.0

6 years ago

3.2.0-3

6 years ago

3.2.0-2

6 years ago

3.2.0-1

6 years ago

3.2.0-0

6 years ago

3.1.1

6 years ago

3.1.0

6 years ago

3.1.0-0

6 years ago

3.0.4

6 years ago

3.0.3

6 years ago

3.0.2

6 years ago

3.0.1

6 years ago

3.0.0

6 years ago

3.0.0-9

6 years ago

3.0.0-8

6 years ago

3.0.0-7

6 years ago

3.0.0-6

6 years ago

3.0.0-5

6 years ago

3.0.0-4

6 years ago

3.0.0-3

6 years ago

3.0.0-2

6 years ago

3.0.0-1

6 years ago

3.0.0-0

6 years ago

2.0.0-18

6 years ago

2.0.0-17

6 years ago

2.0.0-16

6 years ago

2.0.0-15

6 years ago

2.0.0-14

6 years ago

2.0.0-13

6 years ago

2.0.0-12

6 years ago

2.0.0-11

6 years ago

2.0.0-10

6 years ago

2.0.0-9

7 years ago

2.0.0-8

7 years ago

2.0.0-7

7 years ago

2.0.0-6

7 years ago

2.0.0-5

7 years ago

2.0.0-4

7 years ago

2.0.0-3

7 years ago

2.0.0-2

7 years ago

2.0.0-1

7 years ago

2.0.0-0

7 years ago

1.0.10-0

7 years ago

1.0.9

7 years ago

1.0.0-55

7 years ago

1.0.0-54

7 years ago

1.0.0-53

7 years ago

1.0.0-52

7 years ago

1.0.0-51a

7 years ago

1.0.0-51

7 years ago

1.0.0-50

7 years ago

1.0.0-49

7 years ago

1.0.0-48

7 years ago

1.0.0-beta.47

7 years ago

1.0.0-beta.46

7 years ago

1.0.0-beta.45

7 years ago

1.0.0-beta.44

7 years ago

1.0.0-beta.43.2

7 years ago

1.0.0-beta.43.1

7 years ago

1.0.0-beta.43

7 years ago

1.0.0-beta.42

7 years ago

1.0.0-beta.41.10

7 years ago

1.0.0-beta.41.9

7 years ago

1.0.0-beta.41.8

7 years ago

1.0.0-beta.41.7

7 years ago

1.0.0-beta.41.6

7 years ago

1.0.0-beta.41.5

7 years ago

1.0.0-beta.41.4

7 years ago

1.0.0-beta.41.3

7 years ago

1.0.0-beta.41.2

7 years ago

1.0.0-beta.41.1

7 years ago

1.0.0-beta.41

7 years ago

1.0.0-beta.40.5

7 years ago

1.0.0-beta.40.4

7 years ago

1.0.0-beta.40.3

7 years ago

1.0.0-beta.40.2

7 years ago

1.0.0-beta.40

7 years ago

1.0.0-beta.39

7 years ago

1.0.0-beta.38

7 years ago

1.0.0-beta.37

7 years ago

1.0.0-beta.36

7 years ago

1.0.0-beta.35

7 years ago

1.0.0-beta.34

7 years ago

1.0.0-beta.33

7 years ago

1.0.0-beta.32

7 years ago

1.0.0-beta.31

7 years ago

1.0.0-beta.30

7 years ago

1.0.0-beta.29

7 years ago

1.0.0-beta.28

7 years ago

1.0.0-beta.27

7 years ago

1.0.0-beta.26

7 years ago

1.0.0-beta.25

7 years ago

1.0.0-beta.24

7 years ago

1.0.0-beta.23

7 years ago

1.0.0-beta.22

7 years ago

1.0.0-beta.21

7 years ago

1.0.0-beta.20

7 years ago

1.0.0-beta.19

7 years ago

1.0.0-beta.18

7 years ago

1.0.0-beta.17

7 years ago

1.0.0-beta.16

7 years ago

1.0.0-beta.15

7 years ago

1.0.0-beta.14

7 years ago

1.0.0-beta.13

7 years ago

1.0.0-beta.12

7 years ago

1.0.0-beta.11

7 years ago

1.0.0-beta.10.3

7 years ago

1.0.0-beta.10.2

7 years ago

1.0.0-beta.10.1

7 years ago

1.0.0-beta.10

7 years ago

1.0.0-beta.9

7 years ago

1.0.0-beta.8

7 years ago

1.0.0-beta.7

7 years ago

1.0.0-beta.6

7 years ago

1.0.0-beta.5

7 years ago

1.0.0-beta.4

7 years ago

1.0.0-beta.3

7 years ago

1.0.0-beta.2

7 years ago

1.0.0-beta.1

7 years ago

1.0.0-beta.0

7 years ago

1.0.0-d0

7 years ago

1.0.0-c0

7 years ago

1.0.0-b15.3

7 years ago

1.0.0-b15.2

7 years ago

1.0.0-b15.1

7 years ago

1.0.0-b15.0

7 years ago

1.0.0-b14.0

7 years ago

1.0.0-b14

7 years ago

1.0.0-b13

7 years ago

1.0.0-b12

7 years ago

1.0.0-b11

7 years ago

1.0.0-b10

7 years ago

1.0.0-b9

7 years ago

1.0.0-b8

7 years ago

1.0.0-b7

7 years ago

1.0.0-b6

7 years ago

1.0.0-b5

7 years ago

1.0.0-b4

7 years ago

1.0.0-b3

7 years ago

1.0.0-b2

7 years ago

1.0.0-b1

7 years ago

1.0.0-b0

7 years ago