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", courseEdit: "./src/js/pages/course-edit.js", contest: "./src/js/pages/contest.js", contestEdit: "./src/js/pages/contest-edit.js", profile: "./src/js/pages/profile.js", userGalleryEdit: "./src/js/pages/user-gallery-edit.js", mixpanel: "./src/js/third_party/mixpanel-2-latest.js", sprite: glob('./src/icons/*.svg'), images: glob('./src/img/*.*'), imagesCertificates: glob('./src/img/user-certificates/*'), imagesGiftCertificates: glob('./src/img/gift-certificates/*'), imagesReviews: glob('./src/img/reviews/*'), fonts: glob('./src/fonts/*'), }, output: { path: path.join(__dirname, "build"), filename: NODE_ENV === 'development' ? '[name].js' : '[name].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'), path.resolve(__dirname, 'src/img/user-certificates'), path.resolve(__dirname, 'src/img/gift-certificates'), path.resolve(__dirname, 'src/img/reviews')], loader: 'file-loader?name=[name].[ext]&outputPath=./img/' }, { test: /\.(png|jpg)$/, include: path.resolve(__dirname, 'src/img/user-certificates'), loader: 'file-loader?name=[name].[ext]&outputPath=./img/user-certificates/' }, { test: /\.(png|jpg)$/, include: path.resolve(__dirname, 'src/img/gift-certificates'), loader: 'file-loader?name=[name].[ext]&outputPath=./img/gift-certificates/' }, { test: /\.(png|jpg)$/, include: path.resolve(__dirname, 'src/img/reviews'), loader: 'file-loader?name=[name].[ext]&outputPath=./img/reviews/' }, { 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 } }) ); }