Skip to content

Commit

Permalink
Merge pull request #62 from SaraVieira/babel-plugin
Browse files Browse the repository at this point in the history
Babel plugin
  • Loading branch information
kitten committed Jul 25, 2017
2 parents ce7b1ba + 8652658 commit 573efef
Show file tree
Hide file tree
Showing 6 changed files with 283 additions and 43 deletions.
175 changes: 175 additions & 0 deletions components/advanced/babel-plugin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
import React from 'react';
import SectionLayout from '../SectionLayout';
import CodeBlock from '../CodeBlock';
import Code from '../Code';
import Note from '../Note';
import Link from '../Link'

const installNPM = `
npm install --save-dev babel-plugin-styled-components
`.trim();

const usage = `
{
"plugins": ["styled-components"]
}
`.trim();

const ssr = `
{
"plugins": [
["styled-components", {
"ssr": true
}]
]
}
`.trim();

const displayName = `
{
"plugins": [
["styled-components", {
"displayName": false
}]
]
}
`.trim();

const preprocess = `
{
"plugins": [
["styled-components", {
"preprocess": true
}]
]
}
`.trim();

const minify = `
{
"plugins": [
["styled-components", {
"minify": false
}]
]
}
`.trim();

const transpilation = `
{
"plugins": [
["styled-components", {
"transpileTemplateLiterals": false
}]
]
}
`.trim();

const BabelPlugin = () =>
<SectionLayout title="Babel Plugin" labels={['v2']}>
<p>
This plugin adds support for server-side rendering, for minification of
styles and gives you a nicer debugging experience.
</p>
<SectionLayout sub title="Usage">
<p>Install the babel-plugin first:</p>
<CodeBlock code={installNPM} language="node" />
<p>Then add it to your babel configuration like so:</p>
<CodeBlock code={usage} language="node" />
</SectionLayout>
<SectionLayout sub title="Server-side rendering">
<Note>This option is turned off by default</Note>
<p>
By adding a unique identifier to every styled component this plugin
avoids checksum mismatches due to different class generation on the
client and on the server. If you do not use this plugin and try to
server-side render styled-components React will complain.
</p>
<p>
You can enable it with the <Code>ssr</Code> option:
</p>
<CodeBlock code={ssr} language="node" />
</SectionLayout>
<SectionLayout sub title="Better debugging">
<p>
This options adds the components' name and displayName to the class name
attached to the DOM node. In your browser's DevTools you'll see:{' '}
<Code>
&lt;button class=&quot;sc-Button-asdf123 asdf123&quot; /&gt;
</Code>{' '}
instead of just <Code>&lt;button class=&quot;asdf123&quot; /&gt;</Code>.
</p>
<p>
This also adds support for showing your components' real name in the
React DevTools. Consider writing a styled component that renders a{' '}
<Code>button</Code> element, called <Code>MyButton</Code>. It will
normally show up as <Code>&lt;styled.button&gt;</Code> for all of your
components, but with this plugin they show{' '}
<Code>&lt;MyButton /&gt;</Code>.
</p>
<p>
This makes it easier to find your components and to figure out where
they live in your app.
</p>
<p>
If you don't need this feature, you can disable it with the{' '}
<Code>displayName</Code> option:
</p>
<CodeBlock code={displayName} language="node" />
</SectionLayout>
<SectionLayout sub title="Preprocessing">
<Note>
This is experimental and we don't yet know of all limitations and bugs!
Consider this non-production ready for now. ⚠️
</Note>
<p>
This plugin preprocesses your styles with stylis and uses the{' '}
<Code>no-parser.js</Code> entrypoint on styled-components.
</p>
<p>
This effectively removes stylis from your runtime bundle and should
slightly improve runtime performance and shrink your bundle size.
</p>
<p>
It automatically disables the <Code>minify</Code> option, since stylis
already does some minification on your CSS.
</p>
<p>
You can enable preprocessing with the <Code>preprocess</Code> option:
</p>
<CodeBlock code={preprocess} language="node" />
</SectionLayout>
<SectionLayout sub title="Minification">
<Note>
This option is turned on by default. If you experience mangled CSS
results, turn it off and open an issue please.
</Note>
<p>
This plugin minifies your styles in the tagged template literals, giving
you big bundle size savings.
</p>
<Note>
This operation may potentially break your styles in some rare cases, so
we recommend to keep this option enabled in development if it's enabled
in the production build.
</Note>
<p>
You can disable minification with the <Code>minify</Code> option:
</p>
<CodeBlock code={minify} language="node" />
</SectionLayout>
<SectionLayout sub title="Template String Transpilation">
<p>
We also transpile <Code>styled-components</Code> tagged template
literals down to a smaller representation than what Babel normally does,
because <Code>styled-components</Code> template literals don't need to
be 100% spec compliant. see{' '}
<Link inline href="#tagged-template-literals">Tagged Template Literals</Link> for
more information about that) You can use the {' '}
<Code>transpileTemplateLiterals</Code> option to turn this feature off.
</p>
<CodeBlock code={transpilation} language="node" />
</SectionLayout>
</SectionLayout>;

export default BabelPlugin;
75 changes: 50 additions & 25 deletions pages/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,69 +6,94 @@
"sections": [
{
"title": "Motivation"
}, {
},
{
"title": "Installation"
}, {
},
{
"title": "Getting Started"
}, {
},
{
"title": "Passed props"
}, {
},
{
"title": "Adapting based on props"
}, {
},
{
"title": "Styling any components"
}, {
},
{
"title": "Extending styles"
}, {
},
{
"title": "Attaching additional props"
}, {
},
{
"title": "Animations"
}, {
},
{
"title": "React Native"
}
]
}, {
},
{
"title": "Advanced",
"pathname": "advanced",
"sections": [
{
"title": "Theming"
}, {
},
{
"title": "Refs"
}, {
},
{
"title": "Security"
}, {
},
{
"title": "Existing CSS"
}, {
},
{
"title": "Media Templates"
}, {
},
{
"title": "Tagged Template Literals"
}, {
},
{
"title": "Server Side Rendering"
},
{
"title": "Babel Plugin"
}
]
}, {
},
{
"title": "API Reference",
"pathname": "api",
"sections": [
{
"title": "Primary"
}, {
},
{
"title": "Helpers"
}, {
},
{
"title": "Supported CSS"
}, {
},
{
"title": "Flow"
}, {
},
{
"title": "TypeScript"
}
]
}, {
},
{
"title": "FAQs",
"pathname": "faqs",
"sections": [
{"title": "Can I nest rules?"},
{"title": "Can I refer to other components?"},
{"title": "Can I use css frameworks?"}
{ "title": "Can I nest rules?" },
{ "title": "Can I refer to other components?" },
{ "title": "Can I use css frameworks?" }
]
}
]
Expand Down
34 changes: 16 additions & 18 deletions pages/docs/advanced.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import React from 'react'
import DocsLayout from '../../components/DocsLayout'
import NextPage from '../../components/NextPage'
import React from 'react';
import DocsLayout from '../../components/DocsLayout';
import NextPage from '../../components/NextPage';

import Theming from '../../components/advanced/theming'
import Refs from '../../components/advanced/refs'
import Security from '../../components/advanced/security'
import ExistingCSS from '../../components/advanced/existing-css'
import MediaTemplates from '../../components/advanced/media-templates'
import TaggedTemplateLiterals from '../../components/advanced/tagged-template-literals'
import ServerSideRendering from '../../components/advanced/server-side-rendering'
import Theming from '../../components/advanced/theming';
import Refs from '../../components/advanced/refs';
import Security from '../../components/advanced/security';
import ExistingCSS from '../../components/advanced/existing-css';
import MediaTemplates from '../../components/advanced/media-templates';
import TaggedTemplateLiterals from '../../components/advanced/tagged-template-literals';
import ServerSideRendering from '../../components/advanced/server-side-rendering';
import BabelPlugin from '../../components/advanced/babel-plugin';

const Advanced = () => (
const Advanced = () =>
<DocsLayout title="Advanced">
<Theming />
<Refs />
Expand All @@ -19,12 +20,9 @@ const Advanced = () => (
<MediaTemplates />
<TaggedTemplateLiterals />
<ServerSideRendering />
<BabelPlugin />

<NextPage
href="/docs/api"
title="API Reference"
/>
</DocsLayout>
)
<NextPage href="/docs/api" title="API Reference" />
</DocsLayout>;

export default Advanced
export default Advanced;
10 changes: 10 additions & 0 deletions test/components/NavBar/__snapshots__/Menu.spec.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,16 @@ exports[`Menu renders correctly 1`] = `
Server Side Rendering
</a>
</h5>
<h5
className="c5"
>
<a
className="c4"
href="/docs/advanced#babel-plugin"
>
Babel Plugin
</a>
</h5>
</div>
<div
className="c2"
Expand Down
16 changes: 16 additions & 0 deletions test/components/NavBar/__snapshots__/index.spec.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,22 @@ exports[`NavBar renders correctly 1`] = `
</styled.a>
</h5>
</styled.h5>
<styled.h5>
<h5
className="c11"
>
<styled.a
href="/docs/advanced#babel-plugin"
>
<a
className="c5"
href="/docs/advanced#babel-plugin"
>
Babel Plugin
</a>
</styled.a>
</h5>
</styled.h5>
</div>
</styled.div>
<styled.div
Expand Down
Loading

0 comments on commit 573efef

Please sign in to comment.