webpack.base.conf.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. 'use strict'
  2. const path = require('path')
  3. const utils = require('./utils')
  4. const config = require('../config')
  5. const {
  6. VueLoaderPlugin
  7. } = require('vue-loader')
  8. const vueLoaderConfig = require('./vue-loader.conf')
  9. // el-bigdata-table babel-loader 配置
  10. const fs = require('fs')
  11. function resolve(dir) {
  12. return path.join(__dirname, '..', dir)
  13. }
  14. const createLintingRule = () => ({
  15. test: /\.(js|vue)$/,
  16. loader: 'eslint-loader',
  17. enforce: 'pre',
  18. include: [resolve('src'), resolve('test')],
  19. options: {
  20. formatter: require('eslint-friendly-formatter'),
  21. emitWarning: !config.dev.showEslintErrorsInOverlay
  22. }
  23. })
  24. // el-bigdata-table babel-loader 配置
  25. let bigTableDirName = fs.readdirSync(resolve('node_modules')).filter(dirName => /el-bigdata-table/.test(dirName))
  26. const bigTableDirs = bigTableDirName.map(dir => resolve(`node_modules/${dir}/src`))
  27. module.exports = {
  28. context: path.resolve(__dirname, '../'),
  29. entry: {
  30. app: ["babel-polyfill", "./src/main.js"]
  31. },
  32. output: {
  33. path: config.build.assetsRoot,
  34. filename: '[name].js',
  35. publicPath:
  36. process.env.NODE_ENV === 'production'
  37. ? config.build.assetsPublicPath
  38. : config.dev.assetsPublicPath
  39. },
  40. resolve: {
  41. extensions: ['.js', '.vue', '.json'],
  42. alias: {
  43. '@': resolve('src')
  44. }
  45. },
  46. module: {
  47. rules: [
  48. ...(config.dev.useEslint ? [createLintingRule()] : []),
  49. {
  50. test: /\.vue$/,
  51. loader: 'vue-loader',
  52. options: vueLoaderConfig
  53. },
  54. {
  55. test: /\.js$/,
  56. loader: 'babel-loader',
  57. include: [
  58. resolve('src'),
  59. resolve('test'),
  60. resolve('node_modules/webpack-dev-server/client'),
  61. resolve('node_modules/element-ui/src'),
  62. resolve('node_modules/element-ui/packages'),
  63. ...bigTableDirs
  64. ]
  65. },
  66. {
  67. test: /\.svg$/,
  68. loader: 'svg-sprite-loader',
  69. include: [resolve('src/icons')],
  70. options: {
  71. symbolId: 'icon-[name]'
  72. }
  73. },
  74. {
  75. test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
  76. loader: 'url-loader',
  77. exclude: [resolve('src/icons')],
  78. options: {
  79. limit: 10000,
  80. name: utils.assetsPath('img/[name].[hash:7].[ext]')
  81. }
  82. },
  83. {
  84. test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
  85. loader: 'url-loader',
  86. options: {
  87. limit: 10000,
  88. name: utils.assetsPath('media/[name].[hash:7].[ext]')
  89. }
  90. },
  91. {
  92. test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
  93. loader: 'url-loader',
  94. options: {
  95. limit: 10000,
  96. name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
  97. }
  98. }
  99. ]
  100. },
  101. plugins: [new VueLoaderPlugin()],
  102. node: {
  103. // prevent webpack from injecting useless setImmediate polyfill because Vue
  104. // source contains it (although only uses it if it's native).
  105. setImmediate: false,
  106. // prevent webpack from injecting mocks to Node native modules
  107. // that does not make sense for the client
  108. dgram: 'empty',
  109. fs: 'empty',
  110. net: 'empty',
  111. tls: 'empty',
  112. child_process: 'empty'
  113. }
  114. }