Webpack 如果我使用uglify,以模块化方式使用lodash有什么好处吗?

Webpack 如果我使用uglify,以模块化方式使用lodash有什么好处吗?,webpack,browserify,lodash,uglifyjs,Webpack,Browserify,Lodash,Uglifyjs,在对的评论中,lodash作者建议在lodash中使用“樱桃采摘”方法(即,要求ing单个方法而不是整个lodash包)或使用。但是,如果在捆绑过程中使用死代码消除程序(如uglify或闭包编译器)作为捆绑过程的一部分(使用browserify或webpack),这难道不是不必要的吗?如果您使用的是CommonJS样式require('lodash'),uglify不会消除死代码(我认为闭包编译器也不能) 但是,如果您使用的是ES6样式的import{merge,reduce}from'loda

在对的评论中,lodash作者建议在lodash中使用“樱桃采摘”方法(即,
要求
ing单个方法而不是整个lodash包)或使用。但是,如果在捆绑过程中使用死代码消除程序(如uglify或闭包编译器)作为捆绑过程的一部分(使用browserify或webpack),这难道不是不必要的吗?

如果您使用的是CommonJS样式
require('lodash')
,uglify不会消除死代码(我认为闭包编译器也不能)

但是,如果您使用的是ES6样式的
import{merge,reduce}from'lodash'
(例如),您将能够利用Webpack2的树抖动功能(其他一些捆绑包也支持它)。由于ES6模块系统具有静态结构,绑定器可以执行静态分析,确定库的某些部分未被使用,并消除它们

有关Webpack2树摇的更多信息,请查看


截至撰写此答案(2016年3月3日),Webpack2仍处于测试阶段,因此可能存在一些问题,但如果您想尝试,请尝试一下

谁告诉你webpack会删除未使用的lodash功能的?谢谢。我想我误解了,但我有点惊讶。我对客户端JavaScript非常陌生。如果我不能依靠某种死代码消除,那就太可怕了。这意味着,如果我只使用了有用的库的一小部分,我将不得不避免使用它们,如果我想使用“通用”JavaScript,我必须非常小心,不要在客户机上引入服务器代码。真正地另外,我认为我是否使用ES6语法也无关紧要,因为webpack静态分析CommonJS导入。哇!使用CommonJS样式导入进行静态分析的困难在于CommonJS样式导入允许动态
require()
。我的意思是你可以做一些事情,比如
var prefix=“./test”;var num=数学地板(数学随机(10)*10);var模块=需要(前缀+num)。您无法可靠地确定加载了什么。因此,不可能确定死代码。而在ES6模块导入中,这种动态加载是不允许的。例如,您不能从“/test”+num这就是我所说的ES6模块系统具有静态结构的意思。我明白了,但Webpack已经使用启发式静态分析require语句了,对吗?如果您使用字符串文本和其他一些简单模式(如“concat in require”(参见)调用require,它就会理解。如果您以高度动态的方式使用require,那么Webpack和任何其他工具都不可能知道要捆绑什么。另一方面,如果Webpack能够找出要捆绑的内容,那么即使使用CommonJS语法,如果ES6语法可以的话,我也会认为它可以消除死代码。但是我需要更多的学习!此外,这篇博文让我想知道,我是否已经可以通过Webpack1和uglify消除某种死代码,但树抖动更能消除那些死代码,但uglify会忽略的东西:我将给你一个简单的例子,告诉你为什么ES6语法可以树抖动,为什么CommonJS语法不能。因为很难在注释中显示代码,所以我创建了一个JSBin。顺便说一句,请注意并非所有ES6导入都可以进行树抖动。有关更多注释,请参见JSBin。