vue.config.js 8.0 KB

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