TypeScript - איך לארוז אפליקציית Node.js לאפליקציה נפרדת אחת (SEA) יחד עם מודולים נייטיביים (NAPI)?
מעצמי בעתיד: השאלה נוצרה על ידי אני המצחיק שלא ידע על תהליך ההידור ואיך Node.js עובד עם חיבורים ילידיים, אני בעתיד עשיתי חיבורים ילידיים ו-ffi ושיפרתי את השאלה כדי שתהיה יותר "חפשנית" בגוגל ותספק תובנה מינימלית על בעיות דומות.
ראיתי כמה אנשים שמספקים אפליקציות כקבצי הפעלה ורציתי לשחזר תוצאה כזו עם Node.js, ניסיתי להשתמש בכלי nexe ו-pkg שנראים מקדמים את התוצאה שאני רוצה להשיג, ובכל זאת כשניסיתי להשתמש בהם אני כל הזמן מקבל בעיה עם קבצי .node חסרים מ-bcrypt ו-realm באפליקציה שלי.
בכל מקום שבו חיפשתי פתרון ראיתי שה"פתרון" לבעיה זו הוא להוציא את realm ו-bcrypt מחבילת JavaScript מכיוון שהם או שתופסים יותר מדי מקום או אינם יעילים, כיוון שניתן להתקינם מ-npm ועדיין התוצאה הרצויה היא ארכיון של יישום הריץ יחיד (SEA) ואין לי מושג מה לעשות הלאה.
תשובה #1
Node.js הוא סביבת ריצה ו-JavaScript היא שפת תרגום מיידי שזה אומר שהיא מריצה קוד ללא שלב הקומפילציה. הבעיה שאתה מנסה לפתור היא חור ארנב די גדול שהיה קיים על השולחן מאז 2013. עם זאת, רק בשנת 2022-2023 נעשה מאמץ נוסף סביב Deno ו-Bun לארוז אפליקציות Node.js עם סביבת ריצה משולבת.
חלק מסביבות הריצה (Bun ו-Deno) מסוגלות לשלוח סביבות ריצה ורצה קוד מקובץ שעשוי להיראות כאפליקציה מוסכמת אך בפועל זה לא כך - התוצאה עשויה להיות דומה למשתמש הקצה שכן הם רואים קובץ יחיד אך אלו שני דברים שונים לחלוטין.
אני ממליץ לנסות לבנות קוד עם Bun ועם מספיק מזל הדברים יסתדרו, אך אם הם לא יתנקמו ו-Bun לא ייישם תיקונים בעצמם, אני הייתי מסכן טענה שזה בלתי אפשרי לעשות כך. https://bun.sh/docs/bundler/executables
בשנים ~2022..2023 הדרך המועדפת לעשות דברים כאלה הייתה השימוש ב-pkg אך הוא נפרש כנראה ולא יימשך עוד, כיוון ש-Node.js הציגה תמיכה ניסיונית ביישומים הרצים כתוכנית אחת (SEA) מה שאומר שאין עוד צורך בכלים כמו pkg, אותו הדבר נכון לגבי nexe וכלים אחרים שהיינו משתמשים בהם לפני השינוי במערכת האקולוגית ל-ESmodule מ-CommonJS ואחרים.
משאבים נוספים:
- יצירת קובץ הרצה בודד עם Node ו-esbuild (2024)
התשובה פורסמה במקור כאן
תשובה #2
קרא את המשאב הזה עם דוגמאות ותוכל לקמפל אותו לגרסת בינארית. כמובן, נקסה נדרשת אבל עם pty.js אתה יכול לקמפל אותו בהצלחה עם כל הספריות המקומיות. עיין בקוד המקור: https://www.jedi.be/blog/2013/05/14/compiling-packaging-a-nodejs-project-as-a-single-binary/