You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

138 lines
3.5 KiB

const webpack = require('webpack');
const path = require('path');
const glob = require('glob').sync;
const NODE_ENV = process.env.NODE_ENV || 'development';
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const SpriteLoaderPlugin = require('svg-sprite-loader/plugin');
module.exports = {
entry: {
app: "./src/js/app.js",
courseRedactor: "./src/js/course-redactor.js",
mixpanel: "./src/js/third_party/mixpanel-2-latest.js",
sprite: glob('./src/icons/*.svg'),
images: glob('./src/img/*'),
fonts: glob('./src/fonts/*')
},
output: {
path: path.join(__dirname, "build"),
filename: NODE_ENV === 'development' ? '[name].js' : '[name].js',
library: '[name]',
//filename: NODE_ENV === 'development' ? '[name].js' : '[name].[id].[chunkhash].js',
//library: '[name]',
publicPath: '/static/',
},
module: {
loaders: [
{
test: /\.js$/,
exclude: /(node_modules|bower_components|third_party)/,
use: {
loader: 'babel-loader',
options: {
"presets": ["es2015"],
}
}
},
{
test: /third_party\/.*\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'file-loader',
options: {
name: "[name].[ext]"
}
}
},
{
test: /\.css$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: ['css-loader']
})
},
{
test: /\.s[ac]ss$/,
use: ExtractTextPlugin.extract({
fallback: 'style-loader',
use: ['css-loader', 'sass-loader']
})
},
{
test: /\.vue$/,
loader: 'vue-loader',
exclude: [/node_modules/],
options: {
loaders: {
js: 'babel-loader?presets[]=es2015',
css: 'vue-style-loader!css-loader',
scss: 'vue-style-loader!css-loader!sass-loader',
sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax'
}
}
},
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: path.resolve(__dirname, 'src/icons'),
options: {
extract: true,
symbolId: 'icon-[name]',
spriteFilename: 'img/sprite.svg'
},
},
{
test: /\.(png|gif|jpg|svg)$/,
exclude: path.resolve(__dirname, 'src/icons'),
loader: 'file-loader?name=[name].[ext]&outputPath=./img/'
},
{
test: /\.(ttf|otf|eot|woff(2)?)(\?[a-z0-9]+)?$/,
loader: 'file-loader?name=[name].[ext]'
}
]
},
plugins: [
new SpriteLoaderPlugin({ plainSprite: true }),
new webpack.DefinePlugin({
'process.env': {
'NODE_ENV': JSON.stringify(NODE_ENV)
}
}),
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery",
"window.$": "jquery"
}),
new ExtractTextPlugin('[name].css'),
],
resolve: {
alias: {
vue: 'vue/dist/vue.js',
},
extensions: ['*', '.js', '.vue']
},
watch: NODE_ENV === 'development',
watchOptions: {
ignored: "/node_modules/",
poll: 2000,
},
devtool: NODE_ENV === 'development' ? 'source-map' : false
};
if (NODE_ENV === 'production') {
module.exports.plugins.push(
new webpack.optimize.UglifyJsPlugin({
exclude: "sprite.js",
compress: {
warnings: false,
drop_console: true,
unsafe: true
}
})
);
}