众所周知,lodash-es
是使用更加模块化的语法构建的,用于通过构建工具支持树抖动。
但是,chain
相关功能意味着某些功能附加到对象/原型链。
我可以看到chain
与lodash-es
一起发布,但我不确定如何使用其他链式方法进行正确导入。
用例可能如下所示:
import { chain } from 'lodash-es'
export function double(input) {
return chain(input)
.without(null)
.map(val => val * 2)
.value()
.join(', ')
}
重点不在于如何导入chain
,而在于如何导入其他chained
个功能。
答案 0 :(得分:3)
你不能,chain
需要捆绑所有(或大多数)lodash的功能。
但您可以使用flow
。以下是转换此内容的示例:
import _ from "lodash";
_.chain([1, 2, 3])
.map(x => [x, x*2])
.flatten()
.sort()
.value();
进入这个:
import map from "lodash/fp/map";
import flatten from "lodash/fp/flatten";
import sortBy from "lodash/fp/sortBy";
import flow from "lodash/fp/flow";
flow(
map(x => [x, x*2]),
flatten,
sortBy(x => x)
)([1,2,3]);
此示例(及更多)来自this article。
答案 1 :(得分:0)
在chain.js
中,您会看到第一行是
import lodash from './wrapperLodash.js';
If we go to that file,我们会找到一个很长的解释,说明如何使用延迟评估来实现链接,这可以快速迭代迭代,直到调用value()
。下面是一个导出的辅助函数,定义如下:
function lodash(value) {
if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
if (value instanceof LodashWrapper) {
return value;
}
if (hasOwnProperty.call(value, '__wrapped__')) {
return wrapperClone(value);
}
}
return new LodashWrapper(value);
}
回到chain.js
,我们会在chain()
函数中看到它是如何使用的:
function chain(value) {
var result = lodash(value);
result.__chain__ = true;
return result;
}
基本上,chain()
检查输入以确保它不是已包装的值,如果是,则返回值,如果它是正确类的实例,或者它返回一个新的包装值。
此实现中没有任何方法附加到任何本机原型链,但它确实创建了一个名为LodashWrapper
的新类,它使用lodash
功能和惰性评估优化来包装输入对象。
我认为应用树木抖动的正确import
语句将是
import chain from 'lodash-es/chain'
这会将相同的模块导入与问题中使用的import
语句相同的变量,但区别在于运行import { chain } from 'lodash-es'
评估all of the imports in lodash.js
,而我的import
方法只触及chain.js
文件以及wrapperLodash.js
中所需的任何依赖项。