2016-12-28 17 views
7

Cách "có thẩm quyền" để phát hiện xem biến số _ có được tải bằng lodash hoặc dấu gạch dưới không?Phát hiện nếu _ là lodash hoặc gạch dưới

Tôi đang sử dụng lodash cho dự án trong môi trường nơi underscoređôi khi có thể cũng được tải.

Hiện nay, tôi đã đi lên với điều này:

/** 
* lodash defines a variable PLACEHOLDER = '__lodash_placeholder__' 
* so check if that is defined/contains the string "lodash" 
*/ 
if (typeof(_.PLACEHOLDER) == 'undefined' || _.PLACEHOLDER.indexOf('lodash') < 0) { 
    // _ is underscore, do what I need to access lodash 
} 

Cập nhật quan trọng: Đoạn mã trên không làm việc!

Có cách nào "có thẩm quyền" để phát hiện xem _ có phải là lodash hoặc gạch dưới không?

Ghi chú:
Đây là một yêu cầu cụ thể để tìm một cách để xác định xem lodash hoặc dấu gạch dưới được nạp trong biến _:
1. Đó là ngoài tầm kiểm soát của tôi liệu gạch được nạp hay không. (lodash trong tầm kiểm soát của tôi và sẽ luôn được tải).
2. Thứ tự tải của lodash/underscore không thể dựa vào.
3. Phiên bản gạch dưới được tải có khả năng thay đổi (đó là một phần của khung CMS có thể được cập nhật).
4. Lodash 4.17.x có hơn 300 chức năng. Mã của tôi sử dụng nhiều của các hàm trong lodash.
5. Lodash chứa nhiều chức năng gạch dưới không cung cấp.
6. Một số chức năng tồn tại trong cả hai thư viện có các triển khai khác nhau.

+0

Điều duy nhất tôi có thể nghĩ đến là '_ .VERSION' hiện diện trong 'lodash' nhưng không có trong' underscore' – bhantol

+2

@bhantol: dấu gạch dưới có 'VERSION' (ít nhất là phiên bản trên trang web của nó). –

+1

'isLodash = _.toString().indexOf ('lodash')> = 0 ' – bhantol

Trả lời

1

Mã được đăng trong câu hỏi không hoạt động, dưới dạng PLACEHOLDER là biến riêng tư được đổi tên trong khi rút gọn.

Do đó, tôi đã điều chỉnh khái niệm "phát hiện tính năng" như được đề cập trong các nhận xét. Lưu ý rằng phương pháp này có thể phá vỡ nếu các phiên bản tương lai của cuộn gạch trong tất cả các chức năng này, hoặc nếu lodash deprecates bất kỳ của các chức năng:

var isLodash = false; 
 
// If _ is defined and the function _.forEach exists then we know underscore OR lodash are in place 
 
if ('undefined' != typeof(_) && 'function' == typeof(_.forEach)) { 
 
    // A small sample of some of the functions that exist in lodash but not underscore 
 
    var funcs = [ 'get', 'set', 'at', 'cloneDeep' ]; 
 
    // Simplest if assume exists to start 
 
    isLodash = true; 
 
    funcs.forEach(function (func) { 
 
    // If just one of the functions do not exist, then not lodash 
 
    isLodash = ('function' != typeof(_[ func ])) ? false : isLodash; 
 
    }); 
 
} 
 

 
if (isLodash) { 
 
    // We know that lodash is loaded in the _ variable 
 
    console.log('Is lodash: ' + isLodash); 
 
} else { 
 
    // We know that lodash is NOT loaded 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.3/lodash.js"></script>

3

Đi dọc các dòng tương tự như @bhantol đã lưu ý, có một Migrating doc với danh sách sự khác biệt giữa lodash và gạch dưới là không phải tương thích với. Những người không thể được sử dụng? Ví dụ,

if (typeof(_.invoke) !== 'undefined'){ 
    // it's lodash 
} 

Nhưng yeah, khuếch đại ý kiến ​​của @ felix-Kling và @tadman và những người khác, nếu có thể, nó có thể là đáng tin cậy hơn để hạn chế các câu hỏi để các tính năng (ví dụ: phương pháp cụ thể) mức thay vì toàn bộ thư viện.

+3

'_.invoke' có sẵn trên cả hai. '_.at' sẽ là lựa chọn tốt hơn (chỉ trên lodash kể từ v1) – Jack

+1

Tôi đã thêm câu hỏi này vào để giúp làm rõ: ** Phiên bản gạch dưới được tải có khả năng thay đổi (đó là một phần của khung CMS có thể được cập nhật), do đó, dường như không khả thi khi dựa vào một hàm cụ thể bị thiếu. ** –

Các vấn đề liên quan