Open HecateDK opened 6 years ago
我们也碰到过这个问题,只不过我们的是 百度的富文本编辑器~
@Pines-Cheng 你们怎么解决
@liyatang 我们直接放在index.html加载,然后PC端要求没那么高,还没来得及进一步处理。
loadScript 的实现哪一个
@WaSheep loadScript这个function在gm-service/src/async_load_js 代码还有优化空间,不过大概思想就是那样了。
使用方式可以参考gm-service/src/require_module,里面的三个例子,我们都已应用到实际项目中了
@HecateDK js-xlsx 这样作为 chunk 还是太慢(大)了,题主有类似于 babel-lodash-plugin 的轮子么,来 demand loading 某些模块, 我正在尝试 treeShaking
@WaSheep 我们的做法和babel-plugin-lodash不太一样,我们只是把xlsx.min.js
之类的比较大的文件,需要用到的时候,动态插入一个script
标签去引入js。如果是第一次需要用到xlsx.min.js
,确实是会比较慢的,因为要等浏览器下载资源,但这个等候时间,暂时来说我们是可以接受的。
这种情况下要如何去treeShaking,对此还没有比较好的思路。
xlsx.min.js gzip 后才313kb,小事小事,对于现在的网络状况。 也许就一个图片的大小。 xlsx.min.js脱离后对webpack的减压,和网页速度优先响应等等才是关键指标。
xlsx.min.js gzip 后才313kb,小事小事。
放在首屏加载这就不是小事了。
xlsx模块引入优化
背景
station项目技术栈使用react+es6+react-router4+webpack+babel,项目业务模块多达数百个,项目依赖上千个,尽管使用了一系列webpack打包与性能优化的方案,如happypack、DllPlugin等,但生产环境全量构建仍需要三分钟左右。在优化xlsx模块前,运行
npm run monitor
可以看到,项目依赖总计20.44MB,一共有1498个模块,其中xlsx占了37.4%:然而,我们只需要用到xlsx模块的
xlsx.min.js
文件,其他的都是累赘,并且大大拖慢了打包速度,所以不得不思考如何对xlsx模块进行优化。webpack externals
xlsx模块那么大,首先想到的就是使用webpack externals。官方文档对于externals的定义是:
可以看到项目依赖减少到14.26MB,并且webpack没有打包xlsx模块了。
因而只需要通过
script
标签引入xlsx.min.js
即可。 但xlsx.min.js
有接近 1M,而在具体的业务上,首页和大部分页面都不需要用到 xlsx,更合理的做法是动态引入 xlsx。实现
通过与同类型的模块对比和思考,
xlsx.min.js、pdfmake.min.js、BMapLib.min.js
文件都非常大,webpack打包它们要耗费很长时间。可以运用script
单独引入它们,但如果放在template
上,则会拖慢首页加载速度:如上图所示,我们提供了
loadScript
方法用于动态插入script
标签。针对那些较大的、不想打包到bundle上的js,但项目中使用的库所依赖的js文件,都通过loadScript
方法进行动态加载。再运用
Dynamic imports
,按需加载所用到的库,类似requireGmXlsx
方法,按需加载gm-xlsx
:webpack 在编译时,会静态地解析代码中的
reuqire.ensure
,同时将模块添加到一个分开的 chunk 当中。这个新的 chunk 会被 webpack 按需加载。gm-xlsx
需要依赖xlsx.min.js
,所以asyncLoadJS
用于异步加载所需的js文件:对于想要异步加载的js文件,只需要类似
xlsx.min.js
配置:打开浏览器,再看一下网络面板。
打开主页,只请求了bundle.js,文件内容也是只包含了主页的代码。打开用到
gm-xlsx
库的页面,xlsx.min.js
文件被加载进来了,并没有打包。并且再次应用gm-xlsx
的功能时,xlsx.min.js
并没有再次加载。总结
xlsx的模块优化重点是:
loadScript
function动态加载xlsx.min.js
require.ensure
异步加载gm-xlsx
库其他
做这个需求因为涉及到多个库,踩了一些坑,总结一下:
暴力更新:把A库中的a方法迁移到B库后,直接就删除了A库中的a方法,并且没有把项目中应用到a方法的地方改一下引用:
应该保留A库中的a方法,但加上一个
console.warn
,提醒大家以后用新的替换方案。并且扫一下所有项目中用到a方法的地方,都改为从B库引入。确保依赖的库用了对的版本号:项目中用到的A库依赖于B库的某个版本,
package.json
文件中B库的版本号是^5.4.22
,但在本地开发中手动删除了package-lock.json
文件,再npm install
的时候,默认下载了5.*.*
中最高版本的B库,所以本地调试没有出问题:npm install
的时候会提示一些库需要更高版本,要解决这些问题再进行本地开发。gm-xlsx
依赖于xlsx.min.js
,xlsx.min.js
异步加载后再异步加载gm-xlsx
。