【问题标题】:How to prevent UglifyJS from dropping an unused function when processed by WebPack?如何防止 UglifyJS 在 WebPack 处理时丢弃未使用的函数?
【发布时间】:2017-09-14 14:18:03
【问题描述】:

我有一个相当小的脚本来控制模态框内的轮播。要启动模式,我有一个简单的showModal() 函数,当点击页面上的图像时会调用该函数。 但是,当 WebPack 处理 JS 文件时,此功能会被 UglifyJS 剥离。这是代码的简化大纲:

$('#iconified').on('keyup', function() {
var input = $(this);
input.addClass('empty');
});

var carouselVideoPlayer = (function() {
var initialized = false;
var videoCarousel;

function initCarousel() {
    videoCarousel.carousel({
        interval: false
    });
}

return {
    init: function() {
        initCarousel();
        initialized = true;
    }
  };
})();

function showModal(slideNumber) {
  $('#myModal0').modal('show');
  carouselVideoPlayer.showSlide(slideNumber);
}

jQuery(document).ready(function($) {
  var thumbnails = [];
  for (var i = 0; i < 4; i++) {
    thumbnails.push($('#carousel-selector-' + i));
  }
  carouselVideoPlayer.init();
});

我尝试使用带有 showModal 保留的 mangle 选项,并尝试在函数前面使用 /*@__PURE__*/ 注释。没有对这个函数进行虚拟调用,我只想将它标记为需要或忽略,这样 UglifyJS 不会将其删除,并且似乎找不到简单的方法来执行此操作。

更新 虽然不是我所希望的,但以下内容将阻止 UglifyJS 剥离该功能。 向showModal() 添加了一个if 语句,并在我的初始化方法中调用它,传入-1。

function showModal(slideNumber) {
  if (slideNumber !== -1) {
    $('#myModal0').modal('show');
    carouselVideoPlayer.showSlide(slideNumber);
  }
}

【问题讨论】:

  • 添加了一个虚拟调用,但我觉得应该有更好的方法。

标签: webpack minify uglifyjs


【解决方案1】:

我不熟悉如何配置 Web Pack,但将未使用标志设置为 false 作为 Uglify 压缩选项的一部分可能会解决此问题。

在此处查看压缩选项文档: https://github.com/mishoo/UglifyJS2#compress-options

您的解决方法将函数转换为正在使用的函数,因此在您进行上述更改后它不会被删除。

【讨论】:

  • 这可能行得通。我最终重构了整个事情以检查主 JS 代码。不过感谢您的建议!
  • 如果有人尝试过并且有效,请投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多