Webpack压缩代码时,drop_console和pure_funcs是否会重复工作?

对于webpack压缩代码的这两个配置drop_console和pure_funcs有什么区别(仅针对下面的代码),如果同时使用会重复吧
我理解第一个已经把所有console给删除了,再配置pure_funcs: ['console.log']这个没有意义了吧,有大佬解答一下吗

compress: {
  drop_console: true,
  pure_funcs: ['console.log']
}

阅读 1.4k
avatarAI BotBETA

drop_consolepure_funcs 在 Webpack 的压缩配置中(通常是配合 UglifyJsPlugin 或 TerserPlugin 使用)确实都用于去除代码中的 console 语句,但它们的工作方式有所不同,而且在某些情况下同时使用可能并不会造成“重复工作”,但它们确实可能有一些重叠的效果。

drop_console

drop_console 是一个简单的选项,当设置为 true 时,它会移除所有的 console 语句,无论其形式如何(例如 console.log, console.error, console.warn 等)。它不需要你明确指定要删除的 console 函数,因为它会删除所有。

pure_funcs

pure_funcs 是一个更灵活的选项,它允许你指定一个或多个函数,这些函数在被调用且其返回值未被使用时,会被视为无副作用的,并因此从压缩后的代码中移除。对于 console.log,这意味着任何单独的 console.log 调用(其返回值未被使用)都会被移除。但是,pure_funcs 不仅仅限于 console.log;你可以添加任何你认为无副作用的函数。

同时使用

drop_consolepure_funcs: ['console.log'] 同时使用时,drop_console 会移除所有的 console 语句,而 pure_funcs 只会移除那些单独的 console.log 调用(其返回值未被使用)。因此,对于 console.log 来说,drop_console 会更加彻底地移除所有相关代码,而 pure_funcs 在这种情况下可能看起来是多余的。

然而,如果你的代码中包含其他类型的 console 语句(如 console.errorconsole.warn),那么 drop_console 仍然会移除它们,而 pure_funcs: ['console.log'] 则不会。另外,如果你在未来决定保留某些 console.log 调用(例如用于调试目的),你可以通过调整 pure_funcs 数组来实现,而不必关闭整个 drop_console 选项。

总结

  • drop_console 会移除所有 console 语句,无论其形式如何。
  • pure_funcs 允许你更精细地控制哪些无副作用的函数调用应该被移除。
  • 当同时使用时,对于 console.log 来说,drop_console 会覆盖 pure_funcs 的效果,但 pure_funcs 可以用于控制其他无副作用的函数调用。
  • 在某些情况下,同时使用这两个选项可能不会造成重复工作,但可能会稍微增加配置的复杂性。如果你只需要移除所有的 console 语句,那么只使用 drop_console 就足够了。
1 个回答

在 Webpack 的 TerserPlugin(通常用于压缩 JavaScript 代码)中,drop_console 和 pure_funcs 是两个与代码压缩和删除相关的选项。不过,这两个选项在处理 console 相关的函数时,有一些细微的差别和用途。

drop_console:

这个选项是 TerserPlugin 的一个简化设置,用于自动删除所有 console 相关的函数调用。当设置为 true 时,它会删除诸如 console.log、console.error 等的所有调用,而不仅仅是 console.log。

pure_funcs:

pure_funcs 是一个数组,其中列出了被认为是“纯函数”的函数名。纯函数是指那些不产生任何副作用(例如修改全局状态或触发网络请求)并且总是返回相同结果的函数。对于这样的函数,如果它们的返回值没有被使用(即它们是“死代码”),那么 TerserPlugin 可以安全地删除这些函数的调用。

当你为 pure_funcs 指定 ['console.log'] 时,你告诉 TerserPlugin console.log 是一个纯函数,如果它的输出没有被使用(例如,没有被赋值给变量或作为其他函数的参数),则可以安全地删除这个调用。但是,请注意,这只会影响 console.log,不会影响其他 console 方法的调用。

两者同时使用会重复吗?

如果你同时设置了 drop_console: true 和 pure_funcs: ['console.log'],那么 drop_console 会删除所有 console 相关的函数调用,而不仅仅是 console.log。同时,pure_funcs 也会尝试删除未使用的 console.log 调用,但在这个上下文中,由于 drop_console 已经删除了所有 console 调用,所以 pure_funcs 的这个特定设置将不会起到任何额外的作用。

但是,如果你有其他纯函数在 pure_funcs 数组中,并且这些函数没有被 drop_console 涵盖,那么 pure_funcs 仍然会起到作用。
总结

如果你只想删除所有 console 相关的函数调用,那么只需设置 drop_console: true。
如果你只想删除未使用的 console.log 调用(并保留其他 console 方法),那么只需设置 pure_funcs: ['console.log'](但请注意,这通常不是一个好的做法,因为其他 console 方法(如 console.error)可能仍然包含有价值的信息)。
如果你既想删除所有 console 相关的函数调用,又想删除其他未使用的纯函数调用,那么可以同时设置这两个选项。但在这种情况下,pure_funcs: ['console.log'] 对于 console.log 的删除是冗余的。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进