导入单个lodash函数而不是整个lodash项目

Ale*_*lls 6 node.js npm underscore.js lodash npm-install

我看到导入整个lodash库会占用磁盘上相当多的空间:

$ du . | grep lodash
1696    ./lodash/fp
5000    ./lodash
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我只是在做

require('lodash');
Run Code Online (Sandbox Code Playgroud)

和我的package.json看起来像:

"dependencies": {
   ...
   "lodash": "^4.6.1",
   ...
}
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于后端项目,而不适用于Web,如果这会产生影响.

所以我的问题是 - 在没有导入整个该死的东西的情况下,导入一片lodash(只是我需要的功能)的最新方法是什么?

看起来这里有一些答案:

https://gist.github.com/callumlocke/bbfc524eaed6b3556dab

我的猜测是我应该在我的后端项目中使用点语法:

"dependencies": {
   ...
   "lodash.X": "^4.6.1",
   ...
}
Run Code Online (Sandbox Code Playgroud)

然后像这样导入它:

 require('lodash.X');
Run Code Online (Sandbox Code Playgroud)

rsp*_*rsp 12

两种方式

有两种方法可以做到:

  1. 您可以使用具有各个功能的包,例如 require('lodash.head')
  2. 您可以使用完整的包装,例如 require('lodash/head')

require('lodash.head')

您安装具有单独功能的包:

npm install --save lodash.head
Run Code Online (Sandbox Code Playgroud)

这将此添加到package.json:

"dependencies": {
  "lodash.head": "^4.0.1"
}
Run Code Online (Sandbox Code Playgroud)

你用它:

var head = require('lodash.head');
Run Code Online (Sandbox Code Playgroud)

require('lodash/head')

您安装完整的lodash包:

npm install --save lodash
Run Code Online (Sandbox Code Playgroud)

这将此添加到package.json:

"dependencies": {
  "lodash": "^4.17.4"
}
Run Code Online (Sandbox Code Playgroud)

你用它:

var head = require('lodash/head');
Run Code Online (Sandbox Code Playgroud)

更多例子

更复杂的例子:

您可以_使用所需的两个功能:

var head = require('lodash.head');
var tail = require('lodash.tail');
var _ = {pick, defaults};
Run Code Online (Sandbox Code Playgroud)

效果相似,风格各异:

var _ = {
  head: require('lodash.head'),
  tail: require('lodash.tail'),
};
Run Code Online (Sandbox Code Playgroud)

说明

如果你只想要lodash的一部分,比如lodash.pick那么使用:

有关打包为模块的单个函数的更多示例,请参阅:

您还可以使用自定义构建,请参阅:

当您使用完整包并仅导入所需的功能时:

var _ = {
  head: require('lodash/head'),
  tail: require('lodash/tail'),
};
Run Code Online (Sandbox Code Playgroud)

然后像Webpack这样的工具可以优化你的构建,只包含你实际使用的代码.当您导入整个lodash时:

var _ = require('lodash');
Run Code Online (Sandbox Code Playgroud)

然后静态分析无法确定在运行时将使用哪个函数,因此很难很好地进行优化,并且通常构建中包含的代码比实际需要的多.

  • 个别方法包将在 lodash v5 中删除。请参阅 https://lodash.com/per-method-packages (2认同)

Fel*_*ger 5

使用 ES6 模块,也可以这样完成:

import isEqual from 'lodash.isequal';
Run Code Online (Sandbox Code Playgroud)

参考