Compare commits

..

20 Commits

Author SHA1 Message Date
Chris 00414460b2 0.2.2 2015-10-19 10:46:21 +02:00
Chris f1eb6504e0 Added current version of webpack-dev-server to dependencies list 2015-10-19 10:46:10 +02:00
Chris 515969e6be 0.2.1 2015-10-16 07:58:19 +02:00
Chris 05a06a819a Added jsx-uses-react flag in eslint to prevent false positives about react included but not used in components. 2015-10-16 07:57:39 +02:00
Chris 2188e5cd0b 0.2.0 2015-10-12 07:57:52 +02:00
Chris 4e4993e5b5 Added compatibility for react 0.14 2015-10-12 07:57:40 +02:00
Chris 5d46050bbb Added travis badge 2015-10-07 08:48:47 +02:00
Chris b40367218f Added travis support 2015-10-07 08:46:27 +02:00
Chris 0280358f61 0.1.0 2015-09-17 08:02:57 +02:00
Chris f871f2aef7 Added own configuration objects for different webpack environments. 2015-09-17 08:02:36 +02:00
Chris 22be5fe0f4 Added stylesheet types to null-loader for unit tests 2015-09-16 11:37:09 +02:00
Chris 393b04526a 0.0.10 2015-09-16 10:27:34 +02:00
Chris c2b2d99f61 Added support for alternate loaders. 2015-09-16 10:27:22 +02:00
Chris 02ff1ecad6 0.0.9 2015-09-10 14:57:19 +02:00
Chris 12a446f747 0.0.8 2015-09-10 14:56:47 +02:00
Chris 262c0bbc9e Added shortcut for releases 2015-09-10 14:56:24 +02:00
Chris 0906a22faa 0.0.7 2015-09-10 14:54:02 +02:00
Chris d94724832e Added yeoman image as default view. 2015-09-10 14:53:32 +02:00
Chris 4c7e9732af 0.0.6 2015-09-09 22:05:00 +02:00
Chris 570db8e4ea Added some performance improvements to webpack configuration. 2015-09-09 22:04:55 +02:00
19 changed files with 265 additions and 149 deletions
+2 -1
View File
@@ -23,6 +23,7 @@
"no-unused-vars": 1,
"no-trailing-spaces": [1, { "skipBlankLines": true }],
"no-unreachable": 1,
"no-alert": 0
"no-alert": 0,
"react/jsx-uses-react": 1
}
}
+6
View File
@@ -0,0 +1,6 @@
language: node_js
node_js:
- '4.1.0'
before_install:
- currentfolder=${PWD##*/}
- if [ "$currentfolder" != 'react-webpack-template' ]; then cd .. && eval "mv $currentfolder react-webpack-template" && cd react-webpack-template; fi
+9
View File
@@ -0,0 +1,9 @@
# react-webpack-template - Changelog
## 0.2.0:
___Upgrades:___
1. Updated React from 0.13 to 0.14 (using ```^0.14```) as version string. This included minor code changes for components (now use the splitted "React"-Package) and the runner (Using React-DOM).
2. Updated the shallow renderer for unit tests.
___Backwards incompatible changes:___
1. Default unit tests do not need to traverse down to `Component._store.props`, but directly to `Component.props`. Please keep this in mind when using properties in your tests.
+6 -4
View File
@@ -1,20 +1,22 @@
# Welcome to react-webpack-template
This repository holds a base template for the new version of generator-react-webpack.
> This repository holds a base template for the new version of generator-react-webpack.
It can be understood as the prototype for newly generated projects.
[![Build Status](https://travis-ci.org/weblogixx/react-webpack-template.svg)](https://travis-ci.org/weblogixx/react-webpack-template)
## Features
The following features are planned to be included in the final version:
- [x] Webpack and Webpack-Dev-Server, including hot-loader
- [x] Babel and JSX
- [x] Mocha Unit tests (*optional*)
- [ ] React.Router
- [x] EsLint Support
- [x] No dependency on grunt, gulp or the next hot taskrunner!
- [x] The dynamic webpack configuration is clunky, there must be a better way to do that!
- [x] Karmas webpack configuration is not included in the global webpack.config.js file, but it really should
## Todo
- [ ] The dynamic webpack configuration is clunky, there must be a better way to do that!
- [ ] Karmas webpack configuration is not included in the global webpack.config.js file, but it really should
- [ ] Better performance for webpack builds
## What is it for?
This template can be used directly for the creation of new projects.
+68
View File
@@ -0,0 +1,68 @@
var path = require('path');
var port = 8000;
var srcPath = path.join(__dirname, '/../src');
var publicPath = '/assets/';
module.exports = {
port: port,
debug: true,
output: {
path: path.join(__dirname, '/../dist/assets'),
filename: 'app.js',
publicPath: publicPath
},
devServer: {
contentBase: './src/',
historyApiFallback: true,
hot: true,
port: port,
publicPath: publicPath,
noInfo: false
},
resolve: {
extensions: ['', '.js', '.jsx'],
alias: {
actions: srcPath + '/actions/',
components: srcPath + '/components/',
sources: srcPath + '/sources/',
stores: srcPath + '/stores/',
styles: srcPath + '/styles/'
}
},
module: {
preLoaders: [
{
test: /\.(js|jsx)$/,
include: path.join(__dirname, 'src'),
loader: 'eslint-loader'
}
],
loaders: [
{
test: /\.css$/,
loader: 'style!css'
},
{
test: /\.sass/,
loader: 'style-loader!css-loader!sass-loader?outputStyle=expanded&indentedSyntax'
},
{
test: /\.scss/,
loader: 'style-loader!css-loader!sass-loader?outputStyle=expanded'
},
{
test: /\.less/,
loader: 'style-loader!css-loader!less-loader'
},
{
test: /\.styl/,
loader: 'style-loader!css-loader!stylus-loader'
},
{
test: /\.(png|jpg|gif|woff|woff2)$/,
loader: 'url-loader?limit=8192'
}
]
}
};
+28
View File
@@ -0,0 +1,28 @@
var path = require('path');
var webpack = require('webpack');
var _ = require('lodash');
var baseConfig = require('./base');
var config = _.merge({
entry: [
'webpack-dev-server/client?http://127.0.0.1:8000',
'webpack/hot/only-dev-server',
'./src/components/run'
],
cache: true,
devtool: 'eval',
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin()
]
}, baseConfig);
// Add needed loaders
config.module.loaders.push({
test: /\.(js|jsx)$/,
loader: 'react-hot!babel-loader',
include: path.join(__dirname, '/../src')
});
module.exports = config;
+26
View File
@@ -0,0 +1,26 @@
var path = require('path');
var webpack = require('webpack');
var _ = require('lodash');
var baseConfig = require('./base');
var config = _.merge({
entry: path.join(__dirname, '../src/components/run'),
cache: false,
devtool: 'sourcemap',
plugins: [
new webpack.optimize.DedupePlugin(),
new webpack.optimize.UglifyJsPlugin(),
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.optimize.AggressiveMergingPlugin(),
new webpack.NoErrorsPlugin()
]
}, baseConfig);
config.module.loaders.push({
test: /\.(js|jsx)$/,
loader: 'babel',
include: path.join(__dirname, '/../src')
});
module.exports = config;
+33
View File
@@ -0,0 +1,33 @@
var path = require('path');
var srcPath = path.join(__dirname, '/../src/');
module.exports = {
devtool: 'eval',
module: {
loaders: [
{
test: /\.(png|jpg|gif|woff|woff2|css|sass|scss|less|styl)$/,
loader: 'null-loader'
},
{
test: /\.(js|jsx)$/,
loader: 'babel-loader',
include: [
path.join(__dirname, '/../src'),
path.join(__dirname, '/../test')
]
}
]
},
resolve: {
extensions: ['', '.js', '.jsx'],
alias: {
actions: srcPath + 'actions/',
helpers: path.join(__dirname, '/../test/helpers'),
components: srcPath + 'components/',
sources: srcPath + 'sources/',
stores: srcPath + 'stores/',
styles: srcPath + 'styles/'
}
}
};
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

+3 -33
View File
@@ -1,5 +1,4 @@
var path = require('path');
var srcPath = __dirname + '/src/';
var webpackCfg = require('./webpack.config');
module.exports = function(config) {
config.set({
@@ -12,43 +11,14 @@ module.exports = function(config) {
captureTimeout: 60000,
frameworks: ['phantomjs-shim', 'mocha', 'chai'],
client: {
mocha: {
}
mocha: {}
},
singleRun: true,
reporters: ['mocha'],
preprocessors: {
'test/loadtests.js': ['webpack', 'sourcemap']
},
webpack: {
cache: true,
devtool: 'inline-source-map',
module: {
loaders: [
{
test: /\.(css|png|jpg|gif|woff|woff2)$/,
loader: 'null-loader'
},
{
test: /\.(js|jsx)$/,
loader: 'babel-loader',
exclude: /node_modules/
}
]
},
resolve: {
extensions: ['', '.js', '.jsx'],
alias: {
actions: srcPath + '/actions/',
helpers: path.join(__dirname, 'test', 'helpers'),
components: srcPath + '/components/',
sources: srcPath + '/sources/',
stores: srcPath + '/stores/',
styles: srcPath + '/styles/'
}
}
},
webpack: webpackCfg,
webpackServer: {
noInfo: true
}
+12 -6
View File
@@ -1,8 +1,8 @@
{
"name": "react-webpack-template",
"version": "0.0.5",
"version": "0.2.2",
"description": "A base skeleton template for react and webpack without task runners",
"main": "index.js",
"main": "server.js",
"scripts": {
"start": "node server.js --env=dev",
"test": "karma start",
@@ -11,8 +11,11 @@
"serve:dist": "node server.js --env=dist",
"dist": "npm run copy & webpack --env=dist",
"lint": "eslint ./src",
"copy": "copyfiles -f ./src/index.html ./dist",
"clean": "rimraf dist/*"
"copy": "copyfiles -f ./src/index.html ./src/favicon.ico ./dist",
"clean": "rimraf dist/*",
"release:major": "npm version major && npm publish && git push --follow-tags",
"release:minor": "npm version minor && npm publish && git push --follow-tags",
"release:patch": "npm version patch && npm publish && git push --follow-tags"
},
"repository": {
"type": "git",
@@ -59,10 +62,13 @@
"style-loader": "^0.12.3",
"url-loader": "^0.5.6",
"webpack": "^1.12.0",
"webpack-dev-server": "^1.10.1"
"webpack-dev-server": "^1.12.0"
},
"dependencies": {
"lodash": "^3.10.1",
"normalize.css": "^3.0.3",
"react": "^0.13.3"
"react": "^0.14.0",
"react-addons-test-utils": "^0.14.0",
"react-dom": "^0.14.0"
}
}
+5 -2
View File
@@ -1,13 +1,16 @@
require('normalize.css');
require('styles/App.css');
import React from 'react/addons';
import React from 'react';
let yeomanImage = require('../images/yeoman.png');
class AppComponent extends React.Component {
render() {
return (
<div className="index">
Content
<img src={yeomanImage} alt="Yeoman Generator" />
<div className="notice">Please edit <code>src/components/Main.js</code> to get started!</div>
</div>
);
}
+2 -1
View File
@@ -1,5 +1,6 @@
import React from 'react';
import ReactDOM from 'react-dom';
import App from './Main';
// Render the main component into the dom
React.render(<App />, document.getElementById('app'));
ReactDOM.render(<App />, document.getElementById('app'));
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

+20
View File
@@ -1 +1,21 @@
/* Base Application Styles */
body {
color: #fff;
background: #222;
}
.index img {
margin: 40px auto;
border-radius: 4px;
background: #fff;
display: block;
}
.index .notice {
margin: 20px auto;
padding: 15px 0;
text-align: center;
border: 1px solid #000;
border-width: 1px 0;
background: #666;
}
+1 -5
View File
@@ -18,10 +18,6 @@ describe('MainComponent', () => {
});
it('should have its component name as default className', () => {
expect(MainComponent._store.props.className).to.equal('index');
});
it('should do something!', () => {
expect(true).to.be.true;
expect(MainComponent.props.className).to.equal('index');
});
});
+2 -2
View File
@@ -5,8 +5,8 @@
* @see http://simonsmith.io/unit-testing-react-components-without-a-dom/
* @author somonsmith
*/
import React from 'react/addons';
const TestUtils = React.addons.TestUtils;
import React from 'react';
import TestUtils from 'react-addons-test-utils';
/**
* Get the shallow rendered component
+42 -95
View File
@@ -1,100 +1,47 @@
var webpack = require('webpack');
var args = require('minimist')(process.argv.slice(2));
'use strict';
var path = require('path');
var env = args.env || 'dev';
var args = require('minimist')(process.argv.slice(2));
var port = 8000;
var srcPath = __dirname + '/src/';
var publicPath = '/assets/';
// List of allowed environments
var allowedEnvs = ['dev', 'dist', 'test'];
var config = {
port: port,
debug: true,
output: {
path: path.join(__dirname, 'dist/assets'),
filename: 'app.js',
publicPath: publicPath
},
devServer: {
contentBase: './src/',
historyApiFallback: true,
hot: true,
port: port,
publicPath: publicPath,
noInfo: false
},
resolve: {
extensions: ['', '.js', '.jsx'],
alias: {
actions: srcPath + '/actions/',
components: srcPath + '/components/',
sources: srcPath + '/sources/',
stores: srcPath + '/stores/',
styles: srcPath + '/styles/'
}
},
module: {
preLoaders: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
loader: 'eslint-loader'
}
],
loaders: [
{
test: /\.css$/,
loader: 'style!css'
},
{
test: /\.(png|jpg|gif|woff|woff2)$/,
loader: 'url-loader?limit=8192'
}
]
}
};
// Use config depending on environment
switch(env) {
case 'dist':
config.entry = './src/components/run';
config.cache = false;
config.devtool = false;
config.plugins = [
new webpack.optimize.DedupePlugin(),
new webpack.optimize.UglifyJsPlugin(),
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.optimize.AggressiveMergingPlugin(),
new webpack.NoErrorsPlugin()
];
// Add needed loaders
config.module.loaders.push({
test: /\.(js|jsx)$/,
loader: 'babel',
include: path.join(__dirname, 'src')
});
break;
default:
config.entry = [
'webpack-dev-server/client?http://127.0.0.1:' + port,
'webpack/hot/only-dev-server',
'./src/components/run'
];
config.cache = true;
config.devtool = 'sourcemap';
config.plugins = [
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin()
];
// Add needed loaders
config.module.loaders.push({
test: /\.(js|jsx)$/,
loader: 'react-hot!babel-loader',
include: path.join(__dirname, 'src')
});
// Set the correct environment
var env;
if(args._.length > 0 && args._.indexOf('start') !== -1) {
env = 'test';
} else if (args.env) {
env = args.env;
} else {
env = 'dev';
}
module.exports = config;
// Get available configurations
var configs = {
base: require(path.join(__dirname, 'cfg/base')),
dev: require(path.join(__dirname, 'cfg/dev')),
dist: require(path.join(__dirname, 'cfg/dist')),
test: require(path.join(__dirname, 'cfg/test'))
};
/**
* Get an allowed environment
* @param {String} env
* @return {String}
*/
function getValidEnv(env) {
var isValid = env && env.length > 0 && allowedEnvs.indexOf(env) !== -1;
return isValid ? env : 'dev';
}
/**
* Build the webpack configuration
* @param {String} env Environment to use
* @return {Object} Webpack config
*/
function buildConfig(env) {
var usedEnv = getValidEnv(env);
return configs[usedEnv];
}
module.exports = buildConfig(env);