Làm thế nào để đóng gói và triển khai ứng dụng web Node.js + express?


83

Tôi mới làm quen với lập trình Node.js và gần đây tôi đã tạo một ứng dụng web làm việc mẫu bằng cách sử dụng (express, backbone và các công nghệ xem miễn phí khác, với mongoDB). Bây giờ tôi đang ở thời điểm mà tôi muốn triển khai giống nhau trên một môi trường dàn dựng và tôi không chắc chắn cách đóng gói ứng dụng này và phân phối giống nhau. [Tôi có thể chăm sóc mongoDb và thiết lập nó một cách riêng biệt]

Tôi đến từ thế giới Java và ở đó chúng tôi tạo các lọ cho các gói lib có thể tái sử dụng và các gói war / ear cho các ứng dụng web được triển khai trong một thùng chứa servlet. Bây giờ trong trường hợp này vì bản thân node.js cũng hoạt động như một vùng chứa web, làm cách nào để đóng gói ứng dụng web của tôi?

  1. Có bất kỳ định dạng / hướng dẫn tiêu chuẩn nào của các ứng dụng web nút đóng gói được xây dựng bằng express không? (Có hệ thống đóng gói jar / war tương tự cho các ứng dụng nút không?)
  2. Làm cách nào để triển khai nó sau khi được đóng gói? Nó sẽ trở thành một exe, vì nó cũng là vùng chứa của chính nó?

Tái bút: Hiện tại tôi đang nghĩ đến việc sao chép thủ công tất cả các tệp nguồn cần thiết vào môi trường dàn dựng và chạy lệnh npm để tải xuống tất cả các phụ thuộc trên máy đó và sau đó sử dụng 'forever' hoặc một số cơ chế khác để chạy server.js của tôi. (Ngoài ra, hãy thêm một số loại giám sát, đề phòng trường hợp ứng dụng bị treo và mãi mãi không thành công) Tôi không chắc đó có phải là cách đúng không? Tôi chắc chắn rằng phải có một số cách chuẩn hóa để giải quyết vấn đề này.


Đối với các dự án java của tôi, chúng tôi sử dụng Maven làm công cụ xây dựng / triển khai. Trong quá khứ, tôi có kinh nghiệm với thậm chí cả kiến. Tôi đã xem xét Grunt cho Node.js, nhưng tất cả những gì tôi có thể hiểu từ các tác vụ của nó là nó thực hiện các tác vụ tiền xử lý (như thu nhỏ, concat, JSHint, v.v.), nó không đề cập gì đến việc đóng gói ứng dụng và sau đó nói cài đặt vào một kho lưu trữ (như cách maven làm).
KBJ

Câu trả lời:


44

Không có cách nào được chuẩn hóa, nhưng bạn đang đi đúng hướng. Nếu của bạn package.jsonđược cập nhật và được lưu giữ tốt, bạn chỉ có thể sao chép / zip / sao chép thư mục ứng dụng của mình vào hệ thống sản xuất, ngoại trừ node_modules.

Trên hệ thống sản xuất của bạn, hãy chạy npm installđể cài đặt các phụ thuộc của bạn, npm testnếu bạn có các thử nghiệm và cuối cùngNODE_ENV=production node server.js

Một số trang trình bày gần đây mà tôi đánh giá là khá hữu ích cũng bao gồm chủ đề về trình bao bọc như mãi mãi, có thể được tìm thấy tại đây .


Xin lỗi vì một phản hồi chậm trễ như vậy. Tôi đã kết thúc với chính đề xuất ở trên, sau khi thử tất cả các kết hợp có thể. Cảm ơn!
KBJ

4
Điều gì sẽ xảy ra nếu tôi không muốn npm tải xuống các mô-đun từ internet. Thay vào đó, tôi muốn gửi tất cả mọi thứ trong gói hàng. Có thể gửi cả Thư mục node_modules không? Nó có hoạt động không? Lý do tôi hỏi là: Ứng dụng của tôi có thể chạy trong môi trường mạng nội bộ, không cần kết nối internet.
Stefan

2
@Stefan Phụ thuộc vào các mô-đun bạn gửi cùng với nó. Vì một số mô-đun không phải là JS thuần túy cần được xây dựng trước, nên có thể việc chuyển chúng sang một môi trường khác có thể phá vỡ chúng. Tôi chưa phải giải quyết vấn đề này, nhưng có thể sử dụng bộ nhớ cache npm cung cấp một giải pháp khả thi bằng cách điền vào bộ nhớ cache với danh sách đầy đủ các gói, sau đó cài đặt (và xây dựng) từ đó.
MildlySerious

89

Việc triển khai Node.jscác ứng dụng rất dễ dàng. Trong maven, có pom.xml. Khái niệm liên quan trong Node.jspackage.json. Bạn có thể nêu các phụ thuộc của bạn vào package.json. Bạn cũng có thể thiết lập môi trường trên package.json. Ví dụ, trong môi trường dev, bạn có thể nói rằng

Tôi muốn chạy thử nghiệm đơn vị.

nhưng trong sản xuất;

Tôi muốn bỏ qua các bài kiểm tra đơn vị.

Bạn có kho lưu trữ cục bộ cho maven trong .m2thư mục. Trong Node.js, có node_modulesthư mục trong dự án Node.js của bạn. Bạn có thể thấy các thư mục mô-đun với tên của nó.

Chúng ta cùng đến với gruntphần câu trả lời này nhé. Gruntlà một trình quản lý tác vụ cho các nội dung giao diện người dùng, html, javascript, css của bạn. Ví dụ, trước khi triển khai, bạn có thể rút gọn html, css, javascript thậm chí cả hình ảnh. Bạn cũng có thể đưa các gruntchức năng chạy tác vụ vào package.json.

Nếu bạn muốn xem một ứng dụng mẫu, bạn có thể tìm một ứng dụng blog mẫu tại đây . Kiểm tra cấu trúc thư mục và package.jsonđể tham khảo.

Để triển khai, tôi khuyên bạn nên triển khai heroku cho các ứng dụng khởi động. Bạn có thể tìm thấy cách làm ở đây . Đây là triển khai dựa trên git đơn giản.

Trên phần chạy dự án, chỉ cần thiết lập môi trường của bạn NODE_ENV=developmentnode app.js. Đây app.jslà trong dự án của bạn.

Đây là khái niệm tương đối cho java và nodejs;

  1. maven clean install => npm install
  2. .m2thư mục => node_modules(Dưới thư mục dự án)
  3. mvn test=> npm test(phần kiểm tra trên package.json)
  4. junit,, powermock... => mocha , node-unit , ...
  5. Spring MVC=> Express.JS
  6. pom.xml => package.json
  7. import package => require('module_name')

Rất hữu dụng. Trong package.json, có cách nào để chỉ định phiên bản để giảm thiểu khả năng bị hỏng do những thay đổi trong phần phụ thuộc không?
mikijov

2
@MikiJ chắc chắn, bạn có thể chỉ định phiên bản cho các mô-đun (phụ thuộc). Phiên bản ngữ nghĩa được sử dụng trong package.json, bạn có thể xem tại đây để biết thêm chi tiết
Hüseyin BABAL

Java đẹp - So sánh nút. Tuyệt quá!! Cảm ơn!!
Alejandro Teixeira Muñoz

Tuyệt quá.!! Có gì tương đương với tệp War trong Java không? Bởi vì chúng tôi sẽ chỉ triển khai các tệp lớp thay vì tệp nguồn, có bất kỳ thứ gì tương tự như vậy trong nút thay vì triển khai toàn bộ tệp JS hay không.
Mdumanoj

@ HüseyinBABAL phép loại suy của bạn không hoàn toàn chính xác. bởi vì mvn clean installtạo một tệp .war được đóng gói có thể dễ dàng triển khai tới bất kỳ máy chủ nào trên thế giới và java -jar *.warthực thi nó trong máy chủ. Nhưng làm cách nào để tôi có thể tạo một tệp gói cho dự án nút của mình !! và làm thế nào tôi có thể thực thi nó trong máy chủ !!
KNDheeraj

6
  1. Có bất kỳ định dạng / hướng dẫn tiêu chuẩn nào của các ứng dụng web nút đóng gói được xây dựng bằng express không? (Có hệ thống đóng gói jar / war tương tự cho các ứng dụng nút không?)

Có, đặc điểm kỹ thuật Gói CommonJS :

Đặc tả này mô tả định dạng gói CommonJS để phân phối các chương trình và thư viện CommonJS. Gói CommonJS là một gói gắn kết của một tập hợp các mô-đun, mã và các nội dung khác thành một dạng duy nhất. Nó cung cấp cơ sở cho việc phân phối, cài đặt và quản lý các thành phần CommonJS một cách thuận tiện.

Đối với câu hỏi tiếp theo của bạn:

2. Làm cách nào để triển khai nó sau khi được đóng gói? Nó sẽ trở thành một exe, vì nó cũng là vùng chứa của chính nó?

Tôi thứ hai đề nghị Hüseyin triển khai trên Heroku để sản xuất. Để phát triển và dàn dựng, tôi sử dụng Node-Appliance với VirtualBox và Amazon EC2, tương ứng:

Chương trình này sử dụng một máy Debian được xây dựng bởi build-debian-cloud hoặc Debian-VirtualBox-Appliance và biến nó thành một "thiết bị" Node.js, có khả năng chạy một ứng dụng Node được triển khai qua git.

Ứng dụng web của bạn sẽ không trở thành exe.


1
Cảm ơn bạn đã không làm gì hơn ngoài việc trả lời câu hỏi daggone.
Monsto

6

Hy vọng điều này có thể hữu ích cho ai đó đang tìm kiếm giải pháp, Việc đóng gói ứng dụng Node js có thể được thực hiện bằng lệnh "npm pack". Nó tạo một tệp zip của ứng dụng của bạn có thể chạy trong môi trường sản xuất / dàn dựng.


5

một số cách để tiếp cận điều này:

  • Đẩy mã của bạn vào kho lưu trữ Git, loại trừ mọi thứ không phải là mã của bạn ( node_modules/**), sau đó kéo mã đó vào môi trường dàn dựng của bạn, chạy npm installđể khôi phục tất cả các phụ thuộc

  • tạo một gói NPM từ nó, cài đặt nó thông qua npmtrong môi trường dàn dựng của bạn (điều này cũng nên quan tâm đến tất cả các phần phụ thuộc)

  • sao chép thủ công các tệp / ssh vào môi trường dàn dựng của bạn (điều này có thể được tự động hóa với Grunt), thay vì khôi phục các tệp phụ thuộc của bạn quanpm


2

Tôi đã sử dụng mô-đun pkg của zeit. Nó có thể tạo các phân phối đa nền tảng cho linux / win / macos. Thực tế đã sử dụng nó trong sản xuất và hoạt động tốt mà không có bất kỳ vấn đề nào.

Nó lấy tất cả các tập lệnh js và đóng gói nó thành một tệp duy nhất.

Lý do tôi sử dụng nó là vì nó giúp bảo mật mã nguồn của bạn. Bằng cách đó trong môi trường sản xuất tại khách hàng, họ sẽ có quyền truy cập vào ứng dụng nhưng không có mã nguồn.

Ngoài ra, một trong những lợi thế là tại môi trường sản xuất, bạn không thực sự cần phải có khách hàng cài đặt node.js vì các mã nhị phân của nút cũng được đóng gói bên trong bản dựng.

https://www.npmjs.com/package/pkg

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.