lodash를 가져 오는 올바른 방법


185

lodash를 가져 오는 올바른 방법이 무엇인지 궁금한데 아래에서 요청에 대한 피드백을 받았습니다.

가져 오기를 'lodash / has'에서 수행하는 것이 좋습니다 .. 이전 버전의 lodash (v3) 자체만으로는 무겁기 때문에 전체 lodash 라이브러리를 가져 오는 대신 특정 모듈 / 함수 만 가져와야합니다. 최신 버전 (v4)에 대해 확실하지 않습니다.

import has from 'lodash/has';

vs

import { has } from 'lodash';

감사


4
웹팩과 같은 일부 환경에서 후자가 여전히 성능 최적화를 수행 할 수있는 이유에 대한 자세한 설명은 이 답변 을 참조하십시오 . 정적 분석 및 트리 쉐이킹을 사용하기 때문입니다.
— 패트릭 로버츠

답변:


244

import has from 'lodash/has';lodash는 모든 기능을 단일 파일로 보유하기 때문에 더 좋습니다. 따라서 전체 'lodash'라이브러리를 100k로 가져 오는 것이 아니라 lodash의 has함수 인 2k를 가져 오는 것이 좋습니다 .


1
@GeorgeKatsanos 당신은 당신이 사용하고자하는 함수를 가져 오기만하면됩니다, 당신은 '_'를 필요로하지 않습니다
— Bill

5
@GeorgeKatsanos 'lodash/has'는 별도의 패키지가 아닙니다. has.js일반 'lodash'패키지 의 루트에 파일이 있고 import has from 'lodash/has'(또는 const has = require ('lodash/has) 해당 파일을로드합니다. 가 있습니다 NPM에 별도의 방법 패키지는, 그러나 그들은 "도트 구문"을 사용합니다 'lodash.has'. 이것은 사용 하는 모든 방법에 대해 별도의 패키지를 설치하지 않고 잠재적 package.json으로 결과물을 만들지 않는 경우에도 유효한 방법 입니다.
— daemonexmachina

80
여기에 webpack 2 또는 롤업 (나무 흔들림을 지원하는 번 들러)을 사용하는 경우 import { has } from 'lodash'나머지 부분이 제거되므로 동일한 방식으로 작동합니다.
— Alex JM

1
@PDN 웹팩 2 트리 쉐이킹이 자동으로해야합니다
— Bill

23
다른 트리와는 달리 내 나무 흔들림은 더 명확한 구문으로 작동하지 않습니다. lodash-es로 전환 한 후 import has from 'lodash-es/has'구문을 사용하여 전체 나무 흔들림을 얻었습니다. 참조 184킬로바이트에 526킬로바이트에서 갔다 stackoverflow.com/questions/41991178/...
— 브랜든 소렌 Culley

86

를 사용하는 경우 webpack 4다음 코드는 나무를 흔 듭니다.

import { has } from 'lodash-es';

주목할 점;

  1. CommonJS 모듈은 나무를 흔드는 것이 아니므로 반드시 (CommonJS)가 lodash-es아닌 ES 모듈로 내 보낸 Lodash 라이브러리 인을 사용해야합니다 lodash.

  2. lodash-es의 package.json contains "sideEffects": false는 패키지 내의 모든 파일에 부작용이 없음을 webpack 4에 알립니다 ( https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side 참조). 효과가 없습니다 ).

  3. 이 정보는 모듈 번 들러가 내 보낸 멤버를 어디에서나 사용하지 않더라도 부작용이있을 수있는 파일을 트리 쉐이크하지 않기 때문에 트리 쉐이킹에 중요합니다.

편집하다

버전 1.9.0부터 Parcel은"sideEffects": false 또한를 지원하므로 Parcel로import { has } from 'lodash-es'; 트리를 흔드는 것도 가능합니다 . 이 ES 모듈의 흔들림 가능성이 나무가에 따라 CommonJS보다 더 효율적입니다하지만 그것은 또한, 나무 흔들어 CommonJS 모듈을 지원 내 실험 .


모든 lodash 가져 오기를 import { ... } from 'lodash-es'; 내 번들 로 변환했는데 여전히 전체 라이브러리가 포함되어 있습니다.
— Isaac Pak

@IsaacPak ES 모듈을 CommonJS로 변환하고 있지 않은지 확인하십시오. 당신이 타이프 라이터를 사용하는 경우, 당신은 설정해야합니다 --module같은 컴파일러 옵션 es6, es2015또는 esnext.
— kimamula

TypeScript를 사용하지 않고 .babelrc env 사전 설정이 modules: falseCommonJS로 변환되지 않도록 설정되어 있습니다. 나는 지금 Bruce의 솔루션을 사용하고 있습니다. 당신의 공헌에 감사드립니다, 나는 그것이 작동한다고 확신하지만, 단지 그것을위한 설정이 없습니다.
— Isaac Pak

불행히도이 시점에서 jest와 함께 lodash-es를 사용할 수 없습니다 : github.com/facebook/jest/issues/4842#issuecomment-491434065
— apollo

1
import has from 'lodash-es/has'그리고 import {has} from 'lodash-es'사용하는 경우 모두 변형 treeshaking 않습니다webpack-4
— 전설

9

중괄호 안에 특정 메소드 가져 오기

import { map, tail, times, uniq } from 'lodash';

장점 :

  • 하나의 가져 오기 라인 만 (정확한 기능을 위해)
  • 더 읽기 쉬운 사용법 : 나중에 자바 스크립트 코드에서 _.map () 대신 map ().

단점 :

  • 새로운 기능을 사용하거나 다른 기능을 사용하지 않으려 고 할 때마다 유지 관리해야합니다.

유용한 답변에 감사드립니다. 그러나 _.map()외부 라이브러리가 사용되고 있다는 구문이 명확합니다. 가 import _ from 'lodash'귀하의 제안으로 동등하게 효율적인 또는 구문을 사용 할 수있는 또 다른 방법은 무엇입니까?
— Toivo Säwén

1
@ ToivoSäwén 나는 명시 적 _.map()구문도 완전히 동의하고 선호합니다 . es6 가져 오기 및 트리 쉐이킹을 수행하면서이를 유지하는 방법을 알아낼 수 있었습니까?
— 라즈

4

babel을 사용하는 경우 babel-plugin-lodash를 확인해야합니다. 대신 사용하는 lodash 부분, 번거 로움이 적고 번들이 적습니다.

몇 가지 제한 사항이 있습니다 .

  • Lodash를로드하려면 ES2015 가져 오기를 사용해야합니다
  • Babel <6 & Node.js <4는 지원되지 않습니다
  • 체인 시퀀스는 지원되지 않습니다. 대안 은이 블로그 게시물 을 참조하십시오 .
  • 모듈화 된 메소드 패키지 는 지원되지 않습니다

4

당신은 그들을 가져올 수 있습니다

import {concat, filter, orderBy} from 'lodash';

또는

import concat from 'lodash/concat';
import orderBy from 'lodash/orderBy';
import filter from 'lodash/filter';

두 번째 모듈은 필요한 모듈 만로드하므로 첫 번째 모듈보다 훨씬 최적화됩니다

다음과 같이 사용하십시오

pendingArray: concat(
                    orderBy(
                        filter(payload, obj => obj.flag),
                        ['flag'],
                        ['desc'],
                    ),
                    filter(payload, obj => !obj.flag),

1

버전에서 Lodash 가져 오기 4.17.15

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