Cách chính xác để nhập lodash


185

Tôi đã có một phản hồi yêu cầu kéo bên dưới, chỉ tự hỏi cách nào là cách chính xác để nhập lodash?

Tốt hơn hết là bạn nên nhập từ 'lodash / has' .. Đối với phiên bản trước đó của lodash (v3), bản thân nó khá nặng, chúng ta chỉ nên nhập một mô-đun / chức năng cụ thể thay vì nhập toàn bộ thư viện lodash. Không chắc chắn về phiên bản mới hơn (v4).

import has from 'lodash/has';

đấu với

import { has } from 'lodash';

Cảm ơn


4
Xem câu trả lời này để thảo luận sâu hơn về lý do tại sao cái sau vẫn có thể phát sinh tối ưu hóa hiệu suất trong một số môi trường như Webpack. Đó là do sử dụng phân tích tĩnh và rung cây.
Patrick Roberts

Câu trả lời:


244

import has from 'lodash/has';sẽ tốt hơn vì lodash giữ tất cả các chức năng của nó trong một tệp, vì vậy thay vì nhập toàn bộ thư viện 'lodash' với giá 100k, tốt hơn là chỉ nhập hàm của lodash hascó thể là 2k.


1
@GeorgeKatsanos bạn chỉ cần nhập chức năng bạn muốn sử dụng, bạn không cần '_'
Bill Bill

5
@GeorgeKatsanos 'lodash/has'không phải là một gói riêng biệt. Có một tệp được gọi has.jstrong thư mục gốc của 'lodash'gói thông thường và import has from 'lodash/has'(hoặc const has = require ('lodash/has) sẽ tải tệp đó. Có gói phương pháp riêng về NPM, nhưng họ sử dụng "chấm cú pháp": 'lodash.has'. Đây cũng sẽ là một cách hợp lệ để thực hiện nếu bạn không cài đặt một gói riêng cho mọi phương pháp bạn sử dụng (và có khả năng làm cho package.jsonkhối lượng lớn của bạn là kết quả).
daemonexmachina

80
Tôi phải nói thêm ở đây rằng, nếu bạn sử dụng webpack 2 hoặc rollup (một gói hỗ trợ rung cây), thì import { has } from 'lodash'sẽ hoạt động theo cách tương tự, vì phần còn lại sẽ bị loại bỏ
Alex JM

1
@PDN webpack 2 cây rung sẽ tự động làm điều đó cho bạn
Bill

23
Không giống như một số người khác, cây rung của tôi sẽ không hoạt động với cú pháp rõ ràng hơn, chỉ sau khi tôi chuyển sang lodash-es và sử dụng import has from 'lodash-es/has'cú pháp tôi mới có được cây rung hoàn toàn. đã đi từ 526KB đến 184KB, xem stackoverflow.com/questions/41991178/NH
Brandon Søren Culley

86

Nếu bạn đang sử dụng webpack 4, mã sau đây là cây có thể lắc.

import { has } from 'lodash-es';

Những điểm cần lưu ý;

  1. Các mô-đun CommonJS không thể lay chuyển được cây, vì vậy bạn chắc chắn nên sử dụng lodash-es, đó là thư viện Lodash được xuất dưới dạng Mô-đun ES, thay vì lodash(CommonJS).

  2. lodash-esGói.json chứa "sideEffects": false, thông báo cho webpack 4 rằng tất cả các tệp bên trong gói đều không có tác dụng phụ (xem https://webpack.js.org/guides/tree-shaking/#mark-the-file-as-side -Không hiệu quả ).

  3. Thông tin này rất quan trọng đối với rung cây vì các bộ đóng gói mô-đun không tạo các tệp lắc cây có thể chứa các tác dụng phụ ngay cả khi các thành viên xuất khẩu của chúng không được sử dụng ở bất cứ đâu.

Biên tập

Kể từ phiên bản 1.9.0, Parcel cũng hỗ trợ"sideEffects": false , threrefor import { has } from 'lodash-es';cũng có thể chuyển đổi được với Parcel. Nó cũng hỗ trợ rung cây mô-đun CommonJS, mặc dù có khả năng rung cây của Mô-đun ES hiệu quả hơn so với CommonJS theo thí nghiệm của tôi .


Tôi đã chuyển đổi tất cả các bản nhập lodash của mình sang import { ... } from 'lodash-es'; Gói của tôi vẫn bao gồm toàn bộ thư viện.
Isaac Pak

@IsaacPak Đảm bảo rằng bạn không chuyển các mô-đun ES sang CommonJS. Nếu bạn đang sử dụng TypeScript, bạn phải đặt --moduletùy chọn trình biên dịch là es6, es2015hoặc esnext.
kimamula

Tôi không sử dụng TypeScript và cài đặt trước .babelrc env của tôi được đặt thành để modules: falsechúng không được dịch sang CommonJS. Tôi đang sử dụng giải pháp của Bruce bây giờ có vẻ hiệu quả. Cảm ơn sự đóng góp của bạn, tôi chắc chắn rằng nó hoạt động nhưng tôi không có thiết lập cho nó.
Isaac Pak

thật không may, không thể sử dụng lodash-es với jest vào thời điểm này: github.com/facebook/jest/issues/4842#issuecomment-491434065
apoche

1
import has from 'lodash-es/has'import {has} from 'lodash-es'cả hai biến thể đều thực hiện treeshaking khi sử dụngwebpack-4
Huyền thoại

9

Nhập các phương thức cụ thể bên trong dấu ngoặc nhọn

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

Ưu điểm:

  • Chỉ có một dòng nhập khẩu (cho một số lượng lớn các chức năng)
  • Cách sử dụng dễ đọc hơn: map () thay vì _.map () sau trong mã javascript.

Nhược điểm:

  • Mỗi khi chúng tôi muốn sử dụng một chức năng mới hoặc ngừng sử dụng một chức năng khác - nó cần được duy trì và quản lý

Cảm ơn câu trả lời hữu ích. Tuy nhiên, tôi thích _.map()cú pháp rõ ràng rằng một thư viện bên ngoài đang được sử dụng. Là import _ from 'lodash'hiệu quả tương tự như đề xuất của bạn hoặc có một cách khác để có thể sử dụng cú pháp này?
Toivo Säwén

1
@ ToivoSäwén Tôi hoàn toàn đồng ý và thích _.map()cú pháp rõ ràng là tốt. Bạn có thể tìm ra cách duy trì điều đó trong khi thực hiện nhập khẩu es6 và lắc cây không?
Raj

4

Nếu bạn đang sử dụng babel, bạn nên kiểm tra babel-plugin-lodash , nó sẽ chọn các phần của lodash bạn đang sử dụng cho bạn, ít rắc rối hơn và một gói nhỏ hơn.

Nó có một vài hạn chế :

  • Bạn phải sử dụng nhập khẩu ES2015 để tải Lodash
  • Babel <6 & Node.js <4 không được hỗ trợ
  • Chuỗi chuỗi không được hỗ trợ. Xem bài đăng blog này để thay thế.
  • Gói phương thức mô đun hóa không được hỗ trợ

4

Bạn có thể nhập chúng dưới dạng

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

hoặc như

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

cái thứ hai được tối ưu hóa hơn cái thứ nhất vì nó chỉ tải các mô-đun cần thiết

sau đó sử dụng như thế này

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

1

Nhập khẩu Lodash trong phiên bản 4.17.15

import * as _ from 'lodash';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.