健康同学微信公众号h5项目
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

vue.config.js 5.4KB

11 maanden geleden
11 maanden geleden
11 maanden geleden
11 maanden geleden
11 maanden geleden
11 maanden geleden
11 maanden geleden
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. const path = require('path');
  2. const defaultSettings = require('./src/config/index.js');
  3. const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
  4. const resolve = dir => path.join(__dirname, dir);
  5. // page title
  6. const name = defaultSettings.title || '';
  7. // 生产环境,测试和正式
  8. const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV);
  9. const { defineConfig } = require('@vue/cli-service');
  10. // externals
  11. // const externals = {
  12. // vue: 'Vue',
  13. // 'vue-router': 'VueRouter',
  14. // vuex: 'Vuex',
  15. // vant: 'vant',
  16. // axios: 'axios'
  17. // }
  18. // CDN外链,会插入到index.html中
  19. // const cdn = {
  20. // // 开发环境
  21. // dev: {
  22. // css: [],
  23. // js: []
  24. // },
  25. // // 生产环境
  26. // build: {
  27. // css: ['https://cdn.jsdelivr.net/npm/vant@2.4.7/lib/index.css'],
  28. // js: [
  29. // 'https://cdn.jsdelivr.net/npm/vue@2.6.11/dist/vue.min.js',
  30. // 'https://cdn.jsdelivr.net/npm/vue-router@3.1.5/dist/vue-router.min.js',
  31. // 'https://cdn.jsdelivr.net/npm/axios@0.19.2/dist/axios.min.js',
  32. // 'https://cdn.jsdelivr.net/npm/vuex@3.1.2/dist/vuex.min.js',
  33. // 'https://cdn.jsdelivr.net/npm/vant@2.4.7/lib/index.min.js'
  34. // ]
  35. // }
  36. // }
  37. module.exports = defineConfig({
  38. publicPath: './', // 署应用包时的基本 URL。 vue-router hash 模式使用
  39. // publicPath: '/app/', //署应用包时的基本 URL。 vue-router history模式使用
  40. outputDir: 'dist', // 生产环境构建文件的目录
  41. assetsDir: 'static', // outputDir的静态资源(js、css、img、fonts)目录
  42. lintOnSave: !IS_PROD,
  43. productionSourceMap: false, // 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
  44. devServer: {
  45. port: 9093, // 端口
  46. open: false, // 启动后打开浏览器
  47. client: {
  48. overlay: {
  49. // 当出现编译器错误或警告时,在浏览器中显示全屏覆盖层
  50. warnings: false,
  51. errors: true
  52. }
  53. }
  54. // proxy: {
  55. // //配置跨域
  56. // '/api': {
  57. // target: "https://test.xxx.com",
  58. // // ws:true,
  59. // changOrigin:true,
  60. // pathRewrite:{
  61. // '^/api':'/'
  62. // }
  63. // }
  64. // }
  65. },
  66. css: {
  67. extract: IS_PROD, // 是否将组件中的 CSS 提取至一个独立的 CSS 文件中 (而不是动态注入到 JavaScript 中的 inline 代码)。
  68. sourceMap: false,
  69. loaderOptions: {
  70. scss: {
  71. // 向全局sass样式传入共享的全局变量, $src可以配置图片cdn前缀
  72. // 详情: https://cli.vuejs.org/guide/css.html#passing-options-to-pre-processor-loaders
  73. additionalData: `
  74. @import "assets/css/mixin.scss";
  75. @import "assets/css/variables.scss";
  76. $cdn: "${defaultSettings.$cdn}";
  77. `
  78. }
  79. }
  80. },
  81. configureWebpack: config => {
  82. config.name = name;
  83. // 为生产环境修改配置...
  84. // if (IS_PROD) {
  85. // // externals
  86. // config.externals = externals
  87. // }
  88. },
  89. chainWebpack: config => {
  90. /* config.plugins.delete('preload');
  91. config.plugins.delete('prefetch'); */
  92. // 别名 alias
  93. config.resolve.alias
  94. .set('@', resolve('src'))
  95. .set('assets', resolve('src/assets'))
  96. .set('api', resolve('src/api'))
  97. .set('views', resolve('src/views'))
  98. .set('components', resolve('src/components'));
  99. /**
  100. * 添加CDN参数到htmlWebpackPlugin配置中
  101. */
  102. // config.plugin('html').tap(args => {
  103. // if (IS_PROD) {
  104. // args[0].cdn = cdn.build
  105. // } else {
  106. // args[0].cdn = cdn.dev
  107. // }
  108. // return args
  109. // })
  110. /**
  111. * 设置保留空格
  112. */
  113. config.module
  114. .rule('vue')
  115. .use('vue-loader')
  116. .loader('vue-loader')
  117. .tap(options => {
  118. options.compilerOptions.preserveWhitespace = true;
  119. return options;
  120. })
  121. .end();
  122. /**
  123. * 打包分析
  124. */
  125. if (IS_PROD) {
  126. config.plugin('webpack-report').use(BundleAnalyzerPlugin, [
  127. {
  128. analyzerMode: 'static'
  129. }
  130. ]);
  131. }
  132. config
  133. // https://webpack.js.org/configuration/devtool/#development
  134. .when(!IS_PROD, config => config.devtool('cheap-source-map'));
  135. config.when(IS_PROD, config => {
  136. config.optimization.splitChunks({
  137. chunks: 'all',
  138. cacheGroups: {
  139. // cacheGroups 下可以可以配置多个组,每个组根据test设置条件,符合test条件的模块
  140. commons: {
  141. name: 'chunk-commons',
  142. test: resolve('src/components'),
  143. minChunks: 3, // 被至少用三次以上打包分离
  144. priority: 5, // 优先级
  145. reuseExistingChunk: true // 表示是否使用已有的 chunk,如果为 true 则表示如果当前的 chunk 包含的模块已经被抽取出去了,那么将不会重新生成新的。
  146. },
  147. node_vendors: {
  148. name: 'chunk-libs',
  149. chunks: 'initial', // 只打包初始时依赖的第三方
  150. test: /[\\/]node_modules[\\/]/,
  151. priority: 10
  152. },
  153. vantUI: {
  154. name: 'chunk-vantUI', // 单独将 vantUI 拆包
  155. priority: 20, // 数字大权重到,满足多个 cacheGroups 的条件时候分到权重高的
  156. test: /[\\/]node_modules[\\/]_?vant(.*)/
  157. }
  158. }
  159. });
  160. config.optimization.runtimeChunk('single');
  161. });
  162. }
  163. });