如何在支持树摇动的同时使用`lodash-es`链?

时间:2017-08-02 13:25:58

标签: javascript method-chaining lodash

众所周知,lodash-es是使用更加模块化的语法构建的,用于通过构建工具支持树抖动。

但是,chain相关功能意味着某些功能附加到对象/原型链。

我可以看到chainlodash-es一起发布,但我不确定如何使用其他链式方法进行正确导入。

用例可能如下所示:

import { chain } from 'lodash-es'

export function double(input) {
    return chain(input)
        .without(null)
        .map(val => val * 2)
        .value()
        .join(', ')
}

编辑#1:

重点不在于如何导入chain,而在于如何导入其他chained个功能

2 个答案:

答案 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中所需的任何依赖项。