Daniel Kopka / @danielkopka / 20.01.2016 Warsaw
Senior Software Engineer @ Syncano
Flow
Tools
Project layout
What kind of steps we need to take from source to deployment
Grunt
Gulp
Scripts (package.json)
ShellJS
Plain text is not enough
JSX - Babel
ES6 - Babel
CSS pre-processors - up to you
Promise - Bluebird
Polyfills - Babel
Routing - react-routing / react-router
// .babelrc
{
"presets": ["react", "es2015", "stage-2"],
"plugins": ["add-module-exports"],
"env": {
"development": {
"presets": ["react-hmre"]
}
}
}
// Build
babel src --out-dir lib
Because style matters
function() {
}
function ()
{
}
JSHint
JSLint
ESLint + eslint-plugin-react
// .eslintrc
{
"parser": "babel-eslint",
"env": {
"browser": true,
"es6": true
},
"plugins": [
"react"
],
"rules": {
"no-inline-comments": 2,
"comma-dangle": [2, "never"]
...
}
}
// Lint
eslint src/** test/**
Because nobody does it
React DOM - jest-cli / karma / react-addons-test-utils
Unit Tests - mocha / chai / should
Integration Tests - Nightwatch / BrowserSync
Browser Tests - karma + phantomjs
Mocking - jest-cli / mockery / sinon / nock
describe('Some Object', function() {
describe('#init()', function() {
it('should have properties', function() {
var baseObject = {x: 1, y: null};
should(baseObject).have.property('x').which.is.Number();
should(baseObject).have.property('y').which.is.null();
....
// Run
mocha 'test/unit/**/*.js' --compilers js:babel-register
Because we need to put it together
Source maps
Minification
Compression
Versioning
Cleanup
// webpack.config.js
module.exports = {
name: 'package',
devtool: 'source-map',
entry: path.join(__dirname, 'src', 'app.jsx'),
target: 'web',
module: {
loaders: [
{ test: /\.jsx$/, exclude: /node_modules/, loader: 'babel-loader'}
]
},
resolve: {
modulesDirectories: ['node_modules'],
extensions: ['', '.js', '.json']
}
}
// Run
webpack
Because someone will be using it
Files (sftp) - dploy
CloudFront
gh-pages :P - gh-pages
Because it's nice to simplify our lives
Development server - webpack-dev-server / beefy
Hot reloading - react-hot-loader / react-transform-hmr
There is no best one :)
Everything is a component
How to handle tests?
How to handle assets?
Dummy components
Smart components
Assets
Develop own solution :)
├── .babelrc
├── .eslintrc
├── .gitignore
├── .travis.yml
├── circle.yml
├── dist
├── docs
├── package.json
├── src
└── test
test/
├── e2e
└── unit
dist/
├── css
│ ├── app-a7943ea11d.css
│ ├── vendor-21ecda5146.css
│ └── icons-250c6f457d.css
├── fonts
│ └── icons
│ ├── Icons-05ae77937e.eot
│ ├── Icons-c2906c403a.woff
│ └── Icons-cff2ca9105.ttf
├── img
│ └── logo-f1e5710918.svg
├── index.html
└── js
├── app-0f88bd7d2e.js
└── vendor-21ecda5146.js
src/
├── apps
│ └── Account
│ │ ├── index.js
│ │ ├── Login.jsx
│ │ └── Login.css
│ └── index.js
├── components
│ ├── Button.css
│ └── Button.jsx
├── app.jsx
├── routes.jsx
└── assets
Daniel Kopka / @danielkopka / 20.01.2016 Warsaw
Senior Software Engineer @ Syncano