前段时间对公司内部的组件库(类似element-ui)做了打包体积优化,现在抽点时间记录下。以前也做过构建速度的优化,具体可以看组件库的webpack构建速度优化
最开始打包是基于webpack的,在按需加载上存在的体积冗余会比较大,如:
-
<李> <代码> webpack> 代码打包特有的模块加载器函数,这部分其实有些多余,最好去掉李>
<李>使用<代码>巴别塔> 代码转码时,<代码>巴别塔> 代码带来的<代码>助手> 代码函数全部是内联状态,需要转成<代码>进口代码>或<代码> 代码>需要来引入李>
<李>使用<代码> transform-rumtime> 代码对一些新特性添加<代码> polyfill> 代码,也是内联状态,需要转成<代码>进口代码>或<代码> 代码>需要来引入李>
<李> <代码> vue-loader> 代码带来的额外代码,如<代码> normalizeComponent> 代码,不做处理也是内联李>
<李> <代码> transform-vue-jsx> 代码带来的额外函数引入,如<代码> mergeJSXProps> 代码,不做处理也是内联李>
以上几个问题,如果只是一份代码,那不会有太大问题,但是如果是按需加载,用户一旦引入多个组件,以上的代码就会出现多份,带来严重的影响
从“gs-ui”进口{按钮,图标}
以上代码会转成
从“gs-ui/lib/button.js”导入按钮 从“gs-ui导入图标/lib/icon.js '
这样,就会出现多份相同的辅助<代码> 代码>函数代码,多份<代码> webpack> 代码的模块加载器函数,而且还不好去重
讨论过后主要有以下几种选择
采用后编译引用>我们也认同这种方案,采用后编译可以解决上面的各种问题,也有组件库是这样做的,比如cube-ui,但是这样有些不方便,因为用户需要设置各种<代码>别名> 代码,还要保证好各种编译环境,如<代码> jsx> 代码,而且未来可能会引入<代码> 代码>流动,会更加不方便,所以暂时不考虑
使用汇总打包,设置的外部(当然webpack也可以)外联辅助函数引用>使用<代码>汇总> 代码打包,可以直接解决问题1和问题4,设置外部<代码> 代码>可以解决<代码> transform-runtime> 代码等带来的<代码>助手> 代码,这取决于相关插件实现时是不是通过进口<代码> 代码>或<代码> 代码>需要来添加辅助<代码> 代码>的,如果是直接<代码> 代码副本的话,那就还得另找办法。最后决定就这种方案进行尝试
使用<代码>汇总> 代码打包可能某些习惯和<代码> webpack> 代码有些出入,在这里很多事需要引入插件来完成,比如引入<代码> node_modules> 代码中的模块的话,需要加入<代码> rollup-plugin-node-resolve> 代码,加载而commonjs <代码> 代码>模块需要引入<代码> rollup-plugin-commonjs> 代码等等。另外还有些比较麻烦的,比如经常会这样写
从“进口xx。/xx-folder '然后希望模块打包器可以识别成
从“进口xx。/xx-folder index.js”在<代码>汇总> 代码里还是需要用插件来完成这件事,找到的插件都没能满足各种需求,比如还需要对<代码>别名> 代码也能识别然后加上<代码> index.js> 代码,最后还是需要自己实现这个插件
基本的汇总配置应该差不多是这样的
{ 输出:{ 格式:“西文”,//文件:xx,//路径: }, 输入:“xxx”, 插件:[ vue ({ compileTemplate:没错, htmlMinifier: { customAttrSurround:[[//@,新的正则表达式(“)],[/:/,新的正则表达式(“)]], collapseWhitespace:没错, removeComments:真 } }), 巴别塔({ …babelrc ({ addModuleOptions:假的, addExternalHelpersPlugin:假 }), 排除:“node_modules/* *”, runtimeHelpers:真 }), localResolve ({ 组件:路径。解决(__dirname“. ./组件”) }), 别名({ 组件:路径。解决(__dirname“. ./组件”), 解决:['。js”、“.vue '] }), 替换({ “process.env。NODE_ENV”: JSON.stringify(的发展) }) ],//外部 }这里采用的<代码> rollup-plugin-vue> 代码的版本是<代码> v3.0.0> 代码,不采用<代码> v4> 代码,因为打包出来的体积更小,功能完全满足组件库需要。因为会存在各种约定,比如组件肯定是存在
基于汇总的组件库打包体积优化小结