UNPKG

vuex-cli-webpack

Version:
248 lines (207 loc) 8.14 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _deleteProperty = require('babel-runtime/core-js/reflect/delete-property'); var _deleteProperty2 = _interopRequireDefault(_deleteProperty); var _toArray2 = require('babel-runtime/helpers/toArray'); var _toArray3 = _interopRequireDefault(_toArray2); var _webpack = require('webpack'); var _webpack2 = _interopRequireDefault(_webpack); var _cssnano = require('cssnano'); var _cssnano2 = _interopRequireDefault(_cssnano); var _htmlWebpackPlugin = require('html-webpack-plugin'); var _htmlWebpackPlugin2 = _interopRequireDefault(_htmlWebpackPlugin); var _extractTextWebpackPlugin = require('extract-text-webpack-plugin'); var _extractTextWebpackPlugin2 = _interopRequireDefault(_extractTextWebpackPlugin); var _merge = require('../config/merge'); var _merge2 = _interopRequireDefault(_merge); var _debug2 = require('debug'); var _debug3 = _interopRequireDefault(_debug2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var debug = (0, _debug3.default)('app:webpack:config'); var paths = _merge2.default.utils_paths; var _config$globals = _merge2.default.globals, __DEV__ = _config$globals.__DEV__, __PROD__ = _config$globals.__PROD__, __TEST__ = _config$globals.__TEST__; debug('Create configuration.'); var webpackConfig = { name: 'client', target: 'web', devtool: _merge2.default.compiler_devtool, resolve: { root: paths.client(), extensions: ['', '.css', '.js', '.json', '.vue'], alias: { "store": paths.client('store'), "components": paths.client('components') }, modulesDirectories: ['node_modules'] }, module: {} }; // ------------------------------------ // Entry Points // ------------------------------------ var APP_ENTRY_PATHS = ['babel-polyfill', paths.client('main.js')]; webpackConfig.entry = { app: __DEV__ ? APP_ENTRY_PATHS.concat('webpack-hot-middleware/client?path=' + _merge2.default.compiler_public_path + '__webpack_hmr') : APP_ENTRY_PATHS, vendor: _merge2.default.compiler_vendor }; // ------------------------------------ // Bundle Output // ------------------------------------ webpackConfig.output = { filename: '[name].[' + _merge2.default.compiler_hash_type + '].js', path: paths.dist(), publicPath: _merge2.default.compiler_public_path }; // ------------------------------------ // Plugins // ------------------------------------ webpackConfig.plugins = [new _webpack2.default.DefinePlugin(_merge2.default.globals), new _htmlWebpackPlugin2.default({ template: paths.client('index.html'), hash: false, favicon: paths.client('static/favicon.ico'), filename: 'index.html', inject: 'body', minify: { collapseWhitespace: true } })]; if (__DEV__) { debug('Enable plugins for live development (HMR, NoErrors).'); webpackConfig.plugins.push(new _webpack2.default.HotModuleReplacementPlugin(), new _webpack2.default.NoErrorsPlugin()); } else if (__PROD__) { debug('Enable plugins for production (OccurenceOrder, Dedupe & UglifyJS).'); webpackConfig.plugins.push(new _webpack2.default.optimize.OccurrenceOrderPlugin(), new _webpack2.default.optimize.DedupePlugin(), new _webpack2.default.optimize.UglifyJsPlugin({ compress: { unused: true, dead_code: true, warnings: false } })); } // Don't split bundles during testing, since we only want import one bundle if (!__TEST__) { webpackConfig.plugins.push(new _webpack2.default.optimize.CommonsChunkPlugin({ names: ['vendor'] })); } // ------------------------------------ // Pre-Loaders // ------------------------------------ /* [ NOTE ] We no longer use eslint-loader due to it severely impacting build times for larger projects. `npm run lint` still exists to aid in deploy processes (such as with CI), and it's recommended that you use a linting plugin for your IDE in place of this loader. If you do wish to continue using the loader, you can uncomment the code below and run `npm i --save-dev eslint-loader`. This code will be removed in a future release. */ webpackConfig.module.preLoaders = [{ test: /\.(js|vue)$/, loader: 'eslint-loader', exclude: /node_modules/ }]; webpackConfig.eslint = { configFile: paths.base('.eslintrc'), emitWarning: __DEV__ }; // ------------------------------------ // Loaders // ------------------------------------ // JavaScript / JSON webpackConfig.module.loaders = [{ test: /\.(js)$/, exclude: /node_modules/, loader: 'babel' }, { test: /\.vue$/, loader: 'vue' }, { test: /\.json$/, loader: 'json' }, { test: /\.html$/, loader: 'vue-html' }, /* eslint-disable */ { test: /\.woff(\?.*)?$/, loader: 'url?prefix=fonts/&name=[path][name].[ext]&limit=10000&mimetype=application/font-woff' }, { test: /\.woff2(\?.*)?$/, loader: 'url?prefix=fonts/&name=[path][name].[ext]&limit=10000&mimetype=application/font-woff2' }, { test: /\.otf(\?.*)?$/, loader: 'file?prefix=fonts/&name=[path][name].[ext]&limit=10000&mimetype=font/opentype' }, { test: /\.ttf(\?.*)?$/, loader: 'url?prefix=fonts/&name=[path][name].[ext]&limit=10000&mimetype=application/octet-stream' }, { test: /\.eot(\?.*)?$/, loader: 'file?prefix=fonts/&name=[path][name].[ext]' }, { test: /\.svg(\?.*)?$/, loader: 'url?prefix=fonts/&name=[path][name].[ext]&limit=10000&mimetype=image/svg+xml' }, { test: /\.(png|jpg)$/, loader: 'url?limit=8192' } /* eslint-enable */ ]; // ------------------------------------ // Style Loaders // ------------------------------------ // We use cssnano with the postcss loader, so we tell // css-loader not to duplicate minimization. var BASE_CSS_LOADER = function (loaders) { if (!__PROD__) { return loaders.join('!'); } var _loaders = (0, _toArray3.default)(loaders), first = _loaders[0], rest = _loaders.slice(1); return _extractTextWebpackPlugin2.default.extract(first, rest.join('!')); }(['vue-style-loader', 'css?sourceMap&-minimize']); // Loaders for files that should not be treated as CSS modules. webpackConfig.module.loaders.push({ test: /\.css$/, exclude: null, loaders: ['style', BASE_CSS_LOADER, 'postcss'] }); // ------------------------------------ // Style Configuration // ------------------------------------ webpackConfig.vue = { postcss: function postcss(pack) { return [require('postcss-import')({ path: _merge.utils_paths.client('styles'), // use webpack context addDependencyTo: pack }), require('postcss-url')({ basePath: paths.src('static') }), require('postcss-cssnext')({ // see: https://github.com/ai/browserslist#queries browsers: 'Android >= 4, iOS >= 7', features: { customProperties: { variables: require(_merge.utils_paths.client('styles/variables')) } } }), require('postcss-flexible')({ remUnit: 75 }), require('postcss-browser-reporter')(), require('postcss-reporter')()]; }, autoprefixer: false }; // ------------------------------------ // Finalize Configuration // ------------------------------------ // when we don't know the public path (we know it only when HMR is enabled [in development]) we // need to use the extractTextPlugin to fix this issue: // http://stackoverflow.com/questions/34133808/webpack-ots-parsing-error-loading-fonts/34133809#34133809 if (!__DEV__) { debug('Apply ExtractTextPlugin to CSS loaders.'); webpackConfig.module.loaders.filter(function (loader) { return loader.loaders && loader.loaders.find(function (name) { return (/css/.test(name.split('?')[0]) ); }); }).forEach(function (loader) { var _loader$loaders = (0, _toArray3.default)(loader.loaders), first = _loader$loaders[0], rest = _loader$loaders.slice(1); loader.loader = _extractTextWebpackPlugin2.default.extract(first, rest.join('!')); (0, _deleteProperty2.default)(loader, 'loaders'); }); webpackConfig.plugins.push(new _extractTextWebpackPlugin2.default('[name].[contenthash].css', { allChunks: true })); } // load config exports.default = webpackConfig; module.exports = exports['default'];