Skip to content

Commit

Permalink
CSS Modules example
Browse files Browse the repository at this point in the history
  • Loading branch information
stereobooster committed Dec 19, 2017
1 parent 927c462 commit 1e2aef9
Show file tree
Hide file tree
Showing 17 changed files with 7,240 additions and 0 deletions.
10 changes: 10 additions & 0 deletions examples/with-css-modules/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
logs
*.log
npm-debug.log*
.DS_Store

coverage
node_modules
build
public/static
.env.*.local
1 change: 1 addition & 0 deletions examples/with-css-modules/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Razzle and CSS modules
20 changes: 20 additions & 0 deletions examples/with-css-modules/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "razzle-cssmodules",
"version": "0.1.0",
"license": "MIT",
"scripts": {
"start": "razzle start",
"build": "razzle build",
"test": "razzle test --env=jsdom",
"start:prod": "NODE_ENV=production node build/server.js"
},
"dependencies": {
"express": "^4.16.2",
"isomorphic-style-loader": "^4.0.0",
"raf": "^3.4.0",
"razzle": "^0.8.7",
"react": "^16.2.0",
"react-dom": "^16.2.0",
"react-router-dom": "^4.2.2"
}
}
Binary file added examples/with-css-modules/public/favicon.ico
Binary file not shown.
2 changes: 2 additions & 0 deletions examples/with-css-modules/public/robots.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
User-agent: *

198 changes: 198 additions & 0 deletions examples/with-css-modules/razzle.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
"use strict";

const autoprefixer = require("autoprefixer");
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const path = require("path");

module.exports = {
modify(config, { target, dev }, webpack) {
const appConfig = Object.assign({}, config);
const isServer = target !== "web";

// Options for PostCSS as we reference these options twice
// Adds vendor prefixing to support IE9 and above
const postCSSLoaderOptions = {
ident: "postcss", // https://webpack.js.org/guides/migrating/#complex-options
plugins: () => [
require("postcss-flexbugs-fixes"),
autoprefixer({
browsers: [
">1%",
"last 4 versions",
"Firefox ESR",
"not ie < 9" // React doesn't support IE8 anyway
],
flexbox: "no-2009"
})
]
};

if (dev) {
appConfig.module.rules = appConfig.module.rules.map(rule => {
if (rule.test && !!".css".match(rule.test)) {
return {
test: /\.css$/,
exclude: /\.module\.css$/,
use: isServer
? [
{
loader: "css-loader",
options: {
importLoaders: 1
}
}
]
: [
require.resolve("style-loader"),
{
loader: require.resolve("css-loader"),
options: {
importLoaders: 1
}
},
{
loader: require.resolve("postcss-loader"),
options: postCSSLoaderOptions
}
]
};
}
return rule;
});

appConfig.module.rules.push({
test: /\.module\.css$/,
use: isServer
? [
"isomorphic-style-loader",
{
loader: require.resolve("css-loader"),
options: {
importLoaders: 1,
modules: true,
localIdentName: "[path]__[name]___[local]"
}
}
]
: [
require.resolve("style-loader"),
{
loader: require.resolve("css-loader"),
options: {
importLoaders: 1,
modules: true,
localIdentName: "[path]__[name]___[local]"
}
},
{
loader: require.resolve("postcss-loader"),
options: postCSSLoaderOptions
}
]
});
} else if (!dev && !isServer) {
appConfig.module.rules = appConfig.module.rules.map(rule => {
if (rule.test && !!".css".match(rule.test)) {
return {
test: /\.css$/,
exclude: /\.module\.css$/,
use: ExtractTextPlugin.extract({
fallback: {
loader: require.resolve("style-loader"),
options: {
hmr: false
}
},
use: [
{
loader: require.resolve("css-loader"),
options: {
importLoaders: 1,
minimize: true,
sourceMap: true
}
},
{
loader: require.resolve("postcss-loader"),
options: postCSSLoaderOptions
}
]
})
};
}
return rule;
});

appConfig.module.rules.push({
test: /\.module\.css$/,
use: ExtractTextPlugin.extract({
fallback: {
loader: require.resolve("style-loader"),
options: {
hmr: false
}
},
use: [
{
loader: require.resolve("css-loader"),
options: {
importLoaders: 1,
minimize: true,
sourceMap: true,
modules: true,
localIdentName: "[path]__[name]___[local]"
}
},
{
loader: require.resolve("postcss-loader"),
options: postCSSLoaderOptions
}
]
})
});

appConfig.plugins.push(
new ExtractTextPlugin("static/css/[name].[contenthash:8].css")
);
} else if (!dev && isServer) {
appConfig.module.rules = appConfig.module.rules.map(rule => {
if (rule.test && !!".css".match(rule.test)) {
return {
test: /\.css$/,
exclude: /\.module\.css$/,
use: [
{
loader: require.resolve("css-loader"),
options: {
importLoaders: 1,
minimize: true,
sourceMap: true
}
}
]
};
}
return rule;
});

appConfig.module.rules.push({
test: /\.module\.css$/,
use: [
"isomorphic-style-loader",
{
loader: require.resolve("css-loader"),
options: {
importLoaders: 1,
minimize: true,
sourceMap: true,
modules: true,
localIdentName: "[path]__[name]___[local]"
}
}
]
});
}

loader: return appConfig;
}
};
5 changes: 5 additions & 0 deletions examples/with-css-modules/src/App.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
body {
margin: 0;
padding: 0;
font-family: sans-serif;
}
13 changes: 13 additions & 0 deletions examples/with-css-modules/src/App.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import React from 'react';
import Route from 'react-router-dom/Route';
import Switch from 'react-router-dom/Switch';
import Home from './Home';
import './App.css';

const App = () => (
<Switch>
<Route exact path="/" component={Home} />
</Switch>
);

export default App;
16 changes: 16 additions & 0 deletions examples/with-css-modules/src/App.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import App from './App';
import React from 'react';
import ReactDOM from 'react-dom';
import MemoryRouter from 'react-router-dom/MemoryRouter';

describe('<App />', () => {
test('renders without exploding', () => {
const div = document.createElement('div');
ReactDOM.render(
<MemoryRouter>
<App />
</MemoryRouter>,
div
);
});
});
33 changes: 33 additions & 0 deletions examples/with-css-modules/src/Home.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import React, { Component } from 'react';
import logo from './react.svg';
import styles from './Home.module.css';

class Home extends Component {
render() {
return (
<div className={styles.Home}>
<div className={styles.header}>
<img src={logo} className={styles.logo} alt="logo" />
<h2>Welcome to Razzle</h2>
</div>
<p className={styles.intro}>
To get started, edit <code>src/App.js</code> or{' '}
<code>src/Home.js</code> and save to reload.
</p>
<ul className={styles.resources}>
<li>
<a href="https://github.com/jaredpalmer/razzle">Docs</a>
</li>
<li>
<a href="https://github.com/jaredpalmer/razzle/issues">Issues</a>
</li>
<li>
<a href="https://palmer.chat">Community Slack</a>
</li>
</ul>
</div>
);
}
}

export default Home;
33 changes: 33 additions & 0 deletions examples/with-css-modules/src/Home.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
.Home {
text-align: center;
}

.logo {
animation: Home-logo-spin infinite 20s linear;
height: 80px;
}

.header {
background-color: #222;
height: 150px;
padding: 20px;
color: white;
}

.intro {
font-size: large;
}

.resources {
list-style: none;
}

.resources > li {
display: inline-block;
padding: 1rem;
}

@keyframes Home-logo-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
15 changes: 15 additions & 0 deletions examples/with-css-modules/src/client.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import App from './App';
import BrowserRouter from 'react-router-dom/BrowserRouter';
import React from 'react';
import { hydrate } from 'react-dom';

hydrate(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root')
);

if (module.hot) {
module.hot.accept();
}
26 changes: 26 additions & 0 deletions examples/with-css-modules/src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import app from './server';
import http from 'http';

const server = http.createServer(app);

let currentApp = app;

server.listen(process.env.PORT || 3000, (error) => {
if (error) {
console.log(error)
}

console.log('🚀 started')
});

if (module.hot) {
console.log('✅ Server-side HMR Enabled!');

module.hot.accept('./server', () => {
console.log('🔁 HMR Reloading `./server`...');
server.removeListener('request', currentApp);
const newApp = require('./server').default;
server.on('request', newApp);
currentApp = newApp;
});
}
6 changes: 6 additions & 0 deletions examples/with-css-modules/src/react.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 1e2aef9

Please sign in to comment.