Làm cách nào để nhập mô-đun toàn cầu trong Node? Tôi nhận được Lỗi Lỗi: Không thể tìm thấy mô-đun <mô-đun>.


145

Tôi đang cố gắng thiết lập Node trên Mac OSX Lion. Tất cả dường như hoạt động tốt, nhưng tôi dường như không thể nhập bất kỳ mô-đun nào từ thư mục mô-đun toàn cầu của mình. Tôi nhận được lỗi,

Error: Cannot find module <module>

Nếu tôi chạy cái này : node -e require.paths, phản hồi tôi nhận được là:

[ '/usr/local/lib/node_modules',
  '/Users/Me/.node_modules',
  '/Users/Me/.node_libraries',
  '/usr/local/Cellar/node/0.4.12/lib/node' ]

Điều này là chính xác, các mô-đun của tôi thực sự được cài đặt trong / usr / local / lib / node_modules. Tuy nhiên, khi tôi thử và chạy một kịch bản, tôi nhận được điều này:

Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:326:11)
    at Function._load (module.js:271:25)
    at require (module.js:355:19)
    at Object.<anonymous> (/Users/Me/node/server.js:2:10)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at Array.<anonymous> (module.js:430:10)
    at EventEmitter._tickCallback (node.js:126:26)

.Bash_profile của tôi trông như thế này:

export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

Tôi thực sự đánh giá cao một số trợ giúp, tôi không biết tại sao tôi không thể nhập bất kỳ thư viện nào.


1
Bạn biết rằng đây không phải là cách chính xác để làm việc, phải không?
thejh

1
Bạn có thể giải thích? Ý bạn là tôi không nên cài đặt thư viện vào thư mục toàn cầu của mình?
Hanpan

3
@Hanpan: Cách ưa thích là cài đặt các mô-đun bạn muốn sử dụng thông qua yêu cầu () cục bộ.
thejh

1
npm linkthể tìm thấy câu trả lời tốt hơn và cập nhật hơn (không dựa vào ) tại đây: stackoverflow.com/a/15646750/2671392
GGG

1
Tôi là trường học cũ và đã từng cài đặt thư viện ở các địa điểm toàn cầu. Tôi chưa bao giờ thấy bất kỳ lý do thuyết phục nào cho việc sử dụng nhiều cài đặt thư viện địa phương. Lớp mongodb mà tôi đang tham gia sẽ kết thúc với một nơi nào đó gần một trăm dự án nhỏ khi chúng tôi kết thúc, mỗi dự án chứa một bộ thư viện trùng lặp chủ yếu - mongodb, express, hợp nhất, v.v. Việc chuyển sang ngôn ngữ tương tác để lại tiền gửi của các thư viện địa phương ở khắp nơi. Tôi phải có hàng ngàn lib Scala trong kho lưu trữ Scala địa phương. Sao băng Ditto, Groovy và ruby.
Stephen W. Wright

Câu trả lời:


116

Nếu bạn đang sử dụng npm> = 1.0, bạn có thể sử dụng npm link <global-package>để tạo liên kết cục bộ đến gói đã được cài đặt trên toàn cầu. (Hãy cẩn thận: Hệ điều hành phải hỗ trợ các liên kết tượng trưng. )

Tuy nhiên, điều này không đến mà không có vấn đề của nó.

liên kết npm là một công cụ phát triển. Thật tuyệt vời khi quản lý các gói trên hộp phát triển cục bộ của bạn. Nhưng việc triển khai với liên kết npm về cơ bản là yêu cầu các vấn đề, vì nó giúp dễ dàng cập nhật mọi thứ mà không nhận ra điều đó.

Thay thế, bạn có thể cài đặt các gói cục bộ cũng như toàn cầu.

Để biết thêm thông tin, xem


69
Tôi đang đọc cái này và không thể tin vào mắt mình. Vì vậy, nếu tôi cài đặt, nói express, và sau đó có 20 dự án để xây dựng trên đỉnh express, tôi cần cài đặt nó 20 lần, cho mỗi trong số chúng, trong mỗi thư mục dự án, lặp đi lặp lại? Tôi không có nhiều kinh nghiệm với các nhà quản lý gói nhưng điều này thật tệ ...
treznik

25
Điều đó đúng, và nếu bạn nghĩ về nó, nó có ý nghĩa. Việc quản lý các phụ thuộc cục bộ của bạn giúp giữ mọi thứ độc lập và cho phép bạn chỉ định một phiên bản cụ thể của một phụ thuộc cho bất kỳ dự án cụ thể nào (ví dụ: dự án foo yêu cầu express 2.x, trong khi thanh dự án có thể sử dụng express 3 beta).
grahamb

43
Tôi đã đấu tranh để hiểu logic của điều này trong một thời gian, nhưng sau khi xem những người bạn Ruby của tôi đấu tranh với các bản cập nhật gói toàn cầu, tranh luận về đá quý và thường không bao giờ nâng cấp, tôi đã thừa nhận rằng cài đặt phụ thuộc cục bộ hoàn toàncách duy nhất để làm quản lý gói .
timoxley

3
Tôi muốn vẽ song song giữa tình huống này và các thư viện liên kết tĩnh so với liên kết động khi nó liên quan đến việc phân phối phần mềm. Hãy xem xét rằng hầu hết tất cả các Ứng dụng được phân phối trên App Store của iOS phải liên kết tĩnh các phụ thuộc không được cung cấp bởi SDK iOS. Tại sao điều này được thực hiện? Địa ngục phụ thuộc toàn cầu là một điều rất thực tế.
Steven Lu

1
Theo hiểu biết của tôi, npmbộ nhớ cache (tồn tại ~/.npm) sẽ giúp quá trình cài đặt lại được thực hiện ở các vị trí khác nhau của bạn.
Steven Lu

85

Node.js sử dụng biến môi trường NODE_PATHđể cho phép chỉ định các thư mục bổ sung để đưa vào đường dẫn tìm kiếm mô-đun. Bạn có thể sử dụng npmchính nó để cho bạn biết nơi các mô-đun toàn cầu được lưu trữ bằng npm root -glệnh. Vì vậy, kết hợp hai thứ đó lại với nhau, bạn có thể đảm bảo các mô-đun toàn cầu được bao gồm trong đường dẫn tìm kiếm của mình bằng lệnh sau (trên Linux-ish)

export NODE_PATH=$(npm root --quiet -g)


3
Cảm ơn NODE_PATHcác gợi ý biến môi trường. Điều đó đã giúp rất nhiều!
thiệu

7
Đây phải là bình luận hàng đầu
Adam Prax 11/07/2017

Tôi đã phải thiết lập NODE_PATHđường dẫn posix tương đương để làm cho npm hoạt động trên MSYS2. Cảm ơn bạn.
Joyce Babu

Hoạt động với Windows và Git bash. Hoàn hảo. :-)
inf3rno

Điều này làm cho .node_modulesthư mục của bạn có thể tìm kiếm được, nhưng để nhập các mô-đun bằng cách sử dụng require(), chúng vẫn nên được cài đặt trong thư mục dự án cục bộ của bạn (hoặc cách khác, được liên kết bằng cách sử dụng npm link). Các mô-đun toàn cầu không thể được nhập trong các dự án, chỉ các tệp nhị phân / tập lệnh có thể được chạy từ đó.
Prahlad Yeri

65

Bạn có thể sử dụng liên kết npm để tạo liên kết tượng trưng cho gói toàn cầu trong thư mục dự án của bạn.

Thí dụ:

$ npm install -g express
$ cd [local path]/project
$ npm link express

Tất cả những gì nó làm là tạo một thư mục node_modules cục bộ và sau đó tạo một symlink express -> [thư mục toàn cầu] / node_modules / express mà sau đó có thể được giải quyết bằng require('express')


Hệ điều hành chéo này có tương thích không?
UpTheCux

Các phiên bản Windows mới hơn hỗ trợ nó kể từ phiên bản này: github.com/npm/npm/commit/uler Đối với các phiên bản Windows cũ hơn, hãy thử npmjs.com/package/npm-jeft
Alex

22

Cài đặt bất kỳ gói nào trên toàn cầu như dưới đây:

$ npm install -g replace  // replace is one of the node module.

Vì mô-đun thay thế này được cài đặt trên toàn cầu, vì vậy nếu bạn thấy thư mục mô-đun nút của mình, bạn sẽ không thấy mô-đun thay thế ở đó và vì vậy bạn không thể sử dụng gói này bằng cách sử dụng yêu cầu ('thay thế').

bởi vì với yêu cầu bạn chỉ có thể sử dụng các mô đun cục bộ có trong thư mục mô đun nút của bạn.

Bây giờ để sử dụng mô-đun toàn cầu, bạn nên liên kết nó với đường dẫn mô-đun nút bằng cách sử dụng lệnh bên dưới.

$ npm link replace

Bây giờ hãy quay lại và xem thư mục mô-đun nút của bạn, bây giờ bạn có thể thấy mô-đun thay thế ở đó và có thể sử dụng nó với yêu cầu ('thay thế') trong ứng dụng của bạn vì nó được liên kết với mô-đun nút cục bộ của bạn.

Xin vui lòng cho tôi biết nếu cần làm rõ thêm.


14

Bạn có thể sử dụng yêu cầu với đường dẫn đến thư mục mô-đun toàn cầu làm đối số.

require('/path/to/global/node_modules/the_module');

Trên máy mac của tôi, tôi sử dụng cái này:

require('/usr/local/lib/node_modules/the_module');

Làm thế nào để tìm nơi mô-đun toàn cầu của bạn? -> Npm cài đặt gói ở đâu?


7

Đặt biến môi trường NODE_PATH để trỏ đến node_modulesthư mục chung của bạn .

Trong Windows 7 hoặc cao hơn, đường dẫn giống như %AppData%\npm\node_modulestrong khi UNIX có thể giống như thế /home/sg/.npm_global/lib/node_modules/nhưng nó phụ thuộc vào cấu hình người dùng.

Lệnh npm config get prefix có thể giúp tìm ra đường dẫn chính xác.

Trong các hệ thống UNIX, bạn có thể thực hiện nó bằng lệnh sau:

export NODE_PATH=`npm config get prefix`/lib/node_modules/

0

Tôi đang sử dụng Docker. Tôi đang cố gắng tạo một hình ảnh docker có cài đặt tất cả các phụ thuộc nút của tôi, nhưng có thể sử dụng thư mục ứng dụng cục bộ của tôi trong thời gian chạy container (mà không gây ô nhiễm với thư mục hoặc liên kết node_modules). Điều này gây ra vấn đề trong kịch bản này. Cách giải quyết của tôi là yêu cầu từ đường dẫn chính xác nơi mô-đun, ví dụ: yêu cầu ('/ usr / local / lib / node_modules / socket.io')


-1

require.paths bị phản đối

Chuyển đến thư mục dự án của bạn và gõ

npm install socket.io

cần cài đặt nó trong thư mục cục bộ ./node_modules nơi nút sẽ tìm kiếm nó.

Tôi giữ những thứ của mình như thế này:

cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io

Tạo một tệp app.js

// app.js
var socket = require('socket.io')

bây giờ chạy ứng dụng của tôi

node app.js

Hãy chắc chắn rằng bạn đang sử dụng npm >= 1.0node >= 4.0.


8
Anh ấy hỏi về việc sử dụng các gói npm được cài đặt trên toàn cầu.
UpTheCux

@Jundund. Bạn đang chỉ cho bạn cách sử dụng gói được cài đặt cục bộ, nhưng câu hỏi ban đầu là về các gói toàn cầu.
Vitaliy Markitanov
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.