Search code examples
javascriptlodash

How to Import a Single Lodash Function?


Using webpack, I'm trying to import isEqual since lodash seems to be importing everything. I've tried doing the following with no success:

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'

Solution

  • You can install lodash.isequal as a single module without installing the whole lodash package like so:

    npm install --save lodash.isequal
    

    When using ECMAScript 5 and CommonJS modules, you then import it like this:

    var isEqual = require('lodash.isequal');
    

    Using ES6 modules, this would be:

    import isEqual from 'lodash.isequal';
    

    And you can use it in your code:

    const obj1 = {username: 'peter'};
    const obj2 = {username: 'peter'};
    const obj3 = {username: 'gregory'};
    
    isEqual(obj1, obj2) // returns true
    isEqual(obj1, obj3) // returns false
    

    Source: Lodash documentation

    After importing, you can use the isEqual function in your code. Note that it is not a part of an object named _ if you import it this way, so you don't reference it with _.isEqual, but directly with isEqual.

    Alternative: Using lodash-es

    As pointed out by @kimamula:

    With webpack 4 and lodash-es 4.17.7 and higher, this code works.

    import { isEqual } from 'lodash-es';
    

    This is because webpack 4 supports the sideEffects flag and lodash-es 4.17.7 and higher includes the flag (which is set to false).

    Why Not Use the Version With the Slash? Other answers to this question suggest that you can also use a dash instead of a dot, like so:

    import isEqual from 'lodash/isequal';
    

    This works, too, but there are two minor drawbacks:

    • You have to install the whole lodash package (npm install --save lodash), not just the small separate lodash.isequal package; storage space is cheap and CPUs are fast, so you may not care about this
    • The resulting bundle when using tools like webpack will be slightly bigger; I found out that bundle sizes with a minimal code example of isEqual are on average 28% bigger (tried webpack 2 and webpack 3, with or without Babel, with or without Uglify)