forked from hiro0218/hakoniwa
/
webpack.config.js
119 lines (110 loc) · 2.19 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
118
119
//
const webpack = require('webpack');
const path = require('path');
const globule = require('globule');
const CopyPlugin = require('copy-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const dir = {
src : path.resolve(__dirname, 'public/src'),
dest: path.resolve(__dirname, 'public')
};
const convertExt = {
sass: 'css',
ts: 'js'
};
let files = {};
Object.keys(convertExt).forEach(from => {
const to = convertExt[from];
globule.find([`**/*.${from}`, `!**/_*.${from}`], {cwd: dir.src}).forEach(filename => {
files[filename.replace(new RegExp(`.${from}$`), `.${to}`)] = path.join(dir.src, filename);
});
});
const sassLoader = [
{
loader: 'css-loader',
options: {
minimize: true
}
},
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: () => [require('autoprefixer')()]
}
},
'sass-loader'
];
const tsLoader = [
'awesome-typescript-loader',
{
loader: 'tslint-loader',
options: {
configFile: 'tslint.json',
typeCheck: true
}
}
];
const config = {
context: dir.src,
target: 'web',
entry: files,
output: {
filename: '[name]',
jsonpFunction: 'vendor',
path: dir.dest
},
module: {
rules: [
{
test: /\.sass$/,
oneOf: [
{
resourceQuery: /inline/,
use: sassLoader
},
{
use: ExtractTextPlugin.extract(sassLoader)
}
]
},
{
test: /\.tsx?$/,
exclude: /node_modules(?!\/webpack-dev-server)/,
use: tsLoader
}
]
},
resolve: {
modules: [
'node_modules',
path.resolve(__dirname, 'public/src')
]
},
plugins: [
new ExtractTextPlugin('[name]'),
new CopyPlugin(
[{from: {glob: '**/*', dot: true}}],
{ignore: Object.keys(convertExt).map(ext => `*.${ext}`)}
),
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
}),
],
devServer: {
contentBase: dir.dest,
port: 8000,
hot: true
}
};
module.exports = env => {
if(env && env.production) {
config.plugins = config.plugins.concat([
new webpack.optimize.DedupePlugin(),
new webpack.optimize.UglifyJsPlugin(),
new webpack.optimize.OccurrenceOrderPlugin(true),
new webpack.optimize.AggressiveMergingPlugin()
]);
};
return config
};