原创 jack_po 2025-09-18 08:30 重庆
Webpack 的 externals 配置用于声明某些依赖应该从外部获取,而不是打包到最终的 bundle 中。这样可以减小打包体积,前提是这些依赖已经在运行环境中存在。
点击关注公众号,“技术干货” 及时达!
# NPMnpm install --save-dev webpack-bundle-analyzer
反正都是装,看着来。配一下:// vue.config.js 文件里。(没有就要新建一下)yarn add -D webpack-bundle-analyzer
打包执行打包命令并查看分析const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;module.exports = {plugins: [new BundleAnalyzerPlugin()]}
npm run build --report打包结束后,会在项目根目录下生成 dist 文件。自动跳到127.0.0.1:8888(没有跳的话,手动打开 dist 文件夹下的 report.html),这个网址就是打包分析报告。占得比较大的块,就是 Element UI 组件库和 echarts 库占的空间比相对较大。这就要考虑,第一,要按需,要啥再用啥,不要一股脑啥都装。按需安装,按需加载。第二,考虑单独引入这些组件库的cdn,这样速度也会咔咔提升。详细讲一下怎么搞cdn。按需大家都知道,要啥再引入啥,再装啥。比如element-ui,我要uninstall掉,然后呢,去引入 cdn,不要装库了,用 cdn。去package.json里面看element-ui装了啥版本,然后看完之后,就npm uninstall element-ui卸载掉。去 cdn 库里面去找https://www.staticfile.org/,(首先先说一下,要找免费的开放的那种,因为一般有的公司没有自家的 cdn,没有自家的桶,有的话,直接把 js 文件地址拖上去,然后得到一个地址,这样也安全,也方便,但没有的话另说)。然后去样式库: https://cdn.staticfile.org/element-ui/2.15.12/theme-chalk/index.min.css组件库:https://cdn.staticfile.org/element-ui/2.15.12/index.min.js
public/index.html入口文件中,去加入这个东西,像咱以前写原生一样引入就好, body 里面引入 js,head 里面引入 css。:所以这样子,就引入好了。接着在<head><link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.15.12/theme-chalk/index.min.css"></head><body><script src="https://cdn.staticfile.org/element-ui/2.15.12/index.min.js"></script></body>
main.js里面,把之前import的所有element的样式删掉。接着,vue.config.js的configureWebpack加个externals字段:「externals」: Webpack 的const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;module.exports = {plugins: [new BundleAnalyzerPlugin()],externals: {'element-ui': 'ELEMENT' // key 是之前install下下来的包名,element-ui。value是全局变量名(ELEMENT)}}
externals 配置用于声明某些依赖应该从外部获取,而不是打包到最终的 bundle 中。这样可以减小打包体积,前提是这些依赖已经在运行环境中存在。「'element-ui': 'ELEMENT' 的含义」当你的代码中 import 'element-ui' 时,Webpack 不会打包 element-ui,而是会从全局变量 ELEMENT 中获取它。ELEMENT 是 element-ui 库通过 <script> 标签引入时,在全局(window)中暴露的变量名。例如,如果你在 HTML 中这样引入: <script src="https://unpkg.com/element-ui/lib/index.js"></script>那么 element-ui 会挂载到 window.ELEMENT 上。「为什么这样配置?」通常是为了通过 CDN 引入 element-ui(而不是打包它),从而优化构建速度和体积。你需要确保在 HTML 中通过 <script> 提前加载了 element-ui,否则运行时 ELEMENT 会是 undefined。<!-- HTML 中通过 CDN 引入 element-ui --><script src="https://unpkg.com/element-ui/lib/index.js"></script>
// webpack.config.jsmodule.exports = {externals: {'element-ui': 'ELEMENT' // 告诉 Webpack:import 'element-ui' 时,返回全局的 ELEMENT}};
「注意事项:」确保全局变量名(// 你的代码中依然可以正常 import(但实际用的是全局变量)import ElementUI from 'element-ui';// 相当于:const ElementUI = window.ELEMENT;
ELEMENT)和 element-ui 的 CDN 版本一致。不同版本的库可能有不同的全局变量名。如果使用模块化打包(如 npm + Webpack 全量打包),则不需要配置 externals。这里有的伙伴就说,我咋知道是ELEMENT,而不是element呢。这里是这么找的:直接在浏览器控制台检查 在 HTML 中通过 CDN 引入该库:<script src="https://cdn.staticfile.org/element-ui/2.15.12/index.min.js"></script>打开浏览器开发者工具(F12),在 Console 中输入:console.log(window);然后查找可能的全局变量名(如 ELEMENT、ElementUI 等)。cdn 配置之后,重新分析npm run build --report重新用cdn的去分析,那么就很舒服了,也因此,这个就是 cdn 优化的方法。✅ nginx gzip 压缩✅vue gzip 压安包:server {listen 8103;server_name ************;# 开启gzipgzip on;# 进行压缩的文件类型。gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;# 是否在http header中添加Vary: Accept-Encoding,建议开启gzip_vary on;}
npm i compression-webpack-plugin@1.1.12 --save-dev注意版本匹配问题。vue 配置,这段配置是 Webpack 构建中关于 「Gzip 压缩」 的设置,位于 config/index.js 文件中。:「//文件路径 config --> index.jsbuild: {productionGzip: true, // 启用生产环境的 Gzip 压缩productionGzipExtensions: ['js', 'css'], // 需要压缩的文件类型}
productionGzip: true」compression-webpack-plugin(如注释所述)。 npm install --save-dev compression-webpack-plugin「productionGzipExtensions: ['js', 'css']」