使用tree shaking 移除无用代码

 更新时间:2023年06月25日 14:37:17   作者:一颗冰淇淋  
这篇文章主要为大家介绍了使用tree shaking 移除无用代码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

tree shaking 依赖于ES Module 的静态语法分析,在项目编译时移除无用的代码以减少文件体积。

usedExports

在文件中,我们可能定义了变量但是暂时又没有用到,这样会造成空间的浪费。在 modeproduction 时,会默认做一些配置,将无用的代码删除。为了看到没有做处理时编译后的文件效果,在 webpack 中做如下配置。

module.exports = {
  // 其他配置省略
  mode: 'development',
  optimization: {
    minimize: false,
    usedExports: false,
  },
};

在这种配置情况下,当存在没有用到的变量时,还是照原样编译到了 js 文件中。

useExports为false

想要移除掉 js 文件中的无用代码,开启 minimize 通过 usedExports 配置

module.exports = {
  // 其他配置省略
  mode: 'development',
  optimization: {
    minimize: true,
    usedExports: true,
  },
};

这样编译后就将没有用到的变量 username 和 foo 函数都移除掉了

useExports为true

sideEffects

这时候仍存在一个问题,如果通过模块化引入另一个js文件,即使没有被使用,useExports 也不会进行 tree shaking

// index.js
import './format.js';
// format.js
export function timeFormat() {
  return '2022-01-01';
}

比如上面这段代码,通过 import 语句引入 format.js,但 format.js 导出的函数没有被使用。

import导入文件没有treeShaking

此时仍然对于 import 语句进行了编译,我们希望在引入的文件中也进行 tree shaking,删除无用的代码,这个时候在 package.json 中配置 sideEffects 属性来处理。

// package.json 其他配置省略
{
    "sideEffects": false
}

sideEffects 用于告知 webapck 编译器哪些模块有副作用

  • 定义为 false,表示所有的模块都不存在副作用,不需要用到的时候直接删除
  • 定义为数组,告知有副作用的模块,该模块中有副作用的代码会被保留,没有副作用且没有使用到的代码会被删除。

sideEffect为false

这样引入的 js 文件没有被使用,进行了 tree shaking,可是 css 资源通过 import 引入也被删除了,也不会编译生成对应的 css 文件,解决方式可以选择在 sideEffects 属性中定义数组,或者处理 css 文件的 loader 中配置(推荐)。

// package.json
{
    "sideEffects": [
        "**.css"
    ],
}
// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        // 其它配置省略
        sideEffects: true,
      },
    ],
  },
};

在这种情况下,在 js 文件中引入的 css 文件就不会直接被移除掉

sideEffect保留css

PurgeCss

不过 sideEffects 属性是不会帮助 css 文件内部进行 tree shaking 操作的,比如没有在代码中创建 divh1 标签,但这段 css 代码也没有被移除。

想要在css代码中进行 tree shaking 可借助 purgecss-webpack-plugin。通过 npm install purgecss-webpack-plugin -D 安装后在 package.json 中配置。

  • paths:表示要检测哪些目录下的内容需要被分析
  • glob:对某些文件、文件夹通过正则表达式来进行匹配, webpack或其他插件已经安装过
  • noddir:表示匹配文件,不匹配文件夹
  • safelist:默认情况下,Purgecss会将html、body标签的样式移除掉,如果希望保留,需要在safelist中添加

这样 css 文件内部也会移除掉无用的代码

PurgeCss

总结

在项目性能优化时,可以通过 tree shaking 来做以下操作

  • optimization 中配置 usedExports 为 true,移除 js 无用代码。
  • ( 这也是 mode 为 production 时的默认配置 )
  • package.json 中配置 sideEffects 为 false,css 在 loader 中设置 sideEffects 为 true,对模块进行优化。
  • 使用 PurgeCss 来对 css 文件内部的代码进行 tree shaking。

以上就是使用tree shaking 移除无用代码的详细内容,更多关于tree shaking移除无用代码的资料请关注脚本之家其它相关文章!

相关文章

  • 微信小程序与公众号卡券/会员打通的问题

    微信小程序与公众号卡券/会员打通的问题

    这篇文章主要介绍了微信小程序与公众号卡券/会员打通的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 微信小程序实现顶部导航特效

    微信小程序实现顶部导航特效

    这篇文章主要为大家详细介绍了微信小程序实现顶部导航特效,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • JS实现音乐钢琴特效

    JS实现音乐钢琴特效

    这篇文章主要为大家详细介绍了JS实现音乐钢琴特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过

    iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过

    近期需要一个iframe自适应高度的东西,在网上找了很多,都不能用……一看大体的日期都是大概 2008年前后的其他近期的基本都是以前的转载,所以只好自己动手了。
    2010-07-07
  • js实现简单手风琴效果

    js实现简单手风琴效果

    这篇文章主要为大家详细介绍了js实现简单手风琴效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 在JavaScript中让this保持正确的指向的解决方案

    在JavaScript中让this保持正确的指向的解决方案

    这篇文章主要介绍了关于在 JavaScript 中如何让 this 保持正确的指向的解决方案,文中给大家介绍了三种解决方案,使用闭包,使用箭头函数和换绑 this这三种方法,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-01-01
  • 微信小程序前端源码逻辑和工作流

    微信小程序前端源码逻辑和工作流

    这篇文章主要介绍了微信小程序前端源码逻辑和工作流 的相关资料,本文还给大家提供了文本基本结构图和实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • 利用JavaScript构建树形图的方法详解

    利用JavaScript构建树形图的方法详解

    ​树形图可视化广泛用于分层数据分析。如果你没有经验还想创建一个,那将会有些复杂。下面是一个详细教程,教你如何使用JavaScript创建交互式树形图
    2022-06-06
  • layui自定义插件citySelect实现省市区三级联动选择

    layui自定义插件citySelect实现省市区三级联动选择

    这篇文章主要为大家详细介绍了layui自定义插件citySelect实现省市区三级联动选择,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • js 字符串转换成数字的三种方法

    js 字符串转换成数字的三种方法

    在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形式的.在网上找了一下js字符串转数字的文章,这个比较全
    2013-03-03

最新评论