단일 Lodash 함수를 가져 오는 방법?


128

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'


1
아니요, 다른 함수도 가져오고 싶습니다
adang3

2
내 이해로는 이제 하나 또는 모두를 가져올 수 있습니다. package.json에 많은 의존성을 추가하더라도 하나씩 권장 할 것입니다. 한 번에 모든 방법을 수행하는 것보다 하나씩 나중에 테스트하고 업그레이드하는 것이 더 쉬울 것입니다
Boris Charpentier

답변:


205

다음 과 같이 lodash.isequal전체 lodash 패키지 를 설치하지 않고 단일 모듈로 설치할 수 있습니다 .

npm install --save lodash.isequal

ECMAScript 5 및 CommonJS 모듈을 사용하는 경우 다음과 같이 가져옵니다.

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

ES6 모듈을 사용하면 다음과 같습니다.

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 플래그를 지원하고 4.17.7lodash-es 이상이 플래그 (로 설정 됨 false)를 포함하기 때문입니다.

슬래시가있는 버전을 사용하지 않는 이유는 무엇입니까? 이 질문에 대한 다른 답변은 다음과 같이 점 대신 대시를 사용할 수도 있음을 제안합니다.

import isEqual from 'lodash/isequal';

이것도 작동하지만 두 가지 사소한 단점이 있습니다.

  • 작은 별도의 lodash.isequal 패키지 뿐만 아니라 전체 lodash 패키지 ( npm install --save lodash) 를 설치해야합니다 . 저장 공간이 저렴하고 CPU가 빠르기 때문에 신경 쓰지 않을 수도 있습니다.
  • 웹팩과 같은 도구를 사용할 때 생성되는 번들은 약간 더 커집니다. 최소한의 코드 예제가 포함 된 번들 크기가 isEqual평균 28 % 더 큽니다 (웹팩 2 및 웹팩 3, Babel 유무, Uglify 유무에 관계 없음).

어떤 이유로 나를 위해 작동하지 않습니다, 나는 _ is not defined사용할 때 얻고 있습니다_.isEquals
adang3

9
@cvDv, 그러나처럼 사용 안되어 _.isEqual직접 사용한다isEqual
때로 믿을 호프 세 피안

1
실제로 모듈을 설치 했습니까? NPM 내가 lodash.isequal --save
패트릭 개자리

1
이 대답은 투표까지 많이 얻을 수 있기 때문에 @thund (lodash 워드 프로세서 권장), 나는 점을 사용하는 경우 번들 크기를 비교하는 시간을 촬영했습니다 슬래시, 내 편집 대답을 참조
패트릭 개자리

1
@PatrickHund : 매우 흥미 롭습니다. 나는 개발 머신에서 전체 lodash를 갖는 오버 헤드가 매우 사소하다는 데 동의합니다. 특히 npm --save lodash.whatever각 기능을 별도로 실행할 필요가 없기 때문에 특히 더 큰 번들 크기는 확실히 period 방법을 사용할 가치가 있습니다. 차이가 있다는 것에 놀랐습니다. 그래서 우리를 위해 수치를 조사해 주셔서 기쁩니다.
thund

64

isEqual나머지 lodash함수 는 포함 하지 않고 포함 하고 싶다면 (번들 크기를 작게 유지하는 데 유용) ES6에서이를 수행 할 수 있습니다.

import isEqual from 'lodash/isEqual'

이것은 구문 을 사용한다는 점을 제외 하면 lodashREADME에 설명 된 것과 거의 동일 require()합니다.

var at = require('lodash/at');

29

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과 함께 트리 흔들림 도 가능합니다 .


1
우수, 나는 😀 당신과 함께 괜찮아 내 대답에이 정보, 희망 추가
패트릭 개자리

대박. 이것은 webpack을 사용하여 내 번들 크기를 78kb에서 18kb로 줄일 수 있습니다.
fsevenm

6

webpack과 관련이 없지만 많은 사람들이 현재 typescript로 이동하고 있으므로 여기에 추가하겠습니다.

import isEqual from 'lodash/isEqual';in typescript를 사용하여 lodash에서 단일 함수를 가져올 수도 있습니다 .esModuleInterop컴파일러 옵션 (tsconfig.json) 플래그 있습니다.

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es5",
    "lib": ["es6", "dom"],
    "moduleResolution": "node",
    "esModuleInterop": true,
    ...
  }
}

1

Lodash는 README 에 몇 가지 옵션을 나열합니다 .

  • babel-plugin-lodash

    • lodash 및 babel 플러그인을 설치합니다.
    $ 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)
  • lodash-webpack-plugin

    • lodash 및 webpack 플러그인을 설치합니다.
    $ 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 ./

0

이것은 실제로 나를 위해 일했습니다.

import { isEqual } from 'lodash';

24
이 구문을 사용하면 여전히 전체 lodash 라이브러리를 얻을 수 있습니다. OP는 isEqual 기능 만 가져 와서 번들의 크기를 줄이려고합니다.
Nyegaard

이것은 모든 lib를 가져온 다음 현재 범위로 하나의 함수를 추출합니다.
Lukas Liesis 2018

0

import { isEqual } from 'lodash-es';전체 라이브러리를 가져 오는 중입니다. 기본적으로 트리 쉐이킹을 수행해야하는 Rollup을 사용하고 있습니다.

내 자신의 모듈을 작성할 때마다이 명명 된 가져 오기 구문이 작동하고 Rollup이 성공적으로 트리 흔들기 때문에 Lodash에서 작동하지 않는 이유에 대해 약간 혼란 스럽습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.