vue.config.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. const { resolve } = require('path')
  2. const path = require('path')
  3. const WebpackBar = require('webpackbar')
  4. // const dayjs = require('dayjs')
  5. // const time = dayjs().format('YYYY-M-D HH:mm:ss')
  6. const merge = require('webpack-merge')
  7. const tsImportPluginFactory = require('ts-import-plugin')
  8. const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
  9. const productionGzipExtensions = ['js', 'css', 'svg']
  10. // process.env.VUE_APP_UPDATE_TIME = time
  11. const isProduction = process.env.NODE_ENV === 'production'
  12. const cdn = {
  13. css: ['https://cdn.jsdelivr.net/npm/vant@3/lib/index.css'],
  14. js: ['https://unpkg.com/vue@3.2.31/dist/vue.global.js',
  15. 'https://unpkg.com/vue-router@4.0.14/dist/vue-router.global.js',
  16. 'https://unpkg.com/vuex@4.0.2/dist/vuex.global.js',
  17. 'https://cdn.jsdelivr.net/npm/vant@3/lib/vant.min.js',
  18. 'https://cdn.jsdelivr.net/npm/echarts@5.3.2/dist/echarts.min.js'
  19. ]
  20. }
  21. const {
  22. publicPath,
  23. assetsDir,
  24. parallel,
  25. outputDir,
  26. lintOnSave,
  27. transpileDependencies,
  28. title,
  29. devPort,
  30. } = require('./src/config/default/vue.custom.config')
  31. const CompressionPlugin = require('compression-webpack-plugin')
  32. module.exports = {
  33. publicPath,
  34. assetsDir,
  35. parallel,
  36. outputDir,
  37. lintOnSave,
  38. transpileDependencies,
  39. // css: {
  40. // loaderOptions: {
  41. // postcss: {
  42. // plugins: [
  43. // require('postcss-px2rem-exclude')({
  44. // 'remUnit':98, //设计稿是750,那么这里的设置就是填750/10=75
  45. // 'propList': ['*', '!border','!border-left','!border-right'],
  46. // 'exclude': /node_modules|folder_name/i // 解决UI库px转rem问题 配置忽略node包
  47. // })
  48. // ]
  49. // }
  50. // },
  51. // },
  52. css: {
  53. loaderOptions: {
  54. postcss: {
  55. plugins: [
  56. require('postcss-pxtorem')({ // 把px单位换算成rem单位
  57. rootValue: 98, // vant官方使用的是37.5
  58. minPixelValue: 4,
  59. unitPrecision: 3,
  60. // selectorBlackList: ['vant', 'mu'], // 忽略转换正则匹配项
  61. propList: ['*']
  62. })
  63. ]
  64. }
  65. }
  66. },
  67. devServer: {
  68. hot: true,
  69. port: devPort,
  70. open: true,
  71. noInfo: false,
  72. overlay: {
  73. warnings: true,
  74. errors: true,
  75. },
  76. proxy: {
  77. '/sgipad/duoduo-service/': {
  78. target: 'https://duoduoenv.sagacloud.cn',
  79. // target: 'http://192.168.0.47:52015',
  80. changeOrigin: true,
  81. pathRewrite: {
  82. '^/sgipad/duoduo-service': '/duoduo-service'
  83. }
  84. },
  85. "/sgipad/pad_mtime": {
  86. target: 'http://39.106.8.246:9091/',
  87. changeOrigin: true,
  88. pathRewrite: {
  89. '^/sgipad/pad_mtime': '/pad_mtime'
  90. }
  91. },
  92. '/sgipad/server/': {
  93. // target: 'https://duoduoenv.sagacloud.cn',
  94. target: 'http://sso.sagacloud.cn',
  95. changeOrigin: true,
  96. pathRewrite: {
  97. '^/sgipad/server': '/server'
  98. }
  99. },
  100. '/sgipad/mngserver/': {
  101. // target: 'https://duoduoenv.sagacloud.cn',
  102. target: 'http://mng.sagacloud.cn',
  103. changeOrigin: true,
  104. pathRewrite: {
  105. '^/sgipad/mngserver': '/server'
  106. }
  107. },
  108. '/sgipad/test/': {
  109. // target: 'https://duoduoenv.sagacloud.cn',
  110. target: 'http://192.168.0.13:52009',
  111. changeOrigin: true,
  112. pathRewrite: {
  113. '^/sgipad/test': ''
  114. }
  115. },
  116. '/sgipad/test1/': {
  117. // target: 'https://duoduoenv.sagacloud.cn',
  118. target: 'http://192.168.0.65:52009',
  119. changeOrigin: true,
  120. pathRewrite: {
  121. '^/sgipad/test1': ''
  122. }
  123. },
  124. // '/api': {
  125. // target: 'http://api.sagacloud.cn',
  126. // changeOrigin: true,
  127. // pathRewrite: {
  128. // '^/api': ''
  129. // }
  130. // },
  131. // '/duoduo-service/': {
  132. // target: 'https://duoduoenv.sagacloud.cn',
  133. // changeOrigin: true,
  134. // pathRewrite: {
  135. // '^/duoduo-service': '/duoduo-service'
  136. // }
  137. // },
  138. // '/server/': {
  139. // target: 'https://duoduoenv.sagacloud.cn',
  140. // changeOrigin: true,
  141. // pathRewrite: {
  142. // '^/server': '/server'
  143. // }
  144. // },
  145. // '/object/': {
  146. // target: 'http://192.168.0.14:52010',
  147. // changeOrigin: true,
  148. // pathRewrite: {
  149. // '^/object': '/object'
  150. // }
  151. // },
  152. // '/mapServer/': {
  153. // target: 'http://192.168.0.14:52015',
  154. // changeOrigin: true,
  155. // pathRewrite: {
  156. // '^/mapServer': ''
  157. // }
  158. // }
  159. }
  160. },
  161. pluginOptions: {
  162. 'style-resources-loader': {
  163. preProcessor: 'scss',
  164. patterns: [
  165. path.resolve(__dirname, 'src/styles/_variables.scss'),
  166. path.resolve(__dirname, 'src/styles/_mixins.scss'),
  167. ]
  168. }
  169. },
  170. configureWebpack() {
  171. return {
  172. resolve: {
  173. alias: {
  174. '@': resolve('src'),
  175. '*': resolve(''),
  176. 'Assets': resolve('src/assets')
  177. }
  178. },
  179. module: {
  180. rules: [
  181. {
  182. test: /\.(json5?|ya?ml)$/, // target json, json5, yaml and yml files
  183. loader: '@intlify/vue-i18n-loader',
  184. include: [ // Use `Rule.include` to specify the files of locale messages to be pre-compiled
  185. path.resolve(__dirname, 'src/lang')
  186. ]
  187. },
  188. ],
  189. },
  190. plugins: isProduction ? [
  191. // new UglifyJsPlugin({
  192. // uglifyOptions: {
  193. // compress: {
  194. // drop_debugger: true,
  195. // drop_console: true, //生产环境自动删除console
  196. // },
  197. // warnings: false,
  198. // },
  199. // sourceMap: false,
  200. // parallel: true //使用多进程并行运行来提高构建速度。默认并发运行数:os.cpus().length - 1。
  201. // }),
  202. // 配置压缩
  203. new CompressionPlugin({
  204. // test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
  205. threshold: 1024 * 10, // 30K
  206. minRatio: 0.8,
  207. algorithm: 'gzip', // 使用gzip压缩
  208. test: /\.js$|\.css$/, // 匹配文件名
  209. filename: '[path].gz[query]', // 压缩后的文件名(保持原文件名,后缀加.gz)
  210. deleteOriginalAssets: false
  211. }),
  212. new WebpackBar({
  213. name: title
  214. })
  215. ] : [new WebpackBar({
  216. name: title
  217. })],
  218. // externals: isProduction ? {
  219. // 'vue': 'Vue',
  220. // 'vuex': 'Vuex',
  221. // 'vant' : 'vant',
  222. // 'vue-router': 'VueRouter',
  223. // 'echarts': 'echarts'
  224. // } : {}
  225. }
  226. },
  227. chainWebpack: config => {
  228. config.optimization.minimizer('terser').tap((args) => {
  229. args[0].parallel = 4
  230. args[0].terserOptions.compress.warnings = true
  231. args[0].terserOptions.compress.drop_debugger = true
  232. args[0].terserOptions.compress.drop_console = true
  233. return args
  234. })
  235. config.module
  236. .rule('ts')
  237. .use('ts-loader')
  238. .tap(options => {
  239. options = merge(options, {
  240. transpileOnly: true,
  241. getCustomTransformers: () => ({
  242. before: [
  243. tsImportPluginFactory({
  244. libraryName: 'vant',
  245. libraryDirectory: 'es',
  246. style: true
  247. })
  248. ]
  249. }),
  250. compilerOptions: {
  251. module: 'es2015'
  252. }
  253. })
  254. return options
  255. })
  256. }
  257. }