webpack.base.conf.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. 'use strict'
  2. const path = require('path')
  3. const utils = require('./utils')
  4. const config = require('../config')
  5. const vueLoaderConfig = require('./vue-loader.conf')
  6. function resolve(dir) {
  7. return path.join(__dirname, '..', dir)
  8. }
  9. /**
  10. * 数据请求
  11. */
  12. function httpEntry() {
  13. return resolve('src') + '/adapter/http/impl/' + process.env.env_config + '.js'
  14. }
  15. /**
  16. * 分享相关
  17. */
  18. function shareEntry() {
  19. return (
  20. resolve('src') + '/adapter/share/impl/' + process.env.env_config + '.js'
  21. )
  22. }
  23. /**
  24. * 各平台桥接适配
  25. */
  26. function bridgeEntry() {
  27. return resolve('src') + '/adapter/bridge/' + process.env.env_config + '.js'
  28. }
  29. /**
  30. * 定位和导航相关
  31. */
  32. function locationEntry() {
  33. return (
  34. resolve('src') + '/adapter/location/impl/' + process.env.env_config + '.js'
  35. )
  36. }
  37. /**
  38. * 图像操作
  39. */
  40. function imageEntry() {
  41. return resolve('src') + '/adapter/image/' + process.env.env_config + '.js'
  42. }
  43. /**
  44. * 支付操作
  45. */
  46. function payEntry() {
  47. return resolve('src') + '/adapter/pay/' + process.env.env_config + '.js'
  48. }
  49. const createLintingRule = () => ({
  50. test: /\.(js|vue)$/,
  51. loader: 'eslint-loader',
  52. enforce: 'pre',
  53. include: [resolve('src'), resolve('test')],
  54. options: {
  55. formatter: require('eslint-friendly-formatter'),
  56. emitWarning: !config.dev.showEslintErrorsInOverlay
  57. }
  58. })
  59. module.exports = {
  60. context: path.resolve(__dirname, '../'),
  61. entry: {
  62. app: './src/main.js'
  63. },
  64. output: {
  65. path: config.build.assetsRoot,
  66. filename: '[name].js',
  67. publicPath:
  68. process.env.NODE_ENV === 'production'
  69. ? config.build.assetsPublicPath
  70. : config.dev.assetsPublicPath
  71. },
  72. resolve: {
  73. extensions: ['.js', '.vue', '.json'],
  74. alias: {
  75. vue$: 'vue/dist/vue.esm.js',
  76. '@': resolve('src'),
  77. httpApi: httpEntry(),
  78. shareApi: shareEntry(),
  79. Bridge: bridgeEntry(),
  80. LocationApi: locationEntry(),
  81. imageApi: imageEntry(),
  82. payApi: payEntry()
  83. }
  84. },
  85. module: {
  86. rules: [
  87. ...(config.dev.useEslint ? [createLintingRule()] : []),
  88. {
  89. test: /\.vue$/,
  90. loader: 'vue-loader',
  91. options: vueLoaderConfig
  92. },
  93. {
  94. test: /\.js$/,
  95. loader: 'babel-loader',
  96. include: [
  97. resolve('src'),
  98. resolve('test'),
  99. resolve('node_modules/webpack-dev-server/client')
  100. ]
  101. },
  102. {
  103. test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
  104. loader: 'url-loader',
  105. options: {
  106. limit: 10000,
  107. name: utils.assetsPath('img/[name].[hash:7].[ext]')
  108. }
  109. },
  110. {
  111. test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
  112. loader: 'url-loader',
  113. options: {
  114. limit: 10000,
  115. name: utils.assetsPath('media/[name].[hash:7].[ext]')
  116. }
  117. },
  118. {
  119. test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
  120. loader: 'url-loader',
  121. options: {
  122. limit: 10000,
  123. name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
  124. }
  125. }
  126. ]
  127. },
  128. node: {
  129. // prevent webpack from injecting useless setImmediate polyfill because Vue
  130. // source contains it (although only uses it if it's native).
  131. setImmediate: false,
  132. // prevent webpack from injecting mocks to Node native modules
  133. // that does not make sense for the client
  134. dgram: 'empty',
  135. fs: 'empty',
  136. net: 'empty',
  137. tls: 'empty',
  138. child_process: 'empty'
  139. }
  140. }