我的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