webpack实战——打包优化【下】

作者: 流眸Tel | 来源:发表于2020-10-27 17:00 被阅读0次

前言

这是webpack打包优化【下】篇。前几篇针对性能要求高的项目从加快打包速度、减小资源体积方面入手,提出了一些优化政策,然后测试都可起到一定优化效果。本篇描述死代码的检测与去除

tree shaking

1 死代码检测去除

首先抛出问题,什么是死代码?

工程中没有被引用过的模块,这部分代码将永远无法被执行,称为“死代码”。

那知道了什么是死代码,如何检测去除呢?

在前面我们介绍过,ES6 module 依赖关系的构建是在代码编译时而非运行时。基于这项特性webpack提供了tree shaking功能。这个功能便可以在打包过程中帮助我们检测没有被引用的模块,然后对这部分代码进行标记,并在资源压缩时将它们从最终的bundle中去掉

例:

// index.js
import { foo } from './util';
foo();
// util.js
export function foo() {
    console.log('this is foo');
}
export function bar() { // 没有被任何其他模块引用,因此属于死代码
    console.log('this is bar');
}

那么在webpack打包时就会对bar()添加一个标记,在正常本地开发环境下它依然会存在,但是在生产环境压缩资源那一环节则会被移除掉。

tree shaking有时可以使得bundle资源体积显著减小,但需要一些前提条件。

2 ES6 Module

tree shaking 只对ES6 Module生效。 有时候我们发现算只引用了某个库中的一个接口,却把整个库都加载了进来,使得bundle体积并没有什么变化,可能原因是该库是用CommonJS导出的,而不是ES6 Module。当然,为了更好地向下兼容,自然是使用CommonJS形式是库依然很多。而排开第三方库,在我们自己书写模块或者库时,可以尽可能的选择ES6 Module形式导出,这样tree shaking的效率会更高。

3 使用webpack进行依赖关系构建

一般我们都会在工程中使用到babel-loader,如果我们有使用到,那么一定要通过禁止它的模块依赖解析。原因是如果我们使用babel-loader来做依赖解析,那么webpack接收到的一般都是转化过的CommonJS形式的模块,那就无法对其进行tree shaking。

禁用babel-loader模块依赖解析配置如下:

// webpack.config.js
module.exports = {
    ...
    module: {
        ryles: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: [
                    {
                        loader: 'babel-loader',
                        options: {
                            presets: [
                                // 在这里加上modules: false
                                [@babel/preset-env, { modules: false }]
                            ]
                        }
                    }
                ]
            }
        ]
    }
}

4. 使用压缩工具去除死代码

tree shaking本身只是为死代码添加上标记,而真正意义上去除死代码则是通过压缩工具来进行的,而此工具之前介绍过:terser-webpack-plugin。在此不再赘述。

小结

通过【上】【中】【下】三篇描述,介绍的一些打包优化的方案均可以对项目有不同程度的优化,无论是打包速度还是减小资源体积,都有涉及。然而我们更需要清楚地了解到每一种优化策略都有其使用场景,并不是任何一个点放在一切项目中都有效。

当然,我们更需要不断培养自己的能力,当发现性能问题时,根据现有情况自己多加思考,分析出原因,然后对症下药。

下一篇介绍更多的JavaScript打包工具。

相关文章

  • webpack实战——打包优化【下】

    前言 这是webpack打包优化【下】篇。前几篇针对性能要求高的项目从加快打包速度、减小资源体积方面入手,提出了一...

  • Webpack极限打包优化

    今天为了更好地了解一下Webpack打包优化的一些内容,看了一下NEXT公开课,Webpack打包极限优化,感兴趣...

  • 基于webpack 3 打包性能优化

    基于webpack 3 打包性能优化 source Scope Hoisting. 过去 webpack 打包时的...

  • webpack实战——打包优化【上】

    前言 本篇介绍一些webpack优化的配置方法,目的有二: 打包速度更快 输出资源更小 注意:在软件工程领域有一条...

  • webpack实战——打包优化【中】

    前言 上篇从多线程打包和缩小打包作用域两个方面入手,对webpack打包层面做出优化。本篇描述从动态链接库思想方面...

  • webpack打包优化

    实现webpack打包优化,有两个优化点: 如何减少打包时间 如何减少打包大小 减少打包时间 优化Loader对于...

  • React单页面应用项目 性能优化 实践

    react 单页面应用项目在加载优化这一块就得依赖webpack的打包方式。webpack的打包优化的本质就是将 ...

  • 浅谈webpack打包原理

    近来想要对旧项目进行优化,所以了解下webpack打包原理为优化做准备 webpack 4.x 打包文件 inde...

  • webpack实战——模块打包

    写在前面 这是webpack实战系列的第二篇:模块和模块打包。上一篇:webpack实战——打包第一个应用 记录了...

  • Webpack 打包优化之速度篇

    在前文 Webpack 打包优化之体积篇中,对如何减小 Webpack 打包体积,做了些探讨;当然,那些法子对于打...

网友评论

    本文标题:webpack实战——打包优化【下】

    本文链接:https://www.haomeiwen.com/subject/pfmxvktx.html