Làm cách nào để tạo tệp exe từ ứng dụng node.js?


123

Tôi có một ứng dụng nút mà tôi đã viết, tôi chạy như sau:

node.exe app.js inputArg

Có cách nào để tôi có thể tự đóng gói tệp này thành tệp .exe không? Vì vậy, tôi chỉ có thể làm một cái gì đó như thế này?

App.exe inputArg

Tôi có một số cách để làm giả điều này bằng cách sử dụng tệp loạt, vì vậy tôi có thể làm điều này:

App.bat inputArg

Nhưng điều này đòi hỏi tôi phải có tất cả các phụ thuộc và nút trong thư mục đó, điều này không lý tưởng.




Một danh sách tốt đẹp của công cụ này là ở đây: stackoverflow.com/a/12486874/32679
GrGr

1
Tôi nghĩ rằng bất cứ ai thêm câu trả lời ở đây thực sự cần phải xem xét nếu nó đã được thực hiện. Câu hỏi này đang biến thành một đống liên kết đến các sản phẩm nguồn mở khác nhau với chất lượng / hoạt động khác nhau.
Liam

Câu trả lời:


35

Có một số lựa chọn thay thế, cả miễn phí và thương mại. Tôi chưa sử dụng bất kỳ cái nào trong số chúng nhưng về lý thuyết chúng sẽ hoạt động:

Hầu hết sẽ yêu cầu bạn giữ tệp loạt làm tệp thực thi chính, sau đó gói node.exe và các tập lệnh của bạn.

Tùy thuộc vào tập lệnh của bạn, bạn cũng có tùy chọn chuyển nó sang JSDB , hỗ trợ một cách dễ dàng để tạo tệp thực thi bằng cách chỉ cần thêm tài nguyên vào đó.

Một giải pháp gần như thứ ba là giữ nút ở đâu đó giống như C:\utilsvà thêm thư mục này vào PATHbiến môi trường của bạn . Sau đó, bạn có thể tạo tệp .bat trong dir đó chạy nút + các tập lệnh ưa thích của bạn - Tôi nhận được coffeescript đang hoạt coffeeđộng trên windows theo cách này. Quá trình thiết lập này có thể được tự động hóa với một tệp hàng loạt, tập lệnh vb hoặc trình cài đặt.


Chúng trông đẹp và có vẻ như chúng có thể làm những gì tôi muốn. Tôi sẽ cho nó một shot và liên hệ lại với bạn.
Aishwar

2
Tôi đã thử công cụ chuyển đổi Batch To EXE "Advanced" và nó hoạt động như một sự quyến rũ. Bạn có thể đóng gói các phụ thuộc vào tệp EXE. Cảm ơn đã giúp đỡ.
Aishwar

1
@Aishwar, nhưng bạn không thể gói thư mục node_modules, vì vậy bạn không thể làm bất kỳ điều gì nâng cao trong đó ...
Clint

Điều gì sẽ xảy ra nếu bạn zip / rar node_modules và giải nén vào thư mục tạm thời khi ứng dụng chạy? Tuy nhiên, có thể hơi chậm, nếu bạn có nhiều mô-đun.
Jarrod Mosen

55

Giải pháp tôi đã sử dụng là node-webkit của Roger Wang .

Đây là một cách tuyệt vời để đóng gói các ứng dụng nodejs và phân phối chúng, thậm chí nó còn cung cấp cho bạn tùy chọn "gói" toàn bộ ứng dụng dưới dạng một tệp thực thi duy nhất. Nó hỗ trợ windows, mac và linux.

Dưới đây là một số tài liệu về các tùy chọn khác nhau để triển khai ứng dụng node-webkit, nhưng tóm lại, bạn thực hiện như sau:

  1. Giải nén tất cả các tệp của bạn, với một package.json trong thư mục gốc
  2. Thay đổi phần mở rộng từ .zip thành .nw
  3. copy / b nw.exe + app.nw app.exe

Cũng như một lưu ý bổ sung - Tôi đã vận chuyển một số hộp sản xuất / cài đặt ứng dụng cd bằng cách sử dụng điều này và nó hoạt động rất tốt. Ứng dụng tương tự chạy trên windows, mac, linux và qua web.

Cập nhật: tên dự án đã đổi thành 'nw.js' và được đặt đúng ở đây: nw.js


1
Chỉ cần thử nó, làm việc tuyệt vời! Và nó được hỗ trợ bởi những người tại Intel.
Timo Huovinen

Đây sẽ là câu trả lời chính xác và mới nhất cho đến ngày hôm nay. Xem thêm bảng cheatskit webkit tại đây: gist.github.com/LeCoupa/80eca2716a2b13c37cce Bao gồm các nội dung cực kỳ hữu ích khác như cách biên dịch JS (hoặc ít nhất là bẻ khóa thành mã byte tùy thuộc vào mức độ cổ điển bạn muốn về từ này "biên dịch").
Erik Reppen

Tôi thích câu trả lời này, tuy nhiên điều này vẫn không tạo ra một exe độc ​​lập. Theo Intelnw.js tại Github, bạn vẫn cần có ít nhất hai tệp khác trong cùng một thư mục: nw.pak và icudt.dll. Làm thế nào để bạn tạo một exe độc ​​lập?
Jeff Baker

@JeffBaker nếu bạn nhìn xuống một chút trong tài liệu trên github, bạn có thể thấy điều này: github.com/nwjs/nw.js/wiki/… mà bạn có thể thực hiện nếu không muốn phải thêm các tệp bổ sung.
Clayton Gulick

@Clayton, Nw.js cũng được cung cấp bởi chrome.com. developer.chrome.com/apps/migration#native
Pacerier vào

29

Đối với bất kỳ ai gặp phải câu hỏi này, hiện có hai dự án tạo ra từ các dự án nút của bạn, PkgElectron.atom.io , chúng hơi khác nhau:

  1. Pkg sẽ biên dịch dự án của bạn thành mã gốc, chúng cũng bao gồm tài sản VÀ cài đặt nodejs (hệ thống sẽ không cần cài đặt nodejs để thực thi .exe). Mã nguồn của bạn sẽ không được bao gồm. Tệp thực thi kết quả là CHỈ Windows (.exe). Tất cả các nền tảng đều được hỗ trợ ngay bây giờ. Bây giờ nó yêu cầu một giấy phép cho các sản phẩm thương mại. Hoàn toàn mã nguồn mở.
  2. Electron.atom.io mặc dù nó sẽ không nhỏ gọn và tạo ra .exe cho bạn, nhưng nó CÓ THỂ được sử dụng để phân phối các ứng dụng nodejs vì chúng cung cấp một cách để phân phối các ứng dụng . Những lợi ích là electron là đa nền tảng (windows, mac osx, linux), nhược điểm là mã nguồn của bạn SẼ được bao gồm, thậm chí khó khăn là họ cung cấp một cách để phân phối ứng dụng của bạn trong một kho lưu trữ asar . Nó sẽ không có khả năng chống đạn nhưng nó vẫn tốt hơn nguồn thông thường của bạn.

2
Vui lòng cập nhật: EncloseJS KHÔNG hỗ trợ Linux và OS X ngay bây giờ.
000000000000000000000

Đã chỉnh sửa bình luận! @ 000000000000000000000
sokie

EncloseJS là con đường để đi. Tôi sẽ thử nó ngay bây giờ! Cảm ơn đã thêm câu trả lời của bạn! +1 :)
tftd

Tôi không thể cài đặt EncloseJS. Nó cho biết mã lỗi ELIFECYCLE mà không có bất kỳ thông báo lỗi hữu ích nào.
Elmue

2
EncloseJS không được duy trì nữa. Người thừa kế dường như là zeit / pkg ( npmjs.com/package/pkg )
Lucas Gonze

21

Theo mặc định, Windows liên kết .jstệp với Windows Script Host , công cụ thời gian chạy JS độc lập của Microsoft. Nếu bạn nhập script.js tại dấu nhắc lệnh (hoặc bấm đúp vào .jstệp trong Explorer), tập lệnh được thực thi bởi wscript.exe.

Điều này có thể giải quyết vấn đề cục bộ với cài đặt chung , nhưng thay vào đó, bạn có thể liên kết .js tệp với node.exeđể nhập script.js tại dấu nhắc lệnh hoặc nhấp đúp / kéo các mục vào tập lệnh sẽ khởi chạy chúng với Node.

Tất nhiên, nếu — như tôi — bạn đã liên kết .jscác tệp với một trình chỉnh sửa để nhấp đúp vào chúng sẽ mở ra trình soạn thảo văn bản yêu thích của bạn, thì đề xuất này sẽ không hiệu quả lắm. Bạn cũng có thể thêm mục nhập menu nhấp chuột phải là "Thực thi với nút" vào .jstệp, mặc dù thay thế này không giải quyết được nhu cầu dòng lệnh của bạn.


Giải pháp đơn giản nhất có lẽ là chỉ sử dụng tệp loạt - bạn không cần phải có bản sao của Node trong thư mục mà tập lệnh của bạn nằm trong đó. Chỉ cần tham khảo hoàn toàn tệp thực thi Node:

"C:\Program Files (x86)\nodejs\node.exe" app.js %*

Một lựa chọn thay thế khác là ứng dụng C # rất đơn giản này sẽ khởi động Node bằng cách sử dụng tên tệp của chính nó + .jslàm tập lệnh để chạy và truyền theo bất kỳ đối số dòng lệnh nào.

class Program
{
    static void Main(string[] args)
    {
        var info = System.Diagnostics.Process.GetCurrentProcess();
        var proc = new System.Diagnostics.ProcessStartInfo(@"C:\Program Files (x86)\nodejs\node.exe", "\"" + info.ProcessName + ".js\" " + String.Join(" ", args));
        proc.UseShellExecute = false;
        System.Diagnostics.Process.Start(proc);
    }
}

Vì vậy, nếu bạn đặt tên EXE kết quả là "app.exe", bạn có thể nhập app arg1 ...và Node sẽ được bắt đầu bằng dòng lệnh "app.js" arg1 .... Lưu ý rằng ứng dụng C # bootstrapper sẽ thoát ngay lập tức, để lại Node phụ trách cửa sổ giao diện điều khiển.

Vì điều này có lẽ là mối quan tâm tương đối rộng rãi, tôi đã tiếp tục và cung cấp điều này trên GitHub , bao gồm exe đã biên dịch nếu bạn muốn đi xe tải với người lạ.


Như bạn đã đề cập, điều này không giải quyết vấn đề của tôi theo cách lý tưởng. Nhưng +1 cho những lần đọc thú vị
Aishwar

@Aishwar, tôi đã thêm một ứng dụng đơn giản sẽ khởi chạy Node cho bạn. Xem các chỉnh sửa.
josh3736

@ josh3736 có phải exe của bạn vẫn yêu cầu bạn có node.exe trong cùng một thư mục không?
Ricardo Tomasi

@RicardoTomasi, không. Nó giả sử Node được cài đặt trong thư mục Program Files của hệ thống (nơi trình cài đặt đặt nó).
josh3736

@ josh3736 Đây là một giải pháp thú vị. Tôi thích những gì bạn đã làm, tôi ước tôi có thể +1 lần nữa :). Nhưng điều này vẫn chưa phải là lý tưởng, vì nó yêu cầu người dùng phải cài đặt node.js và trong đường dẫn chuẩn.
Aishwar

20

Công cụ tốt nhất mà tôi biết là công cụ NodeJS: zeit / pkg

Nó rất dễ sử dụng (nhiều hơn Nexe, chỉ là một ví dụ), bạn chỉ cần cài đặt trên toàn cầu: npm install -g pkg

để tạo tệp thực thi cho macOS, Linux và Windows:

pkg exampleApp.js

Tôi có một chút mã phức tạp sử dụng máy chủ ổ cắm NodeJS, tôi đã thử các ứng dụng khác nhau, không có ứng dụng nào tạo ra nó đúng cách, ngoại trừ zeit / pkg .


Tôi đã cố gắng nén cài đặt Appium thành một tệp Exe và zeit / pkg hoàn toàn không thành công. Từ 310MB trên đĩa dẫn đến một tệp Exe nhỏ 18MB, rõ ràng là không hoạt động.
Elmue


12

Kể từ khi câu hỏi này đã được trả lời, một giải pháp khác đã được đưa ra.

https://github.com/appjs/appjs

Tại thời điểm viết bài này, đây là giải pháp cuối cùng để đóng gói các ứng dụng node.js thông qua một gói crôm rút gọn được biên dịch thành tệp thực thi.

Chỉnh sửa: AppJS không còn hoạt động, nhưng bản thân nó gợi ý một nhánh rẽ gọi là bàn làm việc.

https://github.com/sihorton/appjs-deskshell/


1
Có vẻ là một liên kết bị hỏng.
starbeamrainbowlabs

1
Dự án này không còn hoạt động. Xem node-webkit để biết một giải pháp thay thế như Clayton Gulick đã đề cập.
Kukks

Bản thân Appjs đề xuất một fork đang hoạt động có tên là Deskhell github.com/sihorton/appjs-deskshell
bitfed

11

Có rất nhiều câu trả lời hay ở đây, nhưng chúng không đơn giản như JXcore .

Khi bạn đã cài đặt JXcore trên windows, tất cả những gì bạn phải làm là chạy:

jx package app.js "myAppName" -native

Điều này sẽ tạo ra một tệp .exe mà bạn có thể phân phối và có thể được thực thi mà không cần bất kỳ phụ thuộc bên ngoài nào (bạn thậm chí không cần JXcore hoặc Node.js trên hệ thống).

Đây là tài liệu về chức năng đó: http://jxcore.com/packaging-code-protection/#cat-74

Chỉnh sửa 2018

Dự án đó hiện đã chết nhưng nó vẫn được lưu trữ tại đây: https://github.com/jxcore/jxcore-release (cảm ơn @Elmue)


1
Cảm ơn bạn đời. Tôi có thể tạo tệp thực thi linux từ Windows không?
Sasivarnan

1
Theo như tôi biết, không, bạn không thể. Tôi nghĩ JXCore lấy một số tệp từ HĐH để tạo tệp thực thi và nó không đóng gói các tệp đó, vì vậy nếu bạn muốn tạo tệp thực thi trên Linux, bạn sẽ phải chạy lệnh này trên Linux.
Nepoxx


1
Tất cả các liên kết ở đây đã chết. Điều này hoạt động: github.com/jxcore/jxcore-release
Elmue

7

Hãy thử disclose: https://github.com/pmq20/disclose

disclose về cơ bản tạo một exe tự giải nén ra khỏi dự án Node.js và trình thông dịch Node.js của bạn với các đặc điểm sau,

  1. Không có GUI. CLI tinh khiết.
  2. Không có phụ thuộc thời gian chạy
  3. Hỗ trợ cả Windows và Unix
  4. Chạy chậm lần đầu tiên (giải nén vào bộ đệm ẩn), sau đó chạy nhanh mãi mãi

Hãy thử node-compiler: https://github.com/pmq20/node-compiler

Tôi đã tạo một dự án mới được gọi node-compilerđể biên dịch dự án Node.js của bạn thành một tệp thực thi duy nhất.

Nó tốt hơn discloselà nó không bao giờ chạy chậm lần đầu tiên, vì mã nguồn của bạn được biên dịch cùng với trình thông dịch Node.js, giống như các thư viện Node.js tiêu chuẩn.

Ngoài ra, nó chuyển hướng các yêu cầu tệp và thư mục một cách minh bạch đến bộ nhớ thay vì đến hệ thống tệp trong thời gian chạy. Vì vậy, không cần mã nguồn để chạy sản phẩm đã biên dịch.

Cách hoạt động: https://speakerdeck.com/pmq20/node-dot-js-compiler-compiling-your-node-dot-js-application-into-a-single-executable

So sánh với các dự án tương tự,

  • pkg ( https://github.com/zeit/pkg ): Pkg đã tấn công fs. * API động để truy cập các tệp trong gói, trong khi Trình biên dịch Node.js để chúng yên và thay vào đó hoạt động ở cấp độ sâu hơn thông qua libsquash. Pkg sử dụng JSON để lưu trữ các tệp trong gói trong khi Node.js Compiler sử dụng SquashFS phức tạp hơn và được sử dụng rộng rãi làm cấu trúc dữ liệu của nó.

  • EncloseJS ( http://enclosejs.com/ ): EncloseJS hạn chế quyền truy cập vào các tệp trong gói chỉ có năm fs. * API, trong khi Node.js Compiler hỗ trợ tất cả các fs. * API. EncloseJS được cấp phép độc quyền và tính phí khi sử dụng trong khi Node.js Compiler được MIT cấp phép và người dùng có thể tự do sử dụng và tự do sửa đổi nó.

  • Nexe ( https://github.com/nexe/nexe ): Nexe không hỗ trợ yêu cầu động vì nó sử dụng Browserify, trong khi Node.js Compiler hỗ trợ tất cả các loại yêu cầu bao gồm cả request.resolve.

  • asar ( https://github.com/electron/asar ): Asar sử dụng JSON để lưu trữ thông tin của tệp trong khi Node.js Compiler sử dụng SquashFS. Asar giữ kho lưu trữ mã và tệp thi hành tách biệt trong khi Trình biên dịch Node.js liên kết tất cả mã nguồn JavaScript với máy ảo Node.js và tạo một tệp thực thi duy nhất làm sản phẩm cuối cùng.

  • AppImage ( http://appimage.org/ ): AppImage chỉ hỗ trợ Linux với nhân hỗ trợ SquashFS, trong khi Node.js Compiler hỗ trợ cả ba nền tảng Linux, macOS và Windows, đồng thời không có bất kỳ yêu cầu tính năng đặc biệt nào từ nhân.


@ StéphaneLaurent Kiểm tra trình biên dịch nút, nó chắc chắn hỗ trợ sử dụng đối số dòng lệnh với exe.
Minqi Pan 27/12/16

Cam kết mới nhất vào ngày 30 tháng 8 năm 2017 (2 năm trước). Ngừng sản xuất ?!
Thach Lockevn

4

Tôi giới thiệu bạn BoxedApp cho điều đó. Nó là một sản phẩm thương mại hoạt động rất tốt. Nó hoạt động cho bất kỳ ứng dụng NodeJS nào. Người dùng cuối sẽ chỉ nhận được một tệp EXE cho ứng dụng của bạn. Không cần cài đặt.

Ví dụ: trong Electron, người dùng cuối cần cài đặt / giải nén ứng dụng của bạn và họ sẽ thấy tất cả các tệp nguồn của mã của bạn.

BoxedApp Nó đóng gói tất cả các tệp và phụ thuộc mà ứng dụng NodeJS của bạn cần. Nó hỗ trợ nén và tệp đã biên dịch hoạt động trên Windows XP +

Khi bạn sử dụng nó, hãy nhớ thêm Node.EXE vào ứng dụng đã biên dịch. Chọn phiên bản nút hỗ trợ Windows XP (Nếu bạn cần)

Chương trình hỗ trợ các đối số dòng lệnh, Vì vậy, sau khi gói, bạn có thể làm

c:\myApp argument1

Và bạn có thể lấy đối số trong mã nút của mình:

process.argv[1]

Đôi khi ứng dụng của bạn có tệp phụ thuộc, vì vậy trong BoxedApp, bạn có thể thêm bất kỳ thư mục và tệp nào làm tệp phụ thuộc, chẳng hạn như bạn có thể chèn tệp cài đặt.

var mySettings=require('fs').readFileSync('./settings.jgon').toString()

Thêm thông tin:

Chỉ cần một lưu ý: thông thường tôi giới thiệu về phần mềm mã nguồn mở / miễn phí, nhưng trong trường hợp này, tôi không tìm thấy bất kỳ thứ gì hoàn thành công việc.


1
Nó cũng hỗ trợ bảo vệ mã tốt vì dữ liệu được lưu RAM bên trong nhưng không có trong ổ cứng
z0r1fan

3

Tôi đã tìm thấy bất kỳ giải pháp nào trong số này đáp ứng yêu cầu của tôi, vì vậy đã tạo phiên bản nút của riêng tôi có tên là node2exe để thực hiện điều này. Nó có sẵn từ https://github.com/areve/node2exe


3

Tôi đã khám phá chủ đề này trong vài ngày và đây là những gì tôi tìm thấy. Các tùy chọn chia thành hai loại:

Nếu bạn muốn xây dựng một ứng dụng dành cho máy tính để bàn, các tùy chọn tốt nhất là:

1- NW.js : cho phép bạn gọi tất cả các mô-đun Node.js trực tiếp từ DOM và cho phép một cách viết ứng dụng mới với tất cả các công nghệ Web.

2- Electron : Xây dựng các ứng dụng máy tính để bàn đa nền tảng với JavaScript, HTML và CSS

Đây là một so sánh tốt giữa chúng: NW.js & Electron So sánh . Tôi nghĩ NW.js tốt hơn và nó cũng cung cấp một ứng dụng để biên dịch các tệp JS. Ngoài ra còn có một số trình xây dựng trình cài đặt và thực thi độc lập như Enigma Virtual Box . Cả hai đều chứa phiên bản Chrome nhúng không cần thiết cho các ứng dụng máy chủ.

nếu bạn muốn đóng gói một ứng dụng máy chủ thì đây là những lựa chọn tốt nhất:

node-compiler : Trình biên dịch trước thời gian (AOT) được thiết kế cho Node.js, chỉ hoạt động.

Nexe : tạo một tệp thực thi duy nhất từ ​​các ứng dụng node.js của bạn

Trong danh mục này, tôi tin rằng trình biên dịch nút tốt hơn hỗ trợ các mô-đun nút gốc và yêu cầu động. Nó rất dễ sử dụng và đầu ra bắt đầu từ 25MB. Bạn có thể đọc bản so sánh đầy đủ với các giải pháp khác trong trang Node Compiler. Tôi không đọc nhiều về Nexe, nhưng hiện tại, có vẻ như Node Compiler không biên dịch tệp js sang định dạng nhị phân bằng tính năng chụp nhanh V8 nhưng nó được lên kế hoạch cho phiên bản 2. Nó cũng sẽ có trình tạo trình cài đặt tích hợp sẵn.


2
Electronkhông biện minh là một gợi ý hợp lệ cho vấn đề của OP; nó là một khung Node hoàn toàn khác.
progyammer

So sánh tuyệt vời!
Vlad


1

Cảm thấy mệt mỏi với việc bắt đầu thắng từ dấu nhắc lệnh, sau đó tôi cũng gặp phải vấn đề này. Cải thiện một chút phiên bản. hơn josh3736 . Điều này sử dụng tệp XML để lấy một số cài đặt. Ví dụ: đường dẫn đến Node.execũng như tệp để bắt đầu trong app.js mặc định. Cũng là môi trường để tải (sản xuất, nhà phát triển, v.v.) mà bạn đã chỉ định trong app.js của mình (hoặc server.js hoặc bất cứ thứ gì bạn gọi là nó). Về cơ bản, nó thêm NODE_ENV={0}nơi {0} là tên cấu hình của bạn trong app.js dưới dạng var cho bạn. Bạn thực hiện việc này bằng cách sửa đổi phần tử "mode" trong config.xml. Bạn có thể lấy dự án tại đây ==> github . Lưu ý trong các sự kiện Post Build, bạn có thể sửa đổi các đường dẫn sao chép thành tự động sao chép qua config.xml của bạn và tệp thực thi choNodejsthư mục, chỉ để lưu một bước. Nếu không, hãy chỉnh sửa những thứ này hoặc bản dựng của bạn sẽ đưa ra cảnh báo.

var startInfo = new ProcessStartInfo();
        startInfo.FileName = nodepath;
        startInfo.Arguments = apppath;
        startInfo.UseShellExecute = false;
        startInfo.CreateNoWindow = false;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        if(env.Length > 0)
            startInfo.EnvironmentVariables.Add("NODE_ENV", env);

        try
        {
            using (Process p = Process.Start(startInfo))
            {
                p.WaitForExit();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message.ToString(), "Start Error", MessageBoxButtons.OK);
        }


0

Có một dự án công cụ xây dựng mã nguồn mở được gọi là nodebob . Tôi giả định rằng các cửa sổ nền tảng làm việc,

  1. chỉ cần sao chép hoặc tải xuống dự án
  2. sao chép tất cả các tệp dự án node-webkit của bạn vào thư mục ứng dụng.
  3. chạy tập lệnh build.bat.

Bạn sẽ tìm thấy tệp thực thi bên trong thư mục phát hành.

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.