2012-05-14 6 views
10

Tôi đã làm theo hướng dẫn của dự án meteorirc github và đặt chúng vào/public/Chúng ta đặt các mô-đun nút mà chúng ta cài đặt bằng npm trong một dự án Meteor ở đâu?

Tôi đã cài đặt mô-đun nút của mình qua npm từ bên trong/công cộng/và do đó tôi có thư mục/public/node_modules /.

Tôi không nghĩ rằng đây là nơi 'đúng' hoặc 'tiêu chuẩn' cho họ, vì theo các tài liệu Meteor ...

Meteor tập hợp tất cả các file JavaScript của bạn, bao gồm bất cứ điều gì dưới client và các thư mục con công cộng và tải chúng vào một máy chủ Node.js trong một sợi

Mã để tải nằm trong thư mục máy chủ và các tệp js máy chủ và trông như thế này.

var require = __meteor_bootstrap__.require; 

var path = require("path"); 
var fs = require('fs'); 
var base = path.resolve('.'); 
if (base == '/'){ 
    base = path.dirname(global.require.main.filename); 
} 

var Twit; 
var twitPath = 'node_modules/twit'; 
var publicTwitPath = path.resolve(base+'/public/'+twitPath); 
var staticTwitPath = path.resolve(base+'/static/'+twitPath); 
if (path.existsSync(publicTwitPath)){ 
    Twit = require(publicTwitPath); 
} 
else if (path.existsSync(staticTwitPath)){ 
    Twit = require(staticTwitPath); 
} 
else{ 
    console.log('WARNING Twit not loaded. Node_modules not found'); 
} 

Dựa trên tài liệu này không phải là tiêu chuẩn và tôi không tin tôi nên làm theo cách này. Tuy nhiên, nó hoạt động cả trên nền tảng dev của tôi và trong sản xuất tại triển khai meteor.com.

Trường hợp trong cấu trúc thư mục của dự án nên mô-đun nút được cài đặt để chúng hoạt động cục bộ và khi triển khai tại meteor.com hoặc ở nơi khác?

Trả lời

6
cd /usr/local/meteor/lib/ && npm install <module> 
+8

Xin lưu ý, các mô đun nút sẽ không triển khai nếu bạn đang triển khai tới meteor.com thông qua hàm triển khai nếu bạn sử dụng giải pháp này. Giải pháp này là tốt cho phát triển địa phương hoặc cài đặt các mô-đun nút trên triển khai Meteor của riêng bạn như AWS hoặc một cái gì đó. Nếu bạn đang triển khai sử dụng meteor.com (giải pháp này). [Http://stackoverflow.com/questions/10476170/how-can-i-deploy-node-modules-in-a-meteor-app-on-meteor -com] –

+0

Câu hỏi tiếp theo hỏi về/usr/local vs/usr/lib đã được đăng: [Tôi có nên cài đặt mô-đun npm cho Meteor trong/usr/lib hoặc /usr/local?](http://stackoverflow.com không/q/14304639/16308) – Rahul

+1

Điều này không hoạt động trong MacOS X 10.9.1 và sao băng mới nhất (0.7.0.1) .. vẫn không thể tìm thấy mô-đun SOAP bất kể nơi tôi cài đặt nó. Đã thử các thư mục ứng dụng (gây ra lỗi), đã thử các đề nghị ở trên, và cũng đã cố gắng cài đặt các mô-đun với -g .. tất cả không có avail. – redcap3000

1

Meteor mất lib/node_modules từ gói phát triển và tạo liên kết tượng trưng hoặc sao chép nó vào server/node_modules, nằm trong thư mục phụ ẩn .meteor trong dự án của bạn.

Vì vậy, nếu bạn cd vào thư mục lib của gói phát triển hoặc vào server thư mục của thư mục .meteor (Tôi tin rằng nó ở trong build); bạn sẽ có thể sử dụng các mô-đun nút. Nếu bạn gặp sự cố khi tải chúng, bạn có thể muốn xem this question.

+0

Ừ liên kết đó là chủ đề của tôi. Lo lắng của tôi là nếu bạn đặt chúng vào/public/node_modules/bạn thực sự có thể duyệt qua cấu trúc thư mục từ trình duyệt web. Điều này dẫn đến các vấn đề bảo mật. Khi tôi cài đặt các mô-đun nút qua npm trong vùng/server/node_modules, chúng không được triển khai. –

1

Bạn phải thêm thư mục vào đường dẫn:

var staticTwitPath = path.resolve(base+'/bundle/static/'+twitPath); 

Đây là mẫu làm việc của tôi trong coffeescript, node_modules là trong công thư mục:

# loading node_modules from public folder 
require = __meteor_bootstrap__.require 
path = require("path") 
fs  = require('fs') 

cheerioPath = 'node_modules/cheerio' 

base = path.resolve('.') 
if base == '/' 
    base = path.dirname(global.require.main.filename) 

publicPath = path.resolve(base+'/public/'+cheerioPath) 
staticPath = path.resolve(base+'/bundle/static/'+cheerioPath) 

if path.existsSync(publicPath) 
    cheerio = require(publicPath) 
else if path.existsSync(staticPath) 
    cheerio = require(staticPath) 
else 
    console.log('node_modules not found') 

Chúc may mắn!

+0

Lưu ý: vì Meteor 0.6.0, '__meteor_bootstrap __. Require' đã bị lỗi thời bởi [Npm.require()] (http://stackoverflow.com/a/15351543/1269037) –

0

Điều này đã giúp tôi rất nhiều trong đó có gói làm nổi bật cú pháp! Cảm ơn!

tôi sử dụng một chút helper tuy nhiên, như tôi nghĩ rằng đây sẽ không phải là gói NPM cuối cùng tôi sẽ sử dụng;)

meteorNpm = do() -> 
    require = __meteor_bootstrap__.require 

    path = require 'path' 
    fs  = require 'fs' 

    base = path.resolve '.' 
    if base is '/' 
    base = path.dirname global.require.main.filename 

    meteorNpm = 
    # requires npm modules placed in `public/node_modules` 
    require: (moduleName) -> 
     modulePath = 'node_modules/' + moduleName 

     publicPath = path.resolve(base + '/public/' + modulePath) 
     staticPath = path.resolve(base + '/bundle/static/' + modulePath) 

     if path.existsSync(publicPath) 
     module = require publicPath 
     else if path.existsSync(staticPath) 
     module = require staticPath 
     else 
     module = null 

     return module 

Sử dụng nó như thế này:

highlight = meteorNpm.require "highlight.js" 
+1

* Lưu ý *: kể từ Meteor 0.6.0 , '__meteor_bootstrap __. require' đã bị lỗi thời bởi [Npm.require()] (http://stackoverflow.com/a/15351543/1269037) –

0

Tôi đang sử dụng such script cài đặt độc đáo tất cả các phụ thuộc node.js. Nó hoạt động tương tự như hỗ trợ chính thức trong nhánh động cơ Meteor (nó cài đặt các phụ thuộc vào thời gian chạy) nhưng nó cũng hỗ trợ cài đặt từ kho git và các tính năng tương tự.

2

Để sử dụng module NPM trong Meteor thêm nó module NPM trong.

Trước tiên, bạn cần phải thêm một bộ chuyển đổi gói NPM như meteorhacks:npm

meteor add meteorhacks:npm 

Sau đó bắt đầu ứng dụng sao băng của bạn bằng cách chạy meteor, bạn sẽ nhận thấy tệp packages.json mới trong dự án

Thêm vào các mô-đun như thế này (bạn cần xác định rõ ràng phiên bản)

{ 
    "request" : "2.53.0" 
} 

Sau đó, bạn có thể sử dụng các module NPM trong ứng dụng sao băng của bạn, sử dụng Meteor.npmRequire thay vì require

var request = Meteor.npmRequire("request")