2012-12-17 37 views
5

Tôi đang phát triển mô-đun nút my-module do đó phụ thuộc vào một mô-đun khác other-module. Do đó, other-module là một phụ thuộc được liệt kê rõ ràng trong package.json của mô-đun của tôi.Cách tránh nút yêu cầu tải cùng một mô-đun hai lần

Như mô-đun của tôi sẽ thay đổi hành vi của other-module chỉ bằng cách require d, điều quan trọng là other-module được nạp một lần duy nhất và điều này, một và chỉ 'dụ' là một tham chiếu trong suốt bất kỳ ứng dụng mà đòi hỏi cả hai myother.

tôi mong đợi này để giữ đúng theo Mô-đun Policy Caching nút nhưng những gì tôi đã đi qua trong khi viết một ứng dụng thử nghiệm đơn giản là thế này:

Nếu my-modulenpm install ed trướcother-module sau đó sau này được đưa như một sự phụ thuộc của cái cũ. npm install ing other-module sau đó đưa nó vào phân cấp node_modules lần thứ hai. Sau đó, khi mô-đun của tôi yêu cầu other-module, nút tải bản sao 'cục bộ' của mô-đun của tôi và khi ứng dụng require nhấp vào nút thứ hai lần nữa, (lần này phiên bản đã được cài đặt do số npm install thứ hai). Điều này rõ ràng không phải là kết quả dự định.

Nếu my-modulenpm installe d sauother-module sau đó tôi kết thúc với chỉ có một bản sao củaother-module trong node_modules và ứng dụng thử nghiệm của tôi làm việc như mong đợi.

Hành vi này đã cho tôi nhìn qua các chính sách có liên quan của nút một lần nữa và chắc chắn đủ tôi đi qua các 'Mô-đun Caching Hãy cẩn thận':

Modules được lưu trữ dựa trên tên tập tin giải quyết của họ. Vì mô-đun có thể phân giải thành tên tệp khác dựa trên vị trí của mô-đun gọi (tải từ thư mục node_modules), nó không đảm bảo yêu cầu ('foo') sẽ luôn trả về cùng một đối tượng, nếu nó sẽ giải quyết các tệp khác nhau .

Tại thời điểm này, có vẻ như mô-đun của tôi có thể hoặc không hoạt động như mong đợi tùy theo thứ tự của npm install s.

Có bất kỳ phương pháp hay nhất nào tôi bị thiếu không? Có cách nào để tránh lộn xộn này mà không thay đổi cách thức hoạt động của mô-đun của tôi?

Trả lời

4

Câu trả lời ngắn gọn: Bạn không thể.

Khi bạn chỉ ra nút sẽ tải mô-đun được yêu cầu từ vị trí địa phương nhất. Điều này là xa như tôi biết duy nhất cho một người quản lý gói và nó cho phép bạn không quan tâm về cây phụ thuộc chính xác của các mô-đun của bạn. Nút và npm sẽ chỉ ra điều đó cho bạn. Theo tôi, đây là một cái gì đó thực sự tốt.

Địa ngục phụ thuộc chỉ đơn giản là tránh được bằng cách cung cấp cho các mô-đun của bạn cơ hội yêu cầu phiên bản chính xác của những gì họ cần.

Tôi nghĩ rằng những gì bạn đang cố gắng làm, trừ khi tôi không hiểu câu hỏi của bạn hoàn toàn, không phải là thực hành nút tốt. Các mô đun được tải và gán cho một biến cục bộ. Trạng thái toàn cầu nên tránh, vì điều này có thể dẫn đến mã khá khó xử và không thể khắc phục.Ngoài ra, nếu bạn sẽ thành công tiêm mô-đun đã sửa đổi của mình vào mã người khác, có thể không đảm bảo rằng mã của họ vẫn hoạt động. Điều này sẽ giống như trong số cũ Prototype.js _ ngày khi được phép sử dụng các hình cầu được tích hợp sẵn của JavaScript như Chuỗi hoặc Array, dẫn đến một số mã thảm họa.

Tuy nhiên, hãy nhớ rằng bài viết này chỉ là ý kiến ​​của một người. Nếu bạn không tìm thấy thêm câu trả lời ở đây, hãy đăng câu hỏi của bạn ở nơi khác như kênh IRC của nút.

0

Tôi gặp phải sự cố tương tự trong khi phát triển các bài kiểm tra với sự vui vẻ.

Tuyên bố sau đây sẽ cho phép bạn tải các module tương tự một lần nữa trong bối cảnh khác nhau:

jest.resetModules(); 
Các vấn đề liên quan