使用 webpack,我试图导入isEqual,因为lodash
似乎正在导入所有内容。我尝试执行以下操作但没有成功:
import { isEqual } from 'lodash'
import isEqual from 'lodash/lang'
import isEqual from 'lodash/lang/isEqual'
import { isEqual } from 'lodash/lang'
import { isEqual } from 'lodash/lang'
使用 webpack,我试图导入isEqual,因为lodash
似乎正在导入所有内容。我尝试执行以下操作但没有成功:
import { isEqual } from 'lodash'
import isEqual from 'lodash/lang'
import isEqual from 'lodash/lang/isEqual'
import { isEqual } from 'lodash/lang'
import { isEqual } from 'lodash/lang'
您可以lodash.isequal
作为单个module安装,而无需安装整个lodash包,如下所示:
npm install --save lodash.isequal
当使用 ECMAScript 5 和 CommonJS module时,你可以像这样导入它:
var isEqual = require('lodash.isequal');
使用 ES6 module,这将是:
import isEqual from 'lodash.isequal';
您可以在代码中使用它:
const obj1 = {username: 'peter'};
const obj2 = {username: 'peter'};
const obj3 = {username: 'gregory'};
isEqual(obj1, obj2) // returns true
isEqual(obj1, obj3) // returns false
来源:Lodash 文档
导入后,您可以isEqual
在代码中使用该函数。请注意,_
如果您以这种方式导入它,则它不是命名对象的一部分,因此您
不使用引用它_.isEqual
,而是直接使用isEqual
.
替代方案:使用 lodash-es
正如@kimamula所指出的:
使用 webpack 4 和lodash-es 4.17.7 及更高版本,此代码有效。
import { isEqual } from 'lodash-es';
这是因为 webpack 4 支持sideEffects标志并且lodash-es
4.17.7 及更高版本包含该标志(设置为false
)。
为什么不使用带斜杠的版本? 这个问题的其他答案建议您也可以使用破折号代替点,如下所示:
import isEqual from 'lodash/isequal';
这也有效,但有两个小缺点:
npm install --save lodash
),而不仅仅是单独的lodash.isequal包;存储空间便宜,CPU 速度快,所以你可能不关心这个isEqual
平均大 28%(尝试了 webpack 2 和 webpack 3,有或没有 Babel,有或没有 Uglify)如果您只想包含isEqual
而不是其他lodash
功能(对于保持包的大小非常有用),您可以在 ES6 中执行此操作;
import isEqual from 'lodash/isEqual'
这与lodash
README 中描述的几乎相同,除了它们使用require()
语法。
var at = require('lodash/at');
使用 webpack 4 和 lodash-es 4.17.7 及更高版本,此代码有效。
import { isEqual } from 'lodash-es';
这是因为 webpack 4 支持sideEffects
标志和 lodash-es 4.17.7 及更高版本包括标志(设置为false
)。
编辑
从 1.9.0 版本开始,Parcel 也支持"sideEffects": false
,因此import { isEqual } from 'lodash-es';
也可以使用 Parcel 进行 tree shakable。
与 webpack 无关,但我会在这里添加它,因为很多人目前正在转向typescript。
您还可以import isEqual from 'lodash/isEqual';
在typescript中使用带有esModuleInterop
编译器选项 (tsconfig.json) 中的标志的lodash 导入单个函数
例子
{
"compilerOptions": {
"module": "commonjs",
"target": "es5",
"lib": ["es6", "dom"],
"moduleResolution": "node",
"esModuleInterop": true,
...
}
}
Lodash 在他们的README 中列出了几个选项:
$ npm i --save lodash
$ npm i --save-dev babel-plugin-lodash @babel/cli @babel/preset-env
.babelrc
{
"plugins": ["lodash"],
"presets": [["@babel/env", { "targets": { "node": 6 } }]]
}
import _ from 'lodash'
import { add } from 'lodash/fp'
const addOne = add(1)
_.map([1, 2, 3], addOne)
大致是这样的:
import _add from 'lodash/fp/add'
import _map from 'lodash/map'
const addOne = _add(1)
_map([1, 2, 3], addOne)
$ npm i --save lodash
$ npm i --save-dev lodash-webpack-plugin babel-core babel-loader babel-plugin-lodash babel-preset-env webpack
webpack.config.js
:var LodashModuleReplacementPlugin = require('lodash-webpack-plugin');
var webpack = require('webpack');
module.exports = {
'module': {
'rules': [{
'use': 'babel-loader',
'test': /\.js$/,
'exclude': /node_modules/,
'options': {
'plugins': ['lodash'],
'presets': [['env', { 'modules': false, 'targets': { 'node': 4 } }]]
}
}]
},
'plugins': [
new LodashModuleReplacementPlugin,
new webpack.optimize.UglifyJsPlugin
]
};
使用 lodash cli 的lodash-es
$ lodash modularize exports=es -o ./