这个vue项目还要怎么优化啊?

img


我的vue.config.js文件:

const { defineConfig } = require('@vue/cli-service')
const TerserPlugin = require('terser-webpack-plugin');
const NodePolyfillPlugin = require("node-polyfill-webpack-plugin")
const CompressionWebpackPlugin = require('compression-webpack-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

module.exports = defineConfig({
  productionSourceMap: false,
  transpileDependencies: true,
  lintOnSave: false,
  devServer: {
    // open: true, 自动打开浏览器页面是http://0.0.0.0:8080/  错误
    host: '0.0.0.0', // 为了同局域网的团队可访问你的实时项目
    proxy: {
      '/api': {
        target: process.env.VUE_APP_BASE_URL,
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''// 本地转发到target地址,实现跨域处理
        }
      }
    },
  },
  configureWebpack: {
    // devtool: "source-map",
    resolve: {
      fallback: {
        crypto: false,
        fs: false
      }
    },
    plugins: [
      new NodePolyfillPlugin(),
      new BundleAnalyzerPlugin(),
      new CompressionWebpackPlugin(),
    ],
    optimization: {
      runtimeChunk: true,
      splitChunks: {
        chunks: 'all',
        minSize: 1024,// 默认超过1k就抽离
        enforceSizeThreshold: 10240,
        cacheGroups: {
          //第三方库抽离
          vendor: {
            test: /node_modules/,
            name(module) {
              const pkg = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/);
              if (!pkg) {
                return;
              }
              return `npm.${pkg[1].replace('@', '')}`;
            },
          },
          //公用模块抽离
          common: {
            test: /src.*.js/gim,
            name: "common",
          },
          // 页面文件抽离
          pages: {
            test: /[\\/]src[\\/]pages[\\/]/,
            name: "pages",
          },
          //样式抽离
          styles: {
            name: "styles",
            test: /\.(sa|sc|c)ss$/,
          },
          //公用数据抽离
          json: {
            test: /src.*.json/gim,
            name: "json",
          },
        }
      },
      minimizer: [
        new TerserPlugin(),
      ]
    },
    externals: {
      'print-js': 'printJS',
      './cptable': 'var cptable' // 为了解决xlsx-style插件的报错
    }
  },
  chainWebpack: config => {
    if (process.env.NODE_ENV !== 'development') {
      // https://www.jianshu.com/p/865813b7cbb6
      // config.plugins.delete('prefetch')
      // config.plugins.delete('preload');


    }
  }
})

使用动态导入:可以将一些较大的依赖项使用动态导入的方式引入,比如按需加载一些组件、页面、路由等。例如:

javascriptCopy Code

const MyComponent = () => import('@/components/MyComponent.vue')

使用 Tree Shaking:可以通过配置 sideEffects 属性来让 webpack 知道哪些文件是不会产生副作用的,从而可以更好地进行 Tree Shaking。例如:

javascriptCopy Code

// package.json { "name": "my-app", "version": "0.1.0", "sideEffects": [ ".css", ".scss" ] }

使用代码分割:可以使用 import() 函数来实现动态导入和代码分割。例如:

javascriptCopy Code

const handleClick = async () => { const module = await import('@/utils/myModule.js') module.default() }

优化图像和资源:可以使用压缩图片工具来减小图像的大小,并且可以将一些较大的资源放到 CDN 上以加速加载速度。

使用缓存:可以在服务器端设置 HTTP 缓存标头,并使用 CDN 缓存静态资源。例如:

javascriptCopy Code

// server.js app.get('/static/*', (req, res) => { const filename = req.params[0] const filePath = path.resolve(__dirname, 'public', filename) res.setHeader('Cache-Control', 'public, max-age=31536000, immutable') res.sendFile(filePath) })

使用懒加载:可以使用 Vue 的 async component 来实现懒加载。例如:

javascriptCopy Code

const MyComponent = () => ({ component: import('@/components/MyComponent.vue'), loading: LoadingComponent, error: ErrorComponent, delay: 200, timeout: 3000 })

使用 CDN:可以将一些较大的静态资源放到 CDN 上以加速加载速度。例如:

htmlCopy Code

使用浏览器缓存:可以在服务器端设置 HTTP 缓存标头,并使用浏览器缓存静态资源。例如:

javascriptCopy Code

// server.js app.get('/static/*', (req, res) => { const filename = req.params[0] const filePath = path.resolve(__dirname, 'public', filename) res.setHeader('Cache-Control', 'public, max-age=31536000, immutable') res.sendFile(filePath) })

使用服务器端渲染(SSR):可以使用框架自带的 SSR 支持或者使用第三方库来实现 SSR。例如:

javascriptCopy Code

// Vue SSR const { createApp } = require('./app') const renderer = require('vue-server-renderer').createRenderer({ template: fs.readFileSync('./index.template.html', 'utf-8') }) app.get('*', (req, res) => { const context = { url: req.url } const app = createApp(context) renderer.renderToString(app, (err, html) => { if (err) { console.error(err) res.status(500).end('Internal Server Error') return } res.end(html) }) })

使用性能分析工具:可以使用 Lighthouse、GTmetrix 和 WebPageTest 等工具来识别性能瓶颈和改进方向。根据分析结果,采取相应的优化措施。

https://blog.csdn.net/Study123wf/article/details/126223156?spm=1001.2014.3001.5502