forked from dittos/animeta
-
Notifications
You must be signed in to change notification settings - Fork 0
/
webpack.config.js
117 lines (103 loc) · 3.54 KB
/
webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
var fs = require('fs');
var path = require('path');
var webpack = require('webpack');
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var clientDefinePlugin = new webpack.DefinePlugin({
'process.env.CLIENT': JSON.stringify(true),
});
module.exports = config = {
plugins: [
versionMapPlugin,
clientDefinePlugin
],
entry: {
table_index: './frontend/js/table-index.react.js',
table_period: './frontend/js/table-period.react.js',
library: './frontend/js/library.react.js',
work: './frontend/js/work.react.js',
post: './frontend/js/post.react.js',
index: './frontend/js/index.react.js',
chart: './frontend/js/chart.react.js',
common: './frontend/js/common.js'
},
output: {
path: 'animeta/static/build',
publicPath: '/static/build/',
filename: '[name].js'
},
module: {
loaders: [
{ test: /\.js[x]?$/, exclude: /node_modules/, loader: 'babel-loader?optional=es7.objectRestSpread&blacklist=es3.propertyLiterals' },
{ test: /\.less$/, loader: 'style!css!autoprefixer!less' },
{ test: /\.less\?extract$/, loader: ExtractTextPlugin.extract('style', 'css!autoprefixer!less') },
{ test: /\.(png|gif|svg)$/, loader: 'url' }
]
}
};
function versionMapPlugin() {
this.plugin('done', function(stats) {
var assets = stats.toJson().assetsByChunkName;
Object.keys(assets).forEach(function (key) {
if (!Array.isArray(assets[key]))
assets[key] = [assets[key]];
var value = {};
assets[key].forEach(function (name) {
var ext = name.split('.').pop();
if (ext == 'map')
return;
value[ext] = name;
});
assets[key] = value;
});
var source = 'ASSET_FILENAMES = ' + JSON.stringify(assets);
fs.writeFileSync(path.join(__dirname, 'animeta/assets.py'), source);
});
}
if (process.env.NODE_ENV == 'production') {
console.log('* Production Build');
var moduleReplacePlugin = new webpack.NormalModuleReplacementPlugin(
/ReactErrorUtils$/, __dirname + '/frontend/js/ReactErrorUtils.js'
);
var definePlugin = new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
});
var uglifyPlugin = new webpack.optimize.UglifyJsPlugin();
var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common', 'common-[hash].js');
config.plugins = [
moduleReplacePlugin,
definePlugin,
uglifyPlugin,
commonsPlugin,
new ExtractTextPlugin('[name]-[contenthash].css')
].concat(config.plugins);
config.devtool = 'source-map';
config.output.filename = '[name]-[hash].js';
} else {
console.log('* Development Build');
var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common', 'common.js');
config.plugins = [
commonsPlugin,
new ExtractTextPlugin('[name].css')
].concat(config.plugins);
config.devtool = 'cheap-source-map';
config.module.postLoaders = [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'jshint'
}
];
config.jshint = {
browser: true,
es3: true,
undef: true,
unused: true,
predef: ['_gaq', 'alert'],
// Warnings
"-W058": false, // new A;
// Relaxing options
eqnull: true,
globalstrict: true,
proto: true
};
}