Lodash 浓缩
Lodash 是个十分有用的工具库,但我们往往只需要其中的一小部分函数。这时,整个 lodash 库就显得十分庞大,我们需要减小 lodash 的体积。
cherry-pick 方法
Lodash 官方在 npm 上为每个方法维护了独立的包,便于我们直接引用。举个例子,如果我们需要lodash.chunk
方法,可以直接安装lodash.chunk
这个 npm 包,在代码中 import 即可:
1 |
import _chunk from 'lodash.chunk'; |
这样的弊端很明显,我们如果需要使用一个新方法,就要重新 install 一个新包并 require 进来。另外,每个包之间会有一部分重复(公共)方法会被重复打包,也会增大最终的打包体积。更好的解决办法,是直接从 lodash 完整库内导入方法:
1 |
import flatten from 'lodash/flatten'; |
由于 lodash 库中,每个方法都以独立模块封装,这样的引入方法,在 webpack 打包时,只会按需取指定的两个模块进行打包。从flatten 和 flatMap) 的代码可以看出,二者都用到了./.internal/baseFlatten.js
这个模块,在 webpack 打包时,这个模块就变成了公共模块,这就避免了引入两个独立方法的包带来的重复。这种引入方式,官方叫做 “cherry-pick methods”,就像捡樱桃一样,捡自己需要的方法。
babel-plugin-lodash
然而,cherry-pick 方法的书写习惯,和我们平时使用第三方库的书写习惯并不一致。我们更习惯于直接 import 整个库:
1 |
import _ from 'lodash'; |
这时,就是babel-plugin-lodash库发挥作用的时候。在 babel 编译代码时,这个插件可以自动把这种代码
1 |
import _ from 'lodash'; |
转化为
1 |
import _add from 'lodash/fp/add'; |
不过,这里有一些额外限制:必须要引入 babel(6以上版本);必须要使用 ES2015 的方式引入包(即 import 的方式)。
lodash-webpack-plugin
在这一步的基础上,我们还可以使用 lodash-webpack-plugin 进一步减包。它的原理是将我们用到的方法(和间接用到的内部方法)使用更简单的方法替代。具体的方法对应关系,参照源代码中的mapping.js。使用方法也非常简单,只需要在 webpack 配置中引入该 plugin ,即可将所有的 cheery-pick 引入的方法自动进行转换。
需要注意的问题
一般介绍 lodash 打包优化的文章,介绍到这里就算结束了。但是,lodash-webpack-plugin 还有一系列的 feature 配置,它们的作用又是什么?实际上,经过 lodash-webpack-plugin 转化的 lodash 函数,已经和文档中对应的函数不完全等价,因此,如果我们用到了一些特定的特性,我们需要通过调整这些配置,保证我们的代码正常运行。
要关注这些配置的作用,只需要关注mapping.js这个文件,其中配置了features
和overrides
两个变量。features
中每一项对应一个开关,每个开关则对应着若干组替换规则。以cloning
为例,当对应配置关闭(默认即为关闭)时,插件将把内部的_._baseClone
(暂且这样表示)方法替换为_.identity
方法。而overrides
变量中的每一项表示:只要我们引用了对应方法,则打开对应配置开关。
了解了这一点,我们再谈谈这个配置是怎样影响对应方法的。以_.sortBy
方法为例,在它的源代码中(注:由于我们使用 npm 安装,因此需要查看 es 分支的源代码),我们可以看到它使用了四个内部库:
1 |
import baseFlatten from './_baseFlatten.js'; |
在flattening
规则中,内部_baseFlatten
将会被替换为_.head
方法。本来根据_.sortBy
文档,下列代码可以正常运行:
1 |
var users = [ |
经过插件转化后,这种写法将会抛出异常。我们只能使用下列写法:
1 |
_.sortBy(users, [function(o) { return o.user; }]); |
收到类似影响的函数还有_.overArgs
,_.flow
等几个方法。同理,_.get
,_.has
等方法,也会_baseGet
方法被替换受到影响。
要解决这个问题,我们需要校验自己的代码中,有没有用到官方描述的Feature Sets中类似的特性,然后更改自己的代码,或者开启对应的特性配置。一般情况下,开启 flattening 和 paths 配置可以解决大部分问题。
Lodash 浓缩的更多相关文章
- 延迟求值-如何让Lo-Dash再提速x100?
「注释」作者在本文里没有说明这么一个事实: 目前的版本Lo-Dash v2.4.1并没有引入延迟求值的特性,Lo-Dash 3.0.0-pre中部分方法进行了引入,比如filter(),map(),r ...
- 函数式 js 接口实现原理,以及 lodash/fp 模块
函数式 js 接口 之前在 youtube 上看到一个技术视频,讲“underscore.js的接口为什么不好用”,以及什么样的接口更好用.演讲者是 lodash.js 的作者,他提出了一种“全面函数 ...
- lodash
lodash常用函数一 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- lodash 替换 underscore
不少知名项目都在用lodash替换underscore lodash Lazy evaluation 英文原文:http://filimanjaro.com/blog/2014/introducin ...
- JavaScript工具库之Lodash
你还在为JavaScript中的数据转换.匹配.查找等烦恼吗?一堆看似简单的foreach,却冗长无趣,可仍还在不停的repeat it!也许你已经用上了Underscore.js,不错,你已经进步很 ...
- inoic start projectname sidemenu报错 - Error: Cannot find module 'lodash._baseslice'
inoic start projectname sidemenu报错 - Error: Cannot find module 'lodash._baseslice' 在公司的电脑上出现过这个错误,后来 ...
- lodash链式使用
chain var _ = require('lodash'); var user1 = { name: 'zhangsan', height: 180, weight: 120 }; var use ...
- lodash常用方法1--查询
1.find var _ = require('lodash'); var user1 = { name: 'zhangsan', height: 180, weight: 120 }; var us ...
- 高性能的JavaScript库---Lodash
上周在仿做Nodejs社区的时候,遇到了lodash这个javascript库,很惭愧,那也是我第一次听说lodash.人嘛,对于新鲜的事物总是会或多或少感到些好奇的,于是就毫不犹豫地去lodash官 ...
随机推荐
- webservice、WSDL简介
Webservice是跨平台.跨语言的远程调用技术 通信机制的本质是xml数据交换 采用soap协议进行通信 而WSDL 指网络服务描述语言 (Web Services Description Lan ...
- kali 2.0下搭建DVWA环境
DVWA (Dam Vulnerable Web Application)DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序.包含了SQL注入.XSS.盲注等常 ...
- 20145302张薇《Java程序设计》第七周学习总结
20145302 <Java程序设计>第七周学习总结 教材学习内容总结 第十三章 时间的度量 Greenwich Mean Time,格林威治时间,简称GMT时间,由观察太阳而得来: Un ...
- MR案例:Map-Join
适用场景:一张表十分小[key不可重复].一张表非常大. 用法:在Job提交时,首先将小表加载到 DistributedCache 分布式缓存中,然后从DistributeCache中读取小表解析成 ...
- shell小脚本--从laod博客更新hosts文件
#!/bin/bash #-------------------------------------------- # name: change-hosts.sh #----------------- ...
- 2019 google kickstart round A
第一题: n个人,每个人有一个对应的技能值s,现在要从n个人中选出p个人,使得他们的技能值相同. 显然,如果存在p个人的技能值是相同的,输出0就可以了.如果不存在,就要找出p个人,对他们进行训练,治他 ...
- 第五篇:Spark SQL Catalyst源码分析之Optimizer
/** Spark SQL源码分析系列文章*/ 前几篇文章介绍了Spark SQL的Catalyst的核心运行流程.SqlParser,和Analyzer 以及核心类库TreeNode,本文将详细讲解 ...
- HDU 3639 Hawk-and-Chicken(强连通缩点+反向建图)
http://acm.hdu.edu.cn/showproblem.php?pid=3639 题意: 有一群孩子正在玩老鹰抓小鸡,由于想当老鹰的人不少,孩子们通过投票的方式产生,但是投票有这么一条规则 ...
- Python类变量,实例变量,类方法,实例方法,静态方法的分析
Python作为动态语言,跟静态语言如c/c++有很大区别,其中的一个重要的特性就是Python的变量无需声明直接可用.同样,类的成员变量无需声明,直接可用.目的是为了动态语言跟灵活,在思路想到的时候 ...
- C#忽略decimal多余的0
decimal test=1.2000:test.ToString("0.####");