vue2项目webpack4和webpack5配置

vue

最近开发的项目遇到一个问题,项目是基于webpack4开发的,客户使用的是webpack5导致项目无法正常运行,需要修改一下让其在webpack5下可以正常运行,这里记录一下配置,方便后续回查

项目依赖webpack4

{
  "name": "zhihuiludeng",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "dev": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "build-qiniu": "vue-cli-service build && node qiniu.js"
  },
  "dependencies": {
    "@glidejs/glide": "^3.6.0",
    "@meruem117/vue-seamless-scroll": "^0.0.19",
    "@vue/composition-api": "^1.7.2",
    "axios": "^1.7.9",
    "core-js": "3.6.5",
    "dayjs": "^1.11.2",
    "echarts": "^5.4.1",
    "echarts-gl": "2.0.8",
    "echarts-liquidfill": "^3.1.0",
    "element-ui": "^2.15.14",
    "fs": "0.0.1-security",
    "gsap": "^3.12.2",
    "highcharts": "^10.1.0",
    "particles.js": "^2.0.0",
    "postcss-pxtorem": "^5.1.1",
    "qiniu": "^7.8.0",
    "qs": "^6.10.1",
    "sass": "^1.67.0",
    "three": "^0.173.0",
    "vue": "2.6.12",
    "vue-carousel-3d": "^1.0.1",
    "vue-router": "^3.0.1",
    "vue-seamless-scroll": "^1.1.23",
    "wow.js": "^1.2.2"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-eslint": "~4.5.0",
    "@vue/cli-plugin-router": "~4.5.0",
    "@vue/cli-plugin-vuex": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "@vue/eslint-config-standard": "^5.1.2",
    "babel-eslint": "^10.1.0",
    "crypto-js": "^4.1.1",
    "element-theme-chalk": "^2.15.8",
    "eslint": "^6.7.2",
    "eslint-plugin-import": "^2.20.2",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^4.2.1",
    "eslint-plugin-standard": "^4.0.0",
    "eslint-plugin-vue": "^6.2.2",
    "sass-loader": "^8.0.2",
    "vue-template-compiler": "2.6.12",
    "wowjs": "^1.1.3"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "@vue/standard"
    ],
    "parserOptions": {
      "parser": "babel-eslint"
    },
    "rules": {}
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}

项目依赖webpack5

{
  "name": "zhihuiludeng",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "dev": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "build-qiniu": "vue-cli-service build && node qiniu.js"
  },
  "dependencies": {
    "@glidejs/glide": "^3.6.0",
    "@meruem117/vue-seamless-scroll": "^0.0.19",
    "@vue/composition-api": "^1.7.2",
    "axios": "^1.7.9",
    "core-js": "^3.8.3",
    "dayjs": "^1.11.2",
    "echarts": "^5.4.1",
    "echarts-gl": "2.0.8",
    "echarts-liquidfill": "^3.1.0",
    "element-ui": "^2.15.14",
    "gsap": "^3.12.2",
    "highcharts": "^10.1.0",
    "particles.js": "^2.0.0",
    "postcss-pxtorem": "^5.1.1",
    "qiniu": "^7.8.0",
    "qs": "^6.10.1",
    "sass": "^1.67.0",
    "three": "^0.173.0",
    "vue": "2.6.14",
    "vue-carousel-3d": "^1.0.1",
    "vue-router": "^3.6.5",
    "vue-seamless-scroll": "^1.1.23",
    "wow.js": "^1.2.2"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~5.0.0",
    "@vue/cli-plugin-eslint": "~5.0.0",
    "@vue/cli-plugin-router": "~5.0.0",
    "@vue/cli-plugin-vuex": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "@vue/eslint-config-standard": "^6.1.0",
    "babel-eslint": "^10.1.0",
    "buffer": "^6.0.3",
    "crypto-browserify": "^3.12.0",
    "crypto-js": "^4.1.1",
    "element-theme-chalk": "^2.15.8",
    "eslint": "^7.32.0",
    "eslint-plugin-import": "^2.25.4",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^5.2.0",
    "eslint-plugin-standard": "^5.0.0",
    "eslint-plugin-vue": "^8.7.1",
    "path-browserify": "^1.0.1",
    "process": "^0.11.10",
    "querystring-es3": "^0.2.1",
    "sass-loader": "^12.6.0",
    "stream-browserify": "^3.0.0",
    "url": "^0.11.0",
    "util": "^0.12.5",
    "vue-template-compiler": "2.6.14",
    "wowjs": "^1.1.3"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "@vue/standard"
    ],
    "parserOptions": {
      "parser": "babel-eslint"
    },
    "rules": {}
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}

vue.config.js webpack4配置

'use strict'
const webpack = require('webpack')
var qiniuPrefix = require("./qiniu-upload-prefiex");

module.exports = {
  // 七牛cdn配置
  publicPath: process.env.NODE_ENV === 'production' ? (qiniuPrefix.accessKey ? qiniuPrefix.prefixhost + qiniuPrefix.prefix : '') : '',
  // publicPath: '',
  productionSourceMap: false,
  lintOnSave: false,
  css: {
    loaderOptions: {
      sass: {
        implementation: require('sass'), // 使用 dart-sass
        sassOptions: {
          // 不再需要 fiber 选项
        }
      }
    }
  },
  configureWebpack: {
    plugins: [
      new webpack.ProvidePlugin({
        $: 'jquery',
        jQuery: 'jquery',
        'window.jQuery': 'jquery',
        'window.$': 'jquery',
        Popper: ['popper.js', 'default']
      })
    ]
  }
}

vue.config.js webpack5配置

'use strict'
const webpack = require('webpack')
const { defineConfig } = require('@vue/cli-service')
var qiniuPrefix = require("./qiniu-upload-prefiex");

module.exports = defineConfig({
  // 七牛cdn配置
  publicPath: process.env.NODE_ENV === 'production' ? (qiniuPrefix.accessKey ? qiniuPrefix.prefixhost + qiniuPrefix.prefix : '') : '',
  productionSourceMap: false,
  lintOnSave: false,

  css: {
    loaderOptions: {
      sass: {
        implementation: require('sass'),
        sassOptions: {
          outputStyle: 'expanded'
        }
      }
    }
  },

  // 修复 WebSocket 错误的关键配置
  devServer: {
    port: 8081, // 更换端口避免冲突
    host: '0.0.0.0',
    hot: true,
    client: {
      webSocketTransport: 'ws',
      overlay: {
        warnings: false,
        errors: true
      }
    },
    webSocketServer: {
      type: 'ws',
      options: {
        // 添加错误处理
        verifyClient: (info) => {
          return true;
        }
      }
    }
  },

  configureWebpack: {
    resolve: {
      fallback: {
        "fs": false,
        "path": require.resolve("path-browserify"),
        "crypto": require.resolve("crypto-browserify"),
        "stream": require.resolve("stream-browserify"),
        "buffer": require.resolve("buffer")
      }
    },
    plugins: [
      new webpack.ProvidePlugin({
        $: 'jquery',
        jQuery: 'jquery',
        'window.jQuery': 'jquery',
        'window.$': 'jquery',
        Popper: ['@popperjs/core', 'default'],
        Buffer: ['buffer', 'Buffer'],
        process: 'process/browser'
      })
    ]
  },

  chainWebpack: config => {
    // 优化构建性能
    config.optimization.splitChunks({
      chunks: 'all',
      cacheGroups: {
        vendor: {
          test: /[\\/]node_modules[\\/]/,
          name: 'vendors',
          chunks: 'all'
        }
      }
    })

    config.module
      .rule('mjs')
      .test(/\.mjs$/)
      .include.add(/node_modules/)
      .end()
      .type('javascript/auto')
  }
})

喜欢