webpack.config.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. const path = require('path')
  2. var webpack = require('webpack')
  3. var HtmlWebpackPlugin = require('html-webpack-plugin')
  4. var VueLoaderPlugin = require('vue-loader/lib/plugin')
  5. var url = require('url')
  6. var publicPath = ''
  7. module.exports = (options = {}) => ({
  8. entry: {
  9. vendor: './src/vendor',
  10. index: './src/main.js'
  11. },
  12. output: {
  13. path: path.resolve(__dirname, 'dist'),
  14. filename: options.dev ? '[name].js' : '[name].js?[chunkhash]',
  15. chunkFilename: '[id].js?[chunkhash]',
  16. publicPath: options.dev ? '/assets/' : publicPath
  17. },
  18. resolve: {
  19. extensions: ['.js', '.vue', '.json'],
  20. alias: {
  21. 'vue$': 'vue/dist/vue.esm.js',
  22. '@': path.resolve(__dirname, 'src'),
  23. }
  24. },
  25. module: {
  26. rules: [{
  27. test: /\.vue$/,
  28. loader: 'vue-loader'
  29. }, {
  30. test: /\.js$/,
  31. use: ['babel-loader'],
  32. exclude: /node_modules/
  33. }, {
  34. test: /\.html$/,
  35. use: [{
  36. loader: 'html-loader',
  37. options: {
  38. root: path.resolve(__dirname, 'src'),
  39. attrs: ['img:src', 'link:href']
  40. }
  41. }]
  42. }, {
  43. test: /\.less$/,
  44. loader: 'style-loader!css-loader!postcss-loader!less-loader'
  45. }, {
  46. test: /\.css$/,
  47. use: ['style-loader', 'css-loader', 'postcss-loader']
  48. }, {
  49. test: /favicon\.png$/,
  50. use: [{
  51. loader: 'file-loader',
  52. options: {
  53. name: '[name].[ext]?[hash]'
  54. }
  55. }]
  56. }, {
  57. test: /\.(png|jpg|jpeg|gif|eot|ttf|woff|woff2|svg|svgz)(\?.+)?$/,
  58. exclude: /favicon\.png$/,
  59. use: [{
  60. loader: 'url-loader',
  61. options: {
  62. limit: 10000
  63. }
  64. }]
  65. }]
  66. },
  67. plugins: [
  68. new webpack.optimize.CommonsChunkPlugin({
  69. names: ['vendor', 'manifest']
  70. }),
  71. new HtmlWebpackPlugin({
  72. favicon: 'src/assets/favicon.ico',
  73. template: 'src/index.html'
  74. }),
  75. new webpack.NormalModuleReplacementPlugin(/element-ui[\/\\]lib[\/\\]locale[\/\\]lang[\/\\]zh-CN/, 'element-ui/lib/locale/lang/en'),
  76. new webpack.DefinePlugin({
  77. 'process.env': {
  78. NODE_ENV: '"production"'
  79. }
  80. }),
  81. new webpack.optimize.UglifyJsPlugin({
  82. compress: {
  83. warnings: false
  84. }
  85. }),
  86. new VueLoaderPlugin()
  87. ],
  88. devServer: {
  89. host: '127.0.0.1',
  90. port: 8010,
  91. proxy: {
  92. '/api/': {
  93. target: 'http://127.0.0.1:8080',
  94. changeOrigin: true,
  95. pathRewrite: {
  96. '^/api': ''
  97. }
  98. }
  99. },
  100. historyApiFallback: {
  101. index: url.parse(options.dev ? '/assets/' : publicPath).pathname
  102. }
  103. }//,
  104. //devtool: options.dev ? '#eval-source-map' : '#source-map'
  105. })