webpack.dev.conf.js 2.65 KB
Newer Older
Pan's avatar
Pan committed
1 2 3 4 5 6 7 8 9 10
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
Pan's avatar
Pan committed
11

Pan's avatar
Pan committed
12 13
function resolve (dir) {
  return path.join(__dirname, '..', dir)
Pan's avatar
Pan committed
14 15
}

Pan's avatar
Pan committed
16 17
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
Pan's avatar
Pan committed
18

Pan's avatar
Pan committed
19
const devWebpackConfig = merge(baseWebpackConfig, {
Pan's avatar
Pan committed
20
  module: {
Pan's avatar
Pan committed
21
    rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
Pan's avatar
Pan committed
22 23
  },
  // cheap-module-eval-source-map is faster for development
Pan's avatar
Pan committed
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
  devtool: config.dev.devtool,

  // these devServer options should be customized in /config/index.js
  devServer: {
    clientLogLevel: 'warning',
    historyApiFallback: true,
    hot: true,
    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,
    }
  },
Pan's avatar
Pan committed
45 46
  plugins: [
    new webpack.DefinePlugin({
Pan's avatar
Pan committed
47
      'process.env': require('../config/dev.env')
Pan's avatar
Pan committed
48 49
    }),
    new webpack.HotModuleReplacementPlugin(),
Pan's avatar
Pan committed
50
    new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
Pan's avatar
Pan committed
51 52 53 54 55
    new webpack.NoEmitOnErrorsPlugin(),
    // https://github.com/ampedandwired/html-webpack-plugin
    new HtmlWebpackPlugin({
      filename: 'index.html',
      template: 'index.html',
Pan's avatar
Pan committed
56 57 58
      inject: true,
      favicon: resolve('favicon.ico'),
      title: 'vue-element-admin'
Pan's avatar
Pan committed
59 60 61
    }),
  ]
})
Pan's avatar
Pan committed
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87

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)
    }
  })
})