-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebpack.config.js
126 lines (115 loc) · 3.37 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
120
121
122
123
124
125
126
// yarn add apply-loader autoprefixer babel-core babel-loader babel-preset-env copy-webpack-plugin css-loader extract-text-webpack-plugin globule node-sass postcss postcss-loader pug pug-loader sass-loader style-loader webpack webpack-dev-server
// develop : webpack-dev-server --open
// build : NODE_ENV=production webpack
const webpack = require('webpack')
const path = require('path')
const globule = require('globule')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
// ディレクトリの設定
const opts = {
srcDir: path.join(__dirname, 'src'),
destDir: path.join(__dirname, 'public')
}
// keyの拡張子のファイルが、valueの拡張子のファイルに変換される
const convertExtensions = {
pug: 'html',
sass: 'css',
js: 'js'
}
// トランスパイルするファイルを列挙する
// _から始まるファイルは、他からimportされるためのファイルとして扱い、個別のファイルには出力しない
const files = {}
Object.keys(convertExtensions).forEach(from => {
const to = convertExtensions[from]
globule.find([`**/*.${from}`, `!**/_*.${from}`], {cwd: opts.srcDir}).forEach(filename => {
files[filename.replace(new RegExp(`.${from}$`, 'i'), `.${to}`)] = path.join(opts.srcDir, filename)
})
})
// pugでトランスパイルする
const pugLoader = [
'apply-loader',
'pug-loader'
]
// Sassをトランスパイルし、autoprefixerをかけるようにする
const sassLoader = [
{
loader: 'css-loader',
options: {
minimize: true
}
},
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: (loader) => [require('autoprefixer')()]
}
},
'sass-loader'
]
// Babelでトランスパイルする
const jsLoader = {
loader: 'babel-loader',
query: {
presets: ['env']
}
}
const config = {
context: opts.srcDir,
entry: files,
output: {
filename: '[name]',
path: opts.destDir
},
module: {
rules: [
{
test: /\.pug$/,
use: ExtractTextPlugin.extract(pugLoader)
},
{
test: /\.sass$/,
oneOf: [
{
// pugから `require('./hoge.sass?inline')` のように呼ばれた時は、ExtractTextPluginをかけない
resourceQuery: /inline/,
use: sassLoader
},
{
// それ以外の時は、単純にファイルを生成する
use: ExtractTextPlugin.extract(sassLoader)
}
]
},
{
test: /\.js$/,
exclude: /node_modules(?!\/webpack-dev-server)/,
use: jsLoader
}
]
},
plugins: [
new ExtractTextPlugin('[name]'),
// convertExtensionsに含まれていないファイルは、単純にコピーする
new CopyWebpackPlugin(
[{from: {glob: '**/*', dot: true}}],
{ignore: Object.keys(convertExtensions).map((ext) => `*.${ext}`)}
),
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
})
],
devServer: {
contentBase: opts.destDir,
watchContentBase: true
}
}
if (process.env.NODE_ENV === 'production') {
config.plugins = config.plugins.concat([
new webpack.optimize.UglifyJsPlugin(),
new webpack.optimize.OccurrenceOrderPlugin(),
new webpack.optimize.AggressiveMergingPlugin()
])
}
module.exports = config