Làm thế nào để nhập một hàm duy nhất?


128

Sử dụng webpack, tôi đang cố gắng nhập isEquallodashdường như đang nhập mọi thứ. Tôi đã thử làm những điều sau đây nhưng không thành công:

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
không, tôi cũng muốn nhập các chức năng khác
adang3

2
Theo hiểu biết của tôi, bây giờ bạn có thể nhập từng cái một hoặc tất cả chúng, không có trung gian. Tôi sẽ giới thiệu từng cái một ngay cả khi nó thêm nhiều phụ thuộc vào gói.json, sẽ dễ dàng hơn để kiểm tra và nâng cấp phương thức từng cái một, thay vì tất cả chúng trong một bước
Boris Charpentier

Câu trả lời:


205

Bạn có thể cài đặt lodash.isequaldưới dạng một mô-đun duy nhất mà không cần cài đặt toàn bộ gói lodash như vậy:

npm install --save lodash.isequal

Khi sử dụng các mô-đun ECMAScript 5 và CommonJS, sau đó bạn nhập nó như thế này:

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

Sử dụng các mô-đun ES6, điều này sẽ là:

import isEqual from 'lodash.isequal';

Và bạn có thể sử dụng nó trong mã của bạn:

const obj1 = {username: 'peter'};
const obj2 = {username: 'peter'};
const obj3 = {username: 'gregory'};

isEqual(obj1, obj2) // returns true
isEqual(obj1, obj3) // returns false

Nguồn: Tài liệu của Lodash

Sau khi nhập, bạn có thể sử dụng isEqualhàm trong mã của mình. Lưu ý rằng nó không phải là một phần của đối tượng được đặt tên _nếu bạn nhập nó theo cách này, vì vậy bạn không tham chiếu nó với _.isEqual, nhưng trực tiếp với isEqual.

Thay thế: Sử dụng lodash-es

Như được chỉ ra bởi @kimamula :

Với webpack 4 và lodash-es 4.17.7 trở lên, mã này hoạt động.

import { isEqual } from 'lodash-es';

Điều này là do webpack 4 hỗ trợ các dụng phụ cờ và lodash-es4.17.7 và cao hơn bao gồm các cờ (được thiết lập để false).

Tại sao không sử dụng phiên bản với dấu gạch chéo? Các câu trả lời khác cho câu hỏi này cho thấy rằng bạn cũng có thể sử dụng dấu gạch ngang thay vì dấu chấm, như vậy:

import isEqual from 'lodash/isequal';

Điều này cũng hoạt động, nhưng có hai nhược điểm nhỏ:

  • Bạn phải cài đặt toàn bộ gói lodash ( npm install --save lodash), không chỉ gói lodash.isequal riêng biệt nhỏ ; dung lượng lưu trữ rẻ và CPU nhanh, vì vậy bạn có thể không quan tâm đến điều này
  • Gói kết quả khi sử dụng các công cụ như webpack sẽ lớn hơn một chút; Tôi phát hiện ra rằng các kích thước gói với ví dụ mã tối thiểu isEqualtrung bình lớn hơn 28% (đã thử webpack 2 và webpack 3, có hoặc không có Babel, có hoặc không có Uglify)

Không hoạt động đối với tôi vì một số lý do, tôi nhận được _ is not definedkhi sử dụng_.isEquals
adang3

9
@cvDv, nhưng không nên sử dụng như thế _.isEqual, bạn nên sử dụng trực tiếpisEqual
Aren Hovsepyan

1
Bạn đã thực sự cài đặt các mô-đun? npm i --save lodash.isequal
Patrick Hund

1
@thund Vì câu trả lời này nhận được rất nhiều phiếu bầu, tôi đã dành thời gian để so sánh kích thước gói khi sử dụng dấu chấm (theo khuyến nghị của tài liệu lodash) và dấu gạch chéo, hãy xem câu trả lời được chỉnh sửa của tôi
Patrick Hund

1
@PatrickHund: Điều đó rất thú vị. Tôi đồng ý rằng chi phí chung của toàn bộ lodash trên máy phát triển của bạn là khá nhỏ, đặc biệt là vì nó loại bỏ nhu cầu chạy npm --save lodash.whateverriêng cho từng chức năng, nhưng kích thước gói lớn hơn chắc chắn có thể đáng giá khi sử dụng phương thức định kỳ. Tôi ngạc nhiên rằng có một sự khác biệt, vì vậy tôi rất vui vì bạn đã chạy số cho chúng tôi.
sấm

64

Nếu bạn chỉ muốn bao gồm isEqualvà không bao gồm các lodashchức năng còn lại (hữu ích để giữ kích thước gói của bạn nhỏ), bạn có thể thực hiện việc này trong ES6;

import isEqual from 'lodash/isEqual'

Đây là khá nhiều giống như những gì được mô tả trong các lodashREADME , ngoại trừ việc có họ sử dụng require()cú pháp.

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

29

Với webpack 4 và lodash-es 4.17.7 trở lên, mã này hoạt động.

import { isEqual } from 'lodash-es';

Điều này là do webpack 4 hỗ trợ sideEffectscờ và lodash-es 4.17.7 trở lên bao gồm cờ (được đặt thành false).

Biên tập

Kể từ phiên bản 1.9.0, Parcel cũng hỗ trợ"sideEffects": false , threrefor import { isEqual } from 'lodash-es';cũng có thể chuyển đổi được với Parcel.


1
Tuyệt vời, tôi đã thêm thông tin này vào câu trả lời của mình, hy vọng điều đó ổn với bạn
Patrick Hund

Tuyệt vời. Điều này có thể giảm kích thước gói của tôi từ 78 kb xuống 18 kb bằng cách sử dụng webpack.
fsevenm

6

Không liên quan đến gói web nhưng tôi sẽ thêm nó ở đây vì nhiều người hiện đang chuyển sang bản đánh máy.

Bạn cũng có thể nhập một hàm duy nhất từ ​​lodash bằng cách sử dụng import isEqual from 'lodash/isEqual';bản in với esModuleInteropcờ trong các tùy chọn trình biên dịch (tsconfig.json)

thí dụ

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

1

Lodash liệt kê một vài tùy chọn trong README của họ :

  • babel-plugin-lodash

    • Cài đặt lodash và plugin babel:
    $ npm i --save lodash
    $ npm i --save-dev babel-plugin-lodash @babel/cli @babel/preset-env
    • Thêm cái này vào .babelrc
    {
      "plugins": ["lodash"],
      "presets": [["@babel/env", { "targets": { "node": 6 } }]]
    }
    • Biến đổi điều này
    import _ from 'lodash'
    import { add } from 'lodash/fp'
    
    const addOne = add(1)
    _.map([1, 2, 3], addOne)

    Roughly này:

    import _add from 'lodash/fp/add'
    import _map from 'lodash/map'
    
    const addOne = _add(1)
    _map([1, 2, 3], addOne)
  • lodash-webpack-plugin

    • Cài đặt plugin lodash và webpack:
    $ npm i --save lodash
    $ npm i --save-dev lodash-webpack-plugin babel-core babel-loader babel-plugin-lodash babel-preset-env webpack
    • Định cấu hình 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-es sử dụng clod lodash

    • $ lodash modularize exports=es -o ./

0

điều này thực sự làm việc cho tôi

import { isEqual } from 'lodash';

24
Bạn vẫn có được thư viện lodash đầy đủ bằng cách sử dụng cú pháp này. OP muốn chỉ nhận được chức năng isEqual, giảm kích thước của gói.
Nyegaard

Điều này sẽ nhập tất cả lib và sau đó trích xuất một hàm vào phạm vi hiện tại.
Lukas Liesis

0

import { isEqual } from 'lodash-es';đang nhập toàn bộ thư viện. Tôi đang sử dụng Rollup nên làm rung cây theo mặc định.

Bất cứ khi nào tôi viết các mô-đun của riêng mình, cú pháp nhập có tên này hoạt động và Rollup cây rung chuyển thành công, vì vậy tôi hơi bối rối về lý do tại sao nó không hoạt động với 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.