后端出身,偶尔也写点前端代码,但是基本上都是借用现有的框架
最近做一个移动端的网页,使用 vue 2.0+element-ui
做完 build 之后发现 js 和 css 文件太大了,打开一个页面要加载 1.2M 的 js 和 css 文件
贴一下 vue build 的 log
Version: webpack 3.12.0
Time: 20721ms
Asset Size Chunks Chunk Names
static/fonts/element-icons.6f0a763.ttf 11 kB [emitted]
static/js/vendor.74e7738e8c0916a28a81.js 726 kB 0 [emitted] [big] vendor
static/js/app.1cd5647b901de7d30cc7.js 5.04 kB 1 [emitted] app
static/js/manifest.2ae2e69a05c33dfc65f8.js 857 bytes 2 [emitted] manifest
static/css/app.78fb8a529b8373e9e08b2d3833526bb5.css 403 kB 1 [emitted] [big] app
static/css/app.78fb8a529b8373e9e08b2d3833526bb5.css.map 574 kB [emitted]
static/js/vendor.74e7738e8c0916a28a81.js.map 2.78 MB 0 [emitted] vendor
static/js/app.1cd5647b901de7d30cc7.js.map 19.9 kB 1 [emitted] app
static/js/manifest.2ae2e69a05c33dfc65f8.js.map 4.97 kB 2 [emitted] manifest
index.html 1.08 kB [emitted]
请教各位大佬,该如何优化呢?
1
littlewin 2018 年 7 月 23 日 插件分析下有无重复引入
element-ui 可以按需导入 一个原则,把一切多余的东西去掉... |
2
Wincer 2018 年 7 月 23 日 via Android
gzip ?
|
3
maichael 2018 年 7 月 23 日
1.2mb 的文件,gzip 之后也就 400 多 K 左右,还好。
|
4
kevin1234 2018 年 7 月 23 日
你在四川
|
5
zhlssg 2018 年 7 月 23 日
分割路由,异步组件
|
6
v2chou 2018 年 7 月 23 日
有没有用官方脚手架 没有的话装 webpack-bundle-analyzer 这个 然后去看看哪些地方太大了 针对性的去优化 楼上说的异步路由组件 也可以做
|
7
VDimos 2018 年 7 月 23 日 via Android babel-plugin-import,按需引入
|
8
yamedie 2018 年 7 月 23 日
是不是改变了 url-loader 小图片打包的阈值? 还是项目里低于 10k 的小图片太多了?
|
9
ntnyq 2018 年 7 月 23 日
我的 vendor 文件已经 1.9MB 了 - -!
|
10
shakaraka PRO 你要 map 干嘛?
|
11
panlilu 2018 年 7 月 23 日 生产环境不需要 map
|
12
yamedie 2018 年 7 月 23 日 首页用不到的库, 而且支持 umd 方式加载的, 不妨在 index.html 里写个<script async src="//bootcdn...."></script>挂载到全局, 能减少 vendor 的打包体积
|
17
whypool 2018 年 7 月 23 日 正常
我这生产的 vendor 都快 6M 了 总体的 JS 和 CSS 有 27m 当然要按需加载,差不多有 200 多个路由 不过是用 ng 写的 |
18
wly19960911 2018 年 7 月 23 日
这个不算很大啊,我们的项目用 angular 打包都是十几 M 起步的,主要是首屏优化的问题,如果开启 gzip 压缩,首屏只需要 600KB 的加载,如果用 aot 编译的话,还能更快。最近尝试升级中。
|
19
wly19960911 2018 年 7 月 23 日
@yamedie 这个不一定正确,我正在考虑这方面优化,我们这里有几个非常大的 JS 阻塞了首屏加载(暂时无法优化成 modules ),阻塞到了正常的 main.js 和 verdor.js ,app.css 的加载。
浏览器请求的线程被占据了,所以导致 angular 所需要的正常的 js 无法被加载完毕。 目前我考虑出了一个方式是在组件 init 的方法里面添加 script 标签,然后等框架初始化完成再加载,使用 onload 事件获取 script 加载完成的信号。 但是仅仅是想想,还没有进入实战。 |
20
cydian 2018 年 7 月 23 日 via Android
map 文件是方便调试使用的吧。无需手动引入。
用户页面无需引入 map,调试时需要 map,在 Chrome 的调试设置中打开 map 选项,会自动引入(前提是文件中有 map 文件并且在正常的 js 中的末尾注明了 map 的引用位置。) |
23
LeungJZ 2018 年 7 月 23 日 |
24
cydian 2018 年 7 月 23 日 via Android 关于大的通用发行 js 的引用。
可通过 CDN 解决。楼上博文中提到了 @LeungJZ 使用 BootCDN 解决,可能是一个可行方案。但多次线上项目和实际测试说明,如果项目要求高,该 CDN 不是最佳的选择。支持 BootCDN 的某云已不可靠,据了解该云给员工放假 3 个月以上,屡次通过封禁域名后缀来单一的解决攻击问题,影响不小。正常访问忙时也会波动较大。 |
26
0x4C 2018 年 7 月 23 日
如非必要 勿增实体
|
28
yhxx 2018 年 7 月 23 日
|
29
CasualYours 2018 年 7 月 23 日 via Android
1.给个 Loading 动画
2. gzip 3. cdn |
30
LeungJZ 2018 年 7 月 23 日
|
31
zhzer 2018 年 7 月 24 日
分包异步加载
不过,你这个完全不用那么复杂,webpack 设置生产模式然后把 devtool 关了就行 精益求精就加上 gzip |