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.