L'outil de build qui va te donner envie de faire du front !
Par @spyl94, très inspiré par le guide brunch de @porteneuve
Â
Â
Â
Conversion CSS4 -> CSS3
...
Â
Mais aussi avant eux : Make, Ant, Raven...
Ils sont utilisés pour builder des assets mais peuvent être utilisé pour tout et nimporte quoi !
Â
Â
https://github.com/brunch/brunch
Une petite star en plus ne peut pas lui faire de mal ;-)
Brunch est une pipeline.
Â
Brunch fait du build incrémental*.
* Le watcher ne relance que les étapes de construction nécessaires !
Convention Over Configuration
Brunch repose sur des conventions solides, réduisant la configuration au minimum vital.
Un fichier de configuration :
Vous utilisez déjà sans doute plus ou moins les conventions par défaut de Brunch ! Au pire, elles sont modifiables ;)
// brunch-config.coffee
module.exports = config:
files:
javascripts: joinTo: 'app.js'
stylesheets: joinTo: 'app.css'
Ca fonctionne ! Et les source maps sont en cadeaux :)
Convention Over Configuration
$ npm install --save mon-module-brunchÂ
Â
Â
pour les modules aussi...
Exemple : on va optimiser nos images lors d'un build production
It works babe \o/ YEAY o/
$ brew install optipng jpeg
$ npm install --save imageoptmizer-brunch
$ brunch build --production
Des squelettes pour les besoins classiques et
 vous épargner quelques recherches !
Â
// bower.json
{
"name": "react-brunch-demo",
"version": "1.0.0",
"private": true,
"dependencies": {
"flux": "~2.0.2",
"react": "~0.13.1",
"fetch": "~0.7.0",
"eventEmitter": "~4.2.11"
}
}
Â
Code : react-brunch-demo
// package.json
{
"name": "react-brunch-demo",
"version": "1.0.0",
"description": "It's a demo bla bla bla.",
"scripts": {},
"author": "Spyl <[email protected]>",
"license": "MIT",
"dependencies": {
"babel-brunch": "^5.0.0",
"brunch": "^1.8.3",
"stylus-brunch": "^1.8.1"
},
"devDependencies": {
"fb-flo-brunch": "^1.7.22"
}
}
On installe nos dépendances...
// brunch-config.js
exports.config = {
paths: {
watched: [
'app',
'node_modules/babel-brunch/node_modules/babel-core/browser-polyfill.min.js'
]
},
files: {
javascripts: {
joinTo: {
'js/vendor.js': [
'node_modules/babel-brunch/node_modules/babel-core/browser-polyfill.min.js',
'bower_components/eventEmitter/EventEmitter.js',
'bower_components/react/react.js',
'bower_components/flux/dist/Flux.js',
'bower_components/fetch/fetch.js'
],
'js/app.js': /^app/
}
},
stylesheets: {
joinTo: 'styles/app.css'
}
},
onCompile: function() {
require('fs').appendFile('public/js/app.js', '\n\nrequire(\'js/app\');');
}
};
On configure (un peu) brunch
// app/js/app.js
import App from './components/App';
React.render(
<App />,
document.getElementById("example")
);
Â
// app/styles/app.styl
@import "_base"
body
background blue
border none
// app/assets/index.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="styles/app.css">
<title>React demo with brunch and babel</title>
</head>
<body>
<div id="example"></div>
<script src="js/vendor.js"></script>
<script src="js/app.js"></script>
</body>
</html>
import React from 'react';
Â
En effet, Bower n'expose pas de modules, mais directement des variables globales... :-(
On a pas eu besoin de faire :
C'est l'un des seul défaut de Brunch, pas encore d'interface avec npm (type browserify/webpack) mais c'est en cours !
Â
Â
Du coup pas de shims de modules noyau non plus d'où l'utilisation d'EventEmitter plutôt qu'un simple require('events') !
contrairement à un module strict !
Â
On l'utilise pour CapCollectif-SF2 et CapCollectif-DeploymentToolÂ
Jetez donc un coup d'oeil au code ;)