vue-cli 项目打包后 vendor.js文件较大问题解决

本文介绍如何在Webpack配置中使用CDN资源,通过externals配置避免将常用库如Vue、VueRouter及Element-UI等打包进vendor.js,从而减小项目体积,提升加载速度。文章详细解释了修改webpack配置、引入CDN链接、删除main.js中相关import语句的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,首先在build文件夹下的web[ack.base.conf.js文件里面添加如下,与entry,output平级

externals: {
    'vue': 'Vue',
    'vue-router': 'VueRouter'
},

这一段是告诉webpack项目打包压缩的时候不要将vue.js 和vuerouter打包进vendor.js

2.在index.html中引入cdn的地址,注意script放在body里面

<link rel="stylesheet" href="https://unpkg.com/element-ui@2.4.9/lib/theme-chalk/index.css">
<script src="//cdn.bootcss.com/vue/2.5.2/vue.min.js"></script>
<script src="https://unpkg.com/element-ui@2.4.9/lib/index.js"></script>
<script src="https://cdn.bootcss.com/vue-router/3.0.1/vue-router.min.js"></script>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>

3.将main.js里面 

import Vue from 'vue'

router里面index.js里面

import Vue from 'vue'
import VueRouter from 'vue-router'

删掉就行了

4.如果项目中用到了element-ui在index中通过cdn引入就行,main,js里面不用再import Elementui from 'element-ui'引入了

<think>首先,用户的问题是关于JavaScript打包的,具体是:为什么分包的JavaScript文件会被打包进主包的vendor.js中,以及如何解决这个问题。用户引用了几个站内引用,我需要参考这些引用。 回顾用户提供的引用: - 引用[1]: 提到app.jsvendor.js过大,是因为main.js导入了太多第三方库,导致webpack生成了大的vendor.js- 引用[2]: 描述了使用vue打包时,vendor.js文件太大解决方式,通过某种方法(可能是代码分割或优化)使得vendor.js变小,出现了很多小文件如1.xxxxx.js- 引用[3]: 针对uniapp打包到微信平台,分包后vendor.js文件依然很大的问题,建议检查是否开启分包优化,并修改manifest.json配置。 - 引用[4]: 解决vue-cli项目vendor.js文件较大问题,通过在webpack配置中添加externals来排除某些库。 用户的核心问题是:为什么分包的JS文件会被打包进主包的vendor.js中?意思是,在分包的情况下,一些本应属于分包的JavaScript文件却被包含在主包的vendor.js中。 我需要基于这些引用和一般知识来回答。用户的问题似乎是针对前端打包,特别是像Webpack这样的工具,在Vue或Uni-app等框架中。 关键点: - vendor.js通常包含第三方库(如VueVue Router等)。 - 分包(code splitting)是Webpack的一个特性,用于将代码分割成多个块,以便按需加载。 - 问题:分包的JS文件打包进主包的vendor.js中,这可能导致主包过大。 可能的原因: 1. **配置问题**:在Webpack配置中,没有正确设置分包规则,或者vendor.js的生成逻辑包括了不应该包含的模块。 2. **依赖关系**:如果分包的JavaScript文件依赖了主包中的某些模块,或者反之,Webpack可能会将它们打包在一起以确保依赖关系。 3. **优化设置**:如引用[3]提到的,在Uni-app中,如果没有开启分包优化,vendor.js可能没有被正确分割。 4. **入口点定义**:在Webpack中,vendor.js通常是通过配置entry points或使用插件如SplitChunksPlugin生成的。如果配置不当,所有模块都可能被包括在主包中。 从引用中提取解决方案: - 引用[2]:提到通过某种优化(可能是动态导入或代码分割),vendor.js被拆分成多个小文件- 引用[3]:建议在manifest.json中设置optimization属性来开启分包优化。 - 引用[4]:使用externals来排除某些库,使它们不被打包vendor.js,而是通过CDN引入。 对于用户的问题:"为何分包的JavaScript文件打包进主包的vendor.js中",原因可能包括: - **依赖共享**:如果分包的模块和主包共享了相同的第三方库,Webpack可能会将这些库打包vendor.js以避免重复。 - **配置错误**:在Webpack的SplitChunksPlugin配置中,如果没有指定chunks为'async',或者minChunks设置不当,可能会导致所有模块都被包括在初始包中。 - **入口点问题**:如果分包的入口点没有正确定义,或者模块被错误地导入到主入口点。 解决方法: 1. **检查Webpack配置**:确保正确使用SplitChunksPlugin来分割代码。 2. **开启分包优化**:如引用[3]所述,在manifest.json或Webpack配置中设置optimization。 3. **使用动态导入**:对于分包的代码,使用import()语法来按需加载。 4. **设置externals**:如引用[4],排除某些库,减少vendor.js大小。 5. **分析包大小**:使用工具如webpack-bundle-analyzer来识别哪些模块被打包vendor.js。 回答结构: - 先解释原因。 - 然后提供解决方法。 - 最后生成相关问题。 使用中文回答。 确保系统指令:行内数学表达式用$...$,独立公式用$$...$$,但在这个问题中,可能不需要数学表达式,因为主题是JavaScript打包。 引用标识:在回答中引用段落末尾添加[^1]等。 生成相关问题。 用户问题:"请问为何分包的JavaScript文件打包进主包的vendor.js中,如何解决?" 所以,回答: 1. 原因。 2. 解决方法。 参考引用: - 引用[1]:vendor.js过大是因为第三方库太多。 - 引用[3]:分包优化未开启。 - 引用[4]:使用externals。 构建回答: - **原因**:分包的JS文件打包进主包的vendor.js中,可能是因为这些文件共享了公共依赖,或者Webpack配置中未正确设置代码分割规则。例如,如果分包的模块依赖了主包中的第三方库,Webpack可能会将这些库打包vendor.js以确保依赖关系[^3]。此外,分包优化未开启也可能导致vendor.js未被分割[^3]。 - **解决方法**: - 开启分包优化:在配置文件中设置optimization属性,如Uni-app中的manifest.json[^3]。 - 配置Webpack的SplitChunksPlugin:指定chunks为'async',只对异步模块进行分割,避免主包包含分包代码。 - 使用动态导入:对于分包的代码,使用import()语法,确保它们被加载为异步块。 - 设置externals:排除某些第三方库,通过CDN引入,减少vendor.js大小[^4]。 - 分析包:使用webpack-bundle-analyzer检查哪些模块被打包vendor.js,并进行优化。 最后,生成相关问题。</think>### 为何分包的JavaScript文件打包进主包的vendor.js中,以及解决方法 在Webpack等打包工具中,vendor.js通常用于存放第三方库(如VueVue Router等)。当分包的JavaScript文件打包进主包的vendor.js时,会导致主包体积过大,影响加载性能。以下是基于常见原因的分析和解决方法,参考了站内引用和最佳实践。 #### 原因分析 1. **依赖共享问题**:如果分包的模块和主包共享了相同的第三方库(例如Vue或公共工具库),Webpack可能会将这些共享依赖打包vendor.js,以避免重复代码。这确保了运行时依赖完整性,但会增加主包大小[^3]。 - 例如,在Uni-app或Vue项目中,分包代码如果引用了主包中的库,Webpack默认会将它们合并到vendor.js中。 2. **分包优化未开启或配置错误**:在打包配置中,如果未启用分包优化(optimization),或SplitChunksPlugin规则设置不当,Webpack可能将所有模块(包括分包的)视为初始依赖,强制打包进主包的vendor.js[^3]。 - 引用[3]指出,在Uni-app中,分包后vendor.js依然过大,往往是因为`manifest.json`未设置`optimization`属性,导致分包代码未被正确分割。 3. **入口点定义错误**:如果分包的JavaScript文件被错误地导入到主入口点(如`main.js`),Webpack会将其识别为初始加载模块,而非异步分包模块。这常见于代码组织不当或导入路径错误[^1]。 4. **静态导入导致**:使用`import module from 'module'`语法导入分包模块,而非动态导入(`import()`),会强制Webpack将模块视为同步依赖,打包进主包[^2]。 #### 解决方法 针对上述原因,以下是逐步解决方案,适用于Vue、Uni-app等基于Webpack的项目。优化后,vendor.js将被拆分成多个小文件(如`1.xxxxx.js`),主包体积显著减小[^2][^3]。 1. **开启分包优化**: -项目配置文件(如`manifest.json`或`webpack.config.js`)中,添加或修改`optimization`属性。 - 示例(Uni-app微信小程序):在`manifest.json`中添加以下配置: ```json { "mp-weixin": { "optimization": { "subPackages": true // 开启分包优化,确保分包代码不被包含在主包vendor.js中 } } } ``` 参考[^3],这能强制Webpack将分包代码分离为独立文件,避免vendor.js膨胀。 2. **配置Webpack的SplitChunksPlugin**: - 在`webpack.config.js`中,自定义SplitChunksPlugin规则,指定只对异步模块(分包)进行分割。 - 示例配置: ```javascript module.exports = { optimization: { splitChunks: { chunks: 'async', // 只分割异步加载的模块(分包) minSize: 30000, // 模块最小体积阈值 cacheGroups: { vendors: { test: /[\\/]node_modules[\\/]/, // 仅将node_modules中的库打包vendor.js name: 'vendor', enforce: true } } } } }; ``` 此配置确保vendor.js只包含第三方库,而非分包的JavaScript文件[^2][^3]。 3. **使用动态导入(Dynamic Import)**: - 将分包模块的导入方式改为动态导入(`import()`),确保Webpack将其识别为异步块。 - 示例(Vue项目): ```javascript // 错误:静态导入(会导致分包代码打包进主包) // import SubModule from './sub-package/module'; // 正确:动态导入 const SubModule = () => import('./sub-package/module'); ``` 动态导入后,分包代码会生成独立的`1.xxxxx.js`文件,而不是被包含在vendor.js中[^2]。 4. **设置externals排除第三方库**: - 如果vendor.js过大是由于第三方库太多,可在Webpack配置中使用`externals`,将这些库排除,改为通过CDN引入。 - 示例(在`webpack.base.conf.js`中添加): ```javascript externals: { 'vue': 'Vue', // 排除Vue库 'vue-router': 'VueRouter' // 排除Vue Router库 } ``` 然后在HTML中通过CDN引入: ```html <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> <script src="https://cdn.jsdelivr.net/npm/vue-router@3.5.3/dist/vue-router.js"></script> ``` 这能显著减小vendor.js体积,如引用[^4]所述。 5. **分析包大小并调试**: - 使用`webpack-bundle-analyzer`工具生成包大小报告,识别哪些模块被打包vendor.js。 ```bash npm install --save-dev webpack-bundle-analyzer ``` 在Webpack配置中添加插件: ```javascript const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; module.exports = { plugins: [new BundleAnalyzerPlugin()] }; ``` 运行打包命令后,查看可视化报告,优化高体积模块[^1]。 #### 验证结果 实施上述方法后,打包输出应显示: - 主包vendor.js体积减小(通常降至100KB左右)。 - 分包代码生成独立文件(如`sub-package/xxxx.js`)。 - 整体加载性能提升,如引用[^2]中的优化效果。 如果问题仍存在,请检查项目依赖树或提供具体配置,以便进一步诊断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值