pbca26
8 years ago
3 changed files with 216 additions and 0 deletions
@ -0,0 +1,7 @@ |
|||
IF EXIST "build" ( |
|||
rmdir "build" /s /q |
|||
) |
|||
|
|||
mkdir "build/assets" |
|||
xcopy src/assets build/ /s /e |
|||
npm run build-only |
@ -0,0 +1,207 @@ |
|||
const webpack = require('webpack'); |
|||
const path = require('path'); |
|||
|
|||
const DashboardPlugin = require('webpack-dashboard/plugin'); |
|||
const HtmlWebpackPlugin = require('html-webpack-plugin'); |
|||
const ExtractTextPlugin = require('extract-text-webpack-plugin'); |
|||
const autoprefixer = require('autoprefixer'); |
|||
|
|||
const nodeEnv = 'production'; |
|||
const isProduction = true; |
|||
|
|||
const jsSourcePath = path.join(__dirname, './src'); |
|||
const buildPath = path.join(__dirname, './build'); |
|||
const imgPath = path.join(__dirname, './src/assets/img'); |
|||
const wwwPath = path.join(__dirname, './www'); |
|||
|
|||
// Common plugins
|
|||
|
|||
/* |
|||
* The CommonsChunkPlugin is an opt-in feature that creates a separate file (known as a chunk), |
|||
* consisting of common modules shared between multiple entry points. |
|||
* By separating common modules from bundles, |
|||
* the resulting chunked file can be loaded once initially, |
|||
* and stored in cache for later use. |
|||
* This results in pagespeed optimizations as the browser can quickly serve the shared code from cache, |
|||
* rather than being forced to load a larger bundle whenever a new page is visited. |
|||
*/ |
|||
const plugins = [ |
|||
new webpack.optimize.CommonsChunkPlugin({ |
|||
name: 'vendor', |
|||
minChunks: Infinity, |
|||
filename: 'vendor.js', |
|||
}), |
|||
/* |
|||
* The DefinePlugin allows you to create global constants which can be configured at compile time. |
|||
* This can be useful for allowing different behaviour between development builds and release builds. |
|||
* For example, you might use a global constant to determine whether logging takes place; |
|||
* perhaps you perform logging in your development build but not in the release build. |
|||
* That's the sort of scenario the DefinePlugin facilitates. |
|||
*/ |
|||
new webpack.DefinePlugin({ |
|||
'process.env': { |
|||
NODE_ENV: JSON.stringify(nodeEnv), |
|||
}, |
|||
}), |
|||
new webpack.NamedModulesPlugin(), |
|||
new HtmlWebpackPlugin({ |
|||
template: path.join(wwwPath, 'index.html'), |
|||
path: buildPath, |
|||
filename: 'index.html', |
|||
}), |
|||
new webpack.LoaderOptionsPlugin({ |
|||
options: { |
|||
postcss: [ |
|||
autoprefixer({ |
|||
browsers: [ |
|||
'last 3 version', |
|||
'ie >= 10', |
|||
], |
|||
}), |
|||
], |
|||
context: __dirname, |
|||
}, |
|||
}) |
|||
]; |
|||
|
|||
// Common rules
|
|||
const rules = [ |
|||
{ |
|||
test: /\.(js|jsx)$/, |
|||
exclude: /node_modules/, |
|||
use: [ |
|||
'babel-loader', |
|||
], |
|||
}, |
|||
{ |
|||
test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/, |
|||
loader: 'url-loader?limit=10000&mimetype=application/font-woff' |
|||
}, |
|||
{ |
|||
test: /\.(ttf|eot|svg|png)(\?v=[0-9]\.[0-9]\.[0-9])?$/, |
|||
loader: 'file-loader' |
|||
}, |
|||
{ |
|||
test: /\.(png|gif|jpg|svg)$/, |
|||
include: imgPath, |
|||
use: 'url-loader?limit=20480&name=assets/[name].[ext]', |
|||
}, |
|||
]; |
|||
|
|||
if (isProduction) { |
|||
// Production plugins
|
|||
plugins.push( |
|||
new webpack.LoaderOptionsPlugin({ |
|||
minimize: true, |
|||
debug: false, |
|||
}), |
|||
new webpack.optimize.UglifyJsPlugin({ |
|||
sourceMap: false, |
|||
compress: { |
|||
warnings: false, |
|||
screw_ie8: true, |
|||
conditionals: true, |
|||
unused: true, |
|||
comparisons: true, |
|||
sequences: true, |
|||
dead_code: true, |
|||
evaluate: true, |
|||
if_return: true, |
|||
join_vars: true, |
|||
}, |
|||
output: { |
|||
comments: false, |
|||
}, |
|||
}), |
|||
new ExtractTextPlugin('style.css') |
|||
); |
|||
|
|||
// Production rules
|
|||
rules.push( |
|||
{ |
|||
test: /\.scss$/, |
|||
loader: ExtractTextPlugin.extract({ |
|||
fallback: 'style-loader', |
|||
use: [ |
|||
'css-loader', |
|||
'postcss-loader', |
|||
'sass-loader' |
|||
//'file-loader',
|
|||
//'url-loader'
|
|||
] |
|||
}), |
|||
} |
|||
); |
|||
} else { |
|||
// Development plugins
|
|||
plugins.push( |
|||
new webpack.HotModuleReplacementPlugin(), |
|||
new DashboardPlugin() |
|||
); |
|||
|
|||
// Development rules
|
|||
rules.push( |
|||
{ |
|||
test: /\.scss$/, |
|||
exclude: /node_modules/, |
|||
use: [ |
|||
'style-loader', |
|||
// Using source maps breaks urls in the CSS loader
|
|||
// https://github.com/webpack/css-loader/issues/232
|
|||
// This comment solves it, but breaks testing from a local network
|
|||
// https://github.com/webpack/css-loader/issues/232#issuecomment-240449998
|
|||
// 'css-loader?sourceMap',
|
|||
'css-loader', |
|||
'postcss-loader', |
|||
'sass-loader?sourceMap', |
|||
], |
|||
} |
|||
); |
|||
} |
|||
|
|||
module.exports = { |
|||
devtool: isProduction ? 'eval' : 'source-map', |
|||
context: jsSourcePath, |
|||
entry: { |
|||
js: './index.js' |
|||
}, |
|||
output: { |
|||
path: buildPath, |
|||
publicPath: '', |
|||
filename: 'app.js', |
|||
}, |
|||
module: { |
|||
rules, |
|||
}, |
|||
resolve: { |
|||
extensions: ['.webpack-loader.js', '.web-loader.js', '.loader.js', '.js', '.jsx'], |
|||
modules: [ |
|||
path.resolve(__dirname, 'node_modules'), |
|||
jsSourcePath, |
|||
], |
|||
}, |
|||
plugins, |
|||
devServer: { |
|||
contentBase: isProduction ? './build' : './src', |
|||
historyApiFallback: true, |
|||
port: 3000, |
|||
compress: isProduction, |
|||
inline: !isProduction, |
|||
hot: !isProduction, |
|||
stats: { |
|||
assets: true, |
|||
children: false, |
|||
chunks: false, |
|||
hash: false, |
|||
modules: false, |
|||
publicPath: false, |
|||
timings: true, |
|||
version: false, |
|||
warnings: true, |
|||
colors: { |
|||
green: '\u001b[32m', |
|||
}, |
|||
}, |
|||
}, |
|||
}; |
|||
|
Loading…
Reference in new issue