| 'use strict' |
| const utils = require('./utils') |
| const webpack = require('webpack') |
| const config = require('../config') |
| const merge = require('webpack-merge') |
| const path = require('path') |
| const baseWebpackConfig = require('./webpack.base.conf') |
| const CopyWebpackPlugin = require('copy-webpack-plugin') |
| const HtmlWebpackPlugin = require('html-webpack-plugin') |
| const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') |
| const portfinder = require('portfinder') |
| |
| const HOST = process.env.HOST |
| const PORT = process.env.PORT && Number(process.env.PORT) |
| |
| const devWebpackConfig = merge(baseWebpackConfig, { |
| module: { |
| rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) |
| }, |
| // cheap-module-eval-source-map is faster for development |
| devtool: config.dev.devtool, |
| |
| // these devServer options should be customized in /config/index.js |
| devServer: { |
| clientLogLevel: 'warning', |
| historyApiFallback: { |
| rewrites: [ |
| { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, |
| ], |
| }, |
| hot: true, |
| contentBase: false, // since we use CopyWebpackPlugin. |
| compress: true, |
| host: HOST || config.dev.host, |
| port: PORT || config.dev.port, |
| open: config.dev.autoOpenBrowser, |
| overlay: config.dev.errorOverlay |
| ? { warnings: false, errors: true } |
| : false, |
| publicPath: config.dev.assetsPublicPath, |
| proxy: config.dev.proxyTable, |
| quiet: true, // necessary for FriendlyErrorsPlugin |
| watchOptions: { |
| poll: config.dev.poll, |
| } |
| }, |
| plugins: [ |
| new webpack.DefinePlugin({ |
| 'process.env': require('../config/dev.env') |
| }), |
| new webpack.HotModuleReplacementPlugin(), |
| new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. |
| new webpack.NoEmitOnErrorsPlugin(), |
| // https://github.com/ampedandwired/html-webpack-plugin |
| new HtmlWebpackPlugin({ |
| filename: 'index.html', |
| template: 'index.html', |
| inject: true |
| }), |
| // copy custom static assets |
| new CopyWebpackPlugin([ |
| { |
| from: path.resolve(__dirname, '../static'), |
| to: config.dev.assetsSubDirectory, |
| ignore: ['.*'] |
| } |
| ]) |
| ] |
| }) |
| |
| module.exports = new Promise((resolve, reject) => { |
| portfinder.basePort = process.env.PORT || config.dev.port |
| portfinder.getPort((err, port) => { |
| if (err) { |
| reject(err) |
| } else { |
| // publish the new Port, necessary for e2e tests |
| process.env.PORT = port |
| // add port to devServer config |
| devWebpackConfig.devServer.port = port |
| |
| // Add FriendlyErrorsPlugin |
| devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ |
| compilationSuccessInfo: { |
| messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], |
| }, |
| onErrors: config.dev.notifyOnErrors |
| ? utils.createNotifierCallback() |
| : undefined |
| })) |
| |
| resolve(devWebpackConfig) |
| } |
| }) |
| }) |