עשור של השפעה: כיצד חבילות ה-npm שלנו הגיעו למיליארד הורדות ועיצבו את JavaScript

הקדמה
בעולם ג'אווהסקריפט ו-Node.js, חלק מהחבילות הן חיוניות - מורדות מיליוני פעמים ביום ומפעילות אפליקציות ברחבי העולם. מאחורי הכלים הללו עומדים מפתחים המתמקדים באיכות קוד פתוח. היום, אנו מראים כיצד הצוות שלנו מסייע לבנות ולתחזק חבילות npm שהפכו לחלקים מרכזיים במערכת האקולוגית של JavaScript.
החלוצים שסומכים עלינו: אייזק ז. שלוטר ושלחו לנו אימייל
אנו גאים שיש לנו את יצחק ז. שלוטר (גיטהאב: אייזקס) כמשתמש. אייזק יצר את npm ועזר לבנות את Node.js. האמון שלו ב-Forward Email מראה את המיקוד שלנו באיכות ובאבטחה. אייזק משתמש ב-Forward Email עבור מספר דומיינים, כולל izs.me.
ההשפעה של אייזק על ג'אווה סקריפט היא עצומה. בשנת 2009, הוא היה בין הראשונים לראות את הפוטנציאל של Node.js, ועבד עם ריאן דאהל, שיצר את הפלטפורמה. כפי שאמר אייזק בפוסט ראיון עם מגזין Increment: "בתוך הקהילה הקטנה הזו של חבורה של אנשים שמנסים להבין איך לגרום ל-JS בצד השרת לקרות, ריאן דאל הוציא את Node, שברור היה שהגישה הנכונה. תרמתי את כל כולי והייתי מעורב מאוד בערך באמצע 2009."
Note
למי שמתעניין בהיסטוריה של Node.js, ישנם סרטים תיעודיים מצוינים שמתעדים את התפתחותו, כולל הסיפור של Node.js ו-10 דברים שאני מצטער עליהם בנוגע ל-Node.js - ריאן דאהל. אתר אישי של ריאן דאהל מכיל גם תובנות חשובות על עבודתו.
מיצירת npm ועד למנהיגות Node.js
אייזק יצר את npm בספטמבר 2009, כאשר הגרסה השמישה הראשונה שוחררה בתחילת 2010. מנהל חבילות זה מילא צורך מרכזי ב-Node.js, ואפשר למפתחים לשתף ולעשות שימוש חוזר בקלות בקוד. לפי דף הוויקיפדיה של Node.js, "בינואר 2010, הוצג מנהל חבילות עבור סביבת Node.js בשם npm. מנהל החבילות מאפשר למתכנתים לפרסם ולשתף חבילות Node.js, יחד עם קוד המקור הנלווה, והוא נועד לפשט את ההתקנה, העדכון וההסרה של חבילות."
כאשר ראיין דאהל פרש מ-Node.js בינואר 2012, אייזק נכנס לתפקיד מנהיג הפרויקט. כפי שצוין ב-הסיכום שלו, הוא "הוביל את הפיתוח של מספר ממשקי API בסיסיים של Node.js, כולל מערכת מודולים של CommonJS, ממשקי API של מערכת קבצים וזרמים" ו"שימש כ-BDFL (דיקטטור נדיב לכל החיים) של הפרויקט במשך שנתיים, תוך הבטחת איכות הולכת וגוברת ותהליך בנייה אמין עבור גרסאות Node.js גרסה 0.6 עד גרסה 0.10".
אייזק הוביל את Node.js בתקופת צמיחה מרכזית, וקבע סטנדרטים שעדיין מעצבים את הפלטפורמה כיום. מאוחר יותר הוא הקים את npm, Inc. בשנת 2014 כדי לתמוך ברישום npm, אותו ניהל בעצמו בעבר.
אנו מודים לאייזק על תרומתו העצומה ל-JavaScript וממשיכים להשתמש בחבילות רבות שיצר. עבודתו שינתה את האופן שבו אנו בונים תוכנה ואת האופן שבו מיליוני מפתחים משתפים קוד ברחבי העולם.
האדריכל שמאחורי הקוד: המסע של ניק בו
בלב הצלחתנו בקוד פתוח עומד ניק בו, מייסד ובעלים של Forward Email. עבודתו ב-JavaScript משתרעת על פני כמעט 20 שנה ועיצבה את האופן שבו מפתחים רבים בונים אפליקציות. המסע שלו בקוד פתוח מראה הן מיומנות טכנית והן מנהיגות קהילתית.
ועדה טכנית אקספרס ותרומות ליבה
המומחיות של ניק ב-web frameworks זיכתה אותו במקום ב-הוועדה הטכנית של אקספרס, שם הוא עזר עם אחת מ-Node.js frameworks הנפוצות ביותר. ניק רשום כעת כחבר לא פעיל ב-דף קהילת אקספרס.
Important
Express נוצר במקור על ידי TJ Holowaychuk, תורם פורה לקוד פתוח שעיצב חלק ניכר מהמערכת האקולוגית של Node.js. אנו אסירי תודה על עבודתו הבסיסית של TJ ומכבדים את החלטה לקחת הפסקה שלו מתרומותיו הנרחבות לקוד פתוח.
כחבר ב-הוועדה הטכנית של אקספרס, ניק גילה תשומת לב רבה לפרטים בנושאים כמו הבהרת תיעוד req.originalUrl
ותיקון בעיות בטיפול בטפסים מרובי חלקים.
תרומות למסגרת Koa
עבודתו של ניק עם מסגרת קואה - אלטרנטיבה מודרנית וקלה יותר ל-Express, שנוצרה גם היא על ידי TJ Holowaychuk - מראה עוד יותר את מחויבותו לכלי פיתוח אתרים טובים יותר. תרומותיו ל-Koa כוללות הן בעיות והן קוד באמצעות בקשות משיכה, טיפול בשגיאות, ניהול סוגי תוכן ושיפורי תיעוד.
עבודתו הן ב-Express והן ב-Koa מעניקה לו מבט ייחודי על פיתוח אתרים ב-Node.js, ועוזרת לצוות שלנו ליצור חבילות שעובדות היטב עם מערכות אקולוגיות מרובות של מסגרות.
מתורם יחיד למנהיג ארגון
מה שהתחיל כסיוע לפרויקטים קיימים התפתח ליצירה ותחזוקה של מערכות אקולוגיות שלמות. ניק ייסד מספר ארגוני GitHub - כולל תָא, סורק ספאם, העברת דוא"ל, בָּחוּר ו-ברי - שכל אחד מהם פתר צרכים ספציפיים בקהילת ה-JavaScript.
המעבר הזה מתורם למנהיג מראה את חזונו של ניק לתוכנה מעוצבת היטב שפותרת בעיות אמיתיות. על ידי ארגון חבילות קשורות תחת ארגוני GitHub ממוקדים, הוא בנה מערכות אקולוגיות של כלים שעובדות יחד תוך שמירה על מודולריות וגמישות עבור קהילת המפתחים הרחבה יותר.
ארגוני GitHub שלנו: מערכות אקולוגיות של חדשנות
אנו מארגנים את עבודת הקוד הפתוח שלנו סביב ארגוני GitHub ממוקדים, שכל אחד מהם עונה על צרכים ספציפיים ב-JavaScript. מבנה זה יוצר משפחות חבילות מגובשות שעובדות היטב יחד תוך שמירה על מודולריות.
בקתה: רישום מובנה עבור יישומים מודרניים
ארגון התא הוא הגרסה שלנו לרישום אפליקציות פשוט וחזק. חבילת cabin
הראשית כוללת כמעט 900 כוכבים ב-GitHub ומעל 100,000 הורדות שבועיות[1]. Cabin מספק רישום מובנה שעובד עם שירותים פופולריים כמו Sentry, LogDNA ו-Papertrail.
מה שמייחד את Cabin הוא מערכת ה-API והתוספים המתוחכמת שלה. חבילות תמיכה כמו axe
עבור תוכנת ביניים Express ו-parse-request
עבור ניתוח בקשות HTTP מראות על המחויבות שלנו לפתרונות שלמים ולא כלים מבודדים.
חבילת bson-objectid
ראויה לאזכור מיוחד, עם למעלה מ-1.7 מיליון הורדות תוך חודשיים בלבד[2]. יישום קל זה של MongoDB ObjectID הפך למועדף עבור מפתחים הזקוקים למזהים ללא תלויות מלאות של MongoDB.
סורק ספאם: מאבק בניצול לרעה של דוא"ל
ארגון סורק ספאם מראה את מחויבותנו לפתרון בעיות אמיתיות. חבילת spamscanner
העיקרית מספקת זיהוי מתקדם של דואר זבל בדוא"ל, אך דווקא חבילת url-regex-safe
היא זו שזכתה לאימוץ מדהים.
עם למעלה מ-1.2 מיליון הורדות בחודשיים[3], url-regex-safe
מתקן בעיות אבטחה קריטיות בביטויים רגולריים אחרים לזיהוי כתובות URL. חבילה זו מציגה את הגישה שלנו לקוד פתוח: מציאת בעיה נפוצה (במקרה זה, פגיעויות בצע מחדש באימות כתובות URL), יצירת פתרון מוצק ותחזוקה מדוקדקת שלו.
ברי: תזמון משימות מודרני עם שרשורי עובדים
ארגון ברי הוא התשובה שלנו לאתגר נפוץ ב-Node.js: תזמון משימות אמין. חבילת bree
הראשית, עם למעלה מ-3,100 כוכבים ב-GitHub, מספקת מתזמן משימות מודרני המשתמש ב-workthreads של Node.js לביצועים ואמינות טובים יותר.
Note
ברי נוצר לאחר שעזרנו לתחזק את סֵדֶר הַיוֹם, תוך שימוש בלקחים שנלמדו כדי לבנות מתזמן משימות טוב יותר. התרומות שלנו לסדר היום עזרו לנו למצוא דרכים לשפר את תזמון המשימות.
מה מייחד את Bree מתזמנים אחרים כמו Agenda:
- ללא תלויות חיצוניות: בניגוד ל-Agenda, הדורשת MongoDB, Bree אינה דורשת Redis או MongoDB לניהול מצב העבודה.
- הליכי עבודה: Bree משתמשת בהליכי עבודה של Node.js עבור תהליכים בארגז חול, מה שמספק בידוד וביצועים טובים יותר.
- API פשוט: Bree מציעה שליטה מפורטת בפשטות, מה שמקל על יישום צרכי תזמון מורכבים.
- תמיכה מובנית: דברים כמו טעינה מחדש חיננית, עבודות cron, תאריכים וזמנים ידידותיים למשתמש כלולים כברירת מחדל.
ברי היא חלק מרכזי ב-forwardemail.net, ומטפלת במשימות רקע קריטיות כמו עיבוד דוא"ל, ניקוי ותחזוקה מתוזמנת. השימוש בברי ב-Forward Email מראה על המחויבות שלנו להשתמש בכלים שלנו בייצור, תוך הבטחה שהם עומדים בתקני אמינות גבוהים.
אנו משתמשים ומעריכים גם חבילות Worker Thread נהדרות אחרות כמו פּוּל ולקוחות HTTP כמו אַחַד עָשָׂר. Piscina, כמו Bree, משתמש ב-Worker Threads של Node.js לעיבוד משימות יעיל. אנו מודים ל-מתיו היל, שמתחזק גם את undici וגם את piscina, על תרומתו העיקרית ל-Node.js. Matteo משמש בוועדת ההיגוי הטכנית של Node.js ושיפר מאוד את יכולות לקוח ה-HTTP ב-Node.js.
העברת דוא"ל: תשתית דוא"ל בקוד פתוח
הפרויקט השאפתני ביותר שלנו הוא העברת דוא"ל, שירות דוא"ל בקוד פתוח המספק שירותי העברת דוא"ל, אחסון ו-API. למאגר הראשי יש מעל 1,100 כוכבי GitHub[4], מה שמראה הערכה קהילתית לחלופה זו לשירותי דוא"ל קנייניים.
חבילת preview-email
של ארגון זה, עם למעלה מ-2.5 מיליון הורדות תוך חודשיים, הפכה לכלי חיוני עבור מפתחים שעובדים עם תבניות דוא"ל. על ידי מתן דרך פשוטה לתצוגה מקדימה של דוא"ל במהלך הפיתוח, היא פותרת נקודת כאב נפוצה בבניית יישומים התומכים בדוא"ל.
בחור: כלי עזר וכלים חיוניים של קואה
ה-ארגון בחורים מספק אוסף של כלי עזר וכלים חיוניים המתמקדים בעיקר בשיפור המערכת האקולוגית של מסגרת Koa. חבילות אלו פותרות אתגרים נפוצים בפיתוח אתרים ומתוכננות לעבוד בצורה חלקה יחד תוך שמירה על שימושיות באופן עצמאי.
koa-better-error-handler: טיפול משופר בשגיאות עבור Koa
koa-better-error-handler
מציע פתרון טוב יותר לטיפול בשגיאות עבור יישומי Koa. עם למעלה מ-50 כוכבים ב-GitHub, חבילה זו מאפשרת ל-ctx.throw
לייצר הודעות שגיאה ידידותיות למשתמש, תוך טיפול במספר מגבלות של מטפל השגיאות המובנה של Koa:
- מזהה ומטפל כראוי בשגיאות DNS של Node.js, שגיאות Mongoose ושגיאות Redis
- משתמש ב-בּוּם ליצירת תגובות שגיאה עקביות ומעוצבות היטב
- שומר על כותרות (בניגוד למטפל המובנה של Koa)
- שומר על קודי סטטוס מתאימים במקום להגדיר כברירת מחדל ל-500
- תומך בהודעות פלאש ושימור סשן
- מספק רשימות שגיאות HTML עבור שגיאות אימות
- תומך בסוגי תגובות מרובים (HTML, JSON וטקסט רגיל)
חבילה זו בעלת ערך רב במיוחד כאשר משתמשים בה לצד koa-404-handler
לניהול מקיף של שגיאות ביישומי Koa.
דרכון ####: אימות עבור Lad
@ladjs/passport
מרחיב את תוכנת הביניים הפופולרית לאימות Passport.js עם שיפורים ספציפיים עבור יישומי אינטרנט מודרניים. חבילה זו תומכת באסטרטגיות אימות מרובות ישירות מהקופסה:
- אימות מקומי באמצעות דוא"ל
- כניסה באמצעות Apple
- אימות GitHub
- אימות Google
- אימות סיסמה חד פעמית (OTP)
החבילה ניתנת להתאמה אישית רבה, ומאפשרת למפתחים להתאים שמות שדות וביטויים לדרישות האפליקציה שלהם. היא נועדה להשתלב בצורה חלקה עם Mongoose לניהול משתמשים, מה שהופך אותה לפתרון אידיאלי עבור יישומים מבוססי Koa הזקוקים לאימות חזק.
חינני: כיבוי יישום אלגנטי
@ladjs/graceful
פותר את האתגר הקריטי של סגירה חלקה של יישומי Node.js. עם למעלה מ-70 כוכבים ב-GitHub, חבילה זו מבטיחה שהאפליקציה שלך תוכל להסתיים בצורה נקייה מבלי לאבד נתונים או להשאיר חיבורים תקועים. התכונות העיקריות כוללות:
- תמיכה בסגירה חלקה של שרתי HTTP (Express/Koa/Fastify)
- כיבוי נקי של חיבורי מסד נתונים (MongoDB/Mongoose)
- סגירה תקינה של לקוחות Redis
- טיפול במתזמני משימות של Bree
- תמיכה במטפלי כיבוי מותאמים אישית
- הגדרות פסק זמן ניתנות להגדרה
- שילוב עם מערכות רישום
חבילה זו חיונית עבור יישומי ייצור שבהם כיבויים בלתי צפויים עלולים להוביל לאובדן נתונים או פגיעה. על ידי יישום נהלי כיבוי נכונים, @ladjs/graceful
מסייע להבטיח את האמינות והיציבות של היישום שלך.
זמן פעולה ###: ניטור זמן פעולה בקוד פתוח
ה-ארגון פעיל מייצג את מחויבותנו לניטור שקוף וקוד פתוח. מאגר upptime
הראשי מכיל מעל 13,000 כוכבי GitHub, מה שהופך אותו לאחד הפרויקטים הפופולריים ביותר שאנו תורמים להם. Uptime מספק ניטור זמן פעולה ודף סטטוס המופעלים על ידי GitHub, הפועלים לחלוטין ללא שרת.
אנו משתמשים ב-Upptime עבור דף הסטטוס שלנו ב-https://status.forwardemail.net כאשר קוד המקור זמין ב-https://github.com/forwardemail/status.forwardemail.net.
מה שמייחד את Uptime הוא הארכיטקטורה שלו:
- קוד פתוח 100%: כל רכיב הוא קוד פתוח לחלוטין וניתן להתאמה אישית.
- מופעל על ידי GitHub: ממנף פעולות, בעיות ודפים של GitHub לפתרון ניטור ללא שרת.
- אין צורך בשרת: בניגוד לכלי ניטור מסורתיים, Uptime אינו דורש ממך להפעיל או לתחזק שרת.
- דף סטטוס אוטומטי: יוצר דף סטטוס יפהפה שניתן לארח בדפי GitHub.
- התראות עוצמתיות: משתלב עם ערוצי התראות שונים, כולל דוא"ל, SMS ו-Slack.
כדי לשפר את חוויית המשתמשים שלנו, שילבנו את @octokit/core בבסיס הקוד של forwardemail.net כדי להציג עדכוני סטטוס ואירועים בזמן אמת ישירות באתר האינטרנט שלנו. שילוב זה מספק שקיפות ברורה למשתמשים שלנו במקרה של בעיות בכל המערכות שלנו (אתר אינטרנט, API, MongoDB, Redis, SQLite, SMTP, POP3, IMAP, Bree וכו') עם התראות מיידיות, שינויים בסמלי תג, צבעי אזהרה ועוד.
ספריית @octokit/core מאפשרת לנו לאחזר נתונים בזמן אמת ממאגר Upptime GitHub שלנו, לעבד אותם ולהציג אותם בצורה ידידותית למשתמש. כאשר שירות כלשהו חווה הפסקת פעילות או ירידה בביצועים, המשתמשים מקבלים הודעה מיידית באמצעות אינדיקטורים חזותיים מבלי שיצטרכו לעזוב את האפליקציה הראשית. שילוב חלק זה מבטיח שלמשתמשים שלנו תמיד יהיה מידע עדכני על מצב המערכת שלנו, מה שמשפר את השקיפות והאמון.
מאות ארגונים המחפשים דרך שקופה ואמינה לנטר את השירותים שלהם ולתקשר את סטטוס השירותים למשתמשים, אומצו באמצעות Uptime. הצלחת הפרויקט מראה את כוחם של בניית כלים המנצלים תשתית קיימת (במקרה זה, GitHub) כדי לפתור בעיות נפוצות בדרכים חדשות.
התרומות שלנו לאקוסיסטם של דוא"ל המשך
בעוד שחבילות הקוד הפתוח שלנו משמשות מפתחים ברחבי העולם, הן גם מהוות את הבסיס לשירות העברת הדוא"ל שלנו. תפקיד כפול זה - גם כיוצרים וגם כמשתמשים של כלים אלה - נותן לנו פרספקטיבה ייחודית על היישום שלהם בעולם האמיתי ומניע שיפור מתמיד.
מחבילות לייצור
המסע מחבילות בודדות למערכת ייצור מגובשת כרוך באינטגרציה והרחבה מדוקדקות. עבור דוא"ל מורחב, תהליך זה כולל:
- הרחבות מותאמות אישית: בניית הרחבות ספציפיות להעברת דוא"ל לחבילות הקוד הפתוח שלנו, העונות על הדרישות הייחודיות שלנו.
- דפוסי אינטגרציה: פיתוח דפוסים לאופן שבו חבילות אלו מקיימות אינטראקציה בסביבת ייצור.
- אופטימיזציות ביצועים: זיהוי וטיפול בצווארי בקבוק בביצועים שצצים רק בקנה מידה גדול.
- הקשחת אבטחה: הוספת שכבות אבטחה נוספות ספציפיות לטיפול בדוא"ל והגנה על נתוני משתמשים.
עבודה זו מייצגת אלפי שעות פיתוח מעבר לחבילות הליבה עצמן, וכתוצאה מכך נוצר שירות דוא"ל חזק ומאובטח הממנף את הטוב ביותר של תרומות הקוד הפתוח שלנו.
לולאת המשוב
אולי ההיבט החשוב ביותר בשימוש בחבילות שלנו בייצור הוא לולאת המשוב שהיא יוצרת. כאשר אנו נתקלים במגבלות או מקרי קצה ב-Forward Email, אנו לא רק מתקנים אותם באופן מקומי - אנו משפרים את החבילות הבסיסיות, מה שמועיל הן לשירות שלנו והן לקהילה הרחבה יותר.
גישה זו הובילה לשיפורים רבים:
- כיבוי חינני של Bree: הצורך של העברת דוא"ל בפריסות ללא זמן השבתה הוביל ליכולות כיבוי חינניות משופרות ב-Bree.
- זיהוי תבניות של Spam Scanner: דפוסי ספאם אמיתיים שנתקלו בהעברת דוא"ל השפיעו על אלגוריתמי הזיהוי של Spam Scanner.
- אופטימיזציות ביצועים של Cabin: רישום בנפח גבוה בייצור חשף הזדמנויות אופטימיזציה ב-Cabin המועילות לכל המשתמשים.
על ידי שמירה על מעגל חיובי זה בין עבודת הקוד הפתוח שלנו לשירות הייצור, אנו מבטיחים שהחבילות שלנו יישארו פתרונות פרקטיים שנבדקו בקרב ולא יישומים תיאורטיים.
עקרונות הליבה של העברת דוא"ל: יסודות למצוינות
העברת דוא"ל מתוכננת על פי קבוצת עקרונות ליבה המנחים את כל החלטות הפיתוח שלנו. עקרונות אלה, המפורטים ב-אֲתַר אִינטֶרנֶט שלנו, מבטיחים שהשירות שלנו יישאר ידידותי למפתחים, מאובטח וממוקד בפרטיות המשתמש.
תמיד ידידותי למפתחים, ממוקד אבטחה ושקוף
העיקרון הראשון והחשוב ביותר שלנו הוא ליצור תוכנה ידידותית למפתחים תוך שמירה על הסטנדרטים הגבוהים ביותר של אבטחה ופרטיות. אנו מאמינים שמצוינות טכנית לעולם לא צריכה לבוא על חשבון נוחות השימוש, וכי שקיפות בונה אמון עם הקהילה שלנו.
עיקרון זה בא לידי ביטוי בתיעוד המפורט שלנו, בהודעות שגיאה ברורות ובתקשורת פתוחה בנוגע להצלחות ולאתגרים כאחד. על ידי הפיכת כל בסיס הקוד שלנו לקוד פתוח, אנו מזמינים בדיקה ושיתוף פעולה, ומחזקים הן את התוכנה שלנו והן את המערכת האקולוגית הרחבה יותר.
הקפדה על עקרונות פיתוח תוכנה שנבדקו בזמן
אנו פועלים לפי מספר עקרונות פיתוח תוכנה מבוססים שהוכיחו את ערכם במשך עשרות שנים:
- MVC: הפרדת בעיות באמצעות תבנית Model-View-Controller
- פילוסופיית יוניקס: יצירת רכיבים מודולריים שעושים דבר אחד היטב
- KISS: שמירה על פשטות וישירה
- DRY: אל תחזור על עצמך, קידום שימוש חוזר בקוד
- YAGNI: לא תצטרך את זה, הימנעות מאופטימיזציה מוקדמת
- שנים עשר גורמים: ביצוע שיטות עבודה מומלצות לבניית יישומים מודרניים וניתנים להרחבה
- התער של אוקאם: בחירת הפתרון הפשוט ביותר שעונה על הדרישות
- ניסוי כלבים: שימוש נרחב במוצרים שלנו
עקרונות אלה אינם רק מושגים תיאורטיים - הם משובצים בשיטות הפיתוח היומיומיות שלנו. לדוגמה, הדבקות שלנו בפילוסופיית יוניקס ניכרת באופן שבו בנינו את חבילות ה-npm שלנו: מודולים קטנים וממוקדים שניתן לחבר יחד כדי לפתור בעיות מורכבות.
מיקוד במפתחים חסרי ניסיון ועם ניסיון Bootstrapping
אנו מכוונים במיוחד למפתחים חסרי ניסיון, מפתחים עם ניסיון של ניסיון בוטסטראפ ו-ראמן-רווחי. המיקוד הזה מעצב הכל, החל ממודל התמחור שלנו ועד להחלטות הטכניות שלנו. אנו מבינים את האתגרים של בניית מוצרים עם משאבים מוגבלים, כי היינו שם בעצמנו.
עיקרון זה חשוב במיוחד באופן שבו אנו ניגשים לקוד פתוח. אנו יוצרים ומתחזקים חבילות שפותרות בעיות אמיתיות עבור מפתחים ללא תקציבים ארגוניים, והופכות כלים רבי עוצמה לנגישים לכולם ללא קשר למשאבים שלהם.
עקרונות ### בפועל: בסיס הקוד של דוא"ל המשך
עקרונות אלה נראים בבירור בבסיס הקוד של Forward Email. קובץ ה-package.json שלנו חושף מבחר מושכל של תלויות, שכל אחת מהן נבחרה כך שתתאים לערכי הליבה שלנו:
- חבילות ממוקדות אבטחה כמו
mailauth
לאימות דוא"ל - כלים ידידותיים למפתחים כמו
preview-email
לאיתור שגיאות קל יותר - רכיבים מודולריים כמו כלי השירות השונים של
p-*
מבית Sindre Sorhus
על ידי ביצוע עקרונות אלה באופן עקבי לאורך זמן, בנינו שירות שמפתחים יכולים לסמוך עליו עם תשתית הדוא"ל שלהם - מאובטח, אמין ותואם את ערכי קהילת הקוד הפתוח.
פרטיות מעוצבת
פרטיות אינה מחשבה שנייה או תכונה שיווקית עבור העברת דוא"ל - זהו עיקרון עיצוב בסיסי המעצב כל היבט של השירות והקוד שלנו:
- הצפנה ללא גישה: יישמנו מערכות שמונעות מאיתנו מבחינה טכנית לקרוא את האימיילים של המשתמשים.
- איסוף נתונים מינימלי: אנו אוספים רק את הנתונים הדרושים למתן השירות שלנו, לא יותר.
- מדיניות שקופה: מדיניות הפרטיות שלנו כתובה בשפה ברורה ומובנת ללא ז'רגון משפטי.
- אימות קוד פתוח: בסיס הקוד הפתוח שלנו מאפשר לחוקרי אבטחה לאמת את טענות הפרטיות שלנו.
מחויבות זו משתרעת על חבילות הקוד הפתוח שלנו, אשר תוכננו תוך שימוש בשיטות עבודה מומלצות לאבטחה ופרטיות, מהיסוד.
קוד פתוח בר-קיימא
אנו מאמינים שתוכנה בקוד פתוח זקוקה למודלים בני קיימא כדי לשגשג לטווח ארוך. הגישה שלנו כוללת:
- תמיכה מסחרית: הצעת תמיכה ושירותים פרימיום סביב כלי הקוד הפתוח שלנו.
- רישוי מאוזן: שימוש ברישיונות המגנים על חירויות המשתמש ועל קיימות הפרויקט.
- מעורבות קהילתית: מעורבות פעילה עם תורמים לבניית קהילה תומכת.
- מפות דרכים שקופות: שיתוף תוכניות הפיתוח שלנו כדי לאפשר למשתמשים לתכנן בהתאם.
על ידי התמקדות בקיימות, אנו מבטיחים שהתרומות שלנו בקוד פתוח יוכלו להמשיך לגדול ולהשתפר עם הזמן במקום ליפול להזנחה.
המספרים לא משקרים: סטטיסטיקות ההורדה המדהימות שלנו של npm
כשאנחנו מדברים על ההשפעה של תוכנות קוד פתוח, סטטיסטיקות הורדות מספקות מדד מוחשי לאימוץ ואמון. רבות מהחבילות שאנו מסייעים בתחזוקה הגיעו לקנה מידה שמעט פרויקטים של קוד פתוח משיגים אי פעם, עם הורדות מצטברות שמסתכמות במיליארדים.
Important
בעוד שאנו גאים לעזור לתחזק מספר חבילות שהורדו רבות במערכת האקולוגית של JavaScript, אנו רוצים להכיר בכך שרבות מהחבילות הללו נוצרו במקור על ידי מפתחים מוכשרים אחרים. חבילות כמו superagent ו-supertest נוצרו במקור על ידי TJ Holowaychuk, שתרומתו הפורייה לקוד פתוח הייתה גורם מרכזי בעיצוב מערכת האקולוגית של Node.js.
מבט מקרוב על ההשפעה שלנו
בתקופה של חודשיים בלבד, מפברואר עד מרץ 2025, החבילות המובילות שאנו תורמים אליהן ועוזרים לשמור על מספרי הורדות מדהימים:
- סוכן-על: 84,575,829 הורדות[5] (נוצר במקור על ידי TJ Holowaychuk)
- מבחן סופר: 76,432,591 הורדות[6] (נוצר במקור על ידי TJ Holowaychuk)
- גַם: 28,539,295 הורדות[7] (נוצר במקור על ידי TJ Holowaychuk)
- @koa/נתב: 11,007,327 הורדות[8]
- נתב koa: 3,498,918 הורדות[9]
- ביטוי רגולרי של כתובת URL: 2,819,520 הורדות[10]
- תצוגה מקדימה של דוא"ל: 2,500,000 הורדות[11]
- תָא: 1,800,000 הורדות[12]
- @breejs/מאוחר יותר: 1,709,938 הורדות[13]
- תבניות דוא"ל: 1,128,139 הורדות[14]
- __PROTECTED_LINK_259__0: 1,124,686 הורדות[15]
- __PROTECTED_LINK_259__1: 1,200,000 הורדות[16]
- __PROTECTED_LINK_259__2: 894,666 הורדות[17]
- __PROTECTED_LINK_259__3: 839,585 הורדות[18]
- __PROTECTED_LINK_259__4: 145,000 הורדות[19]
- __PROTECTED_LINK_259__5: 24,270 הורדות[20]
Note
מספר חבילות אחרות שאנו עוזרים לתחזק אך לא יצרנו, בעלות ספירת הורדות גבוהה אף יותר, כולל form-data
(738 מיליון הורדות+), toidentifier
(309 מיליון הורדות+), stackframe
(116 מיליון הורדות+) ו-error-stack-parser
(113 מיליון הורדות+). אנו גאים לתרום לחבילות אלו תוך כיבוד עבודתם של מחבריהן המקוריים.
אלו לא רק מספרים מרשימים - הם מייצגים מפתחים אמיתיים שפותרים בעיות אמיתיות עם קוד שאנחנו עוזרים לתחזק. כל הורדה היא דוגמה שבה חבילות אלו עזרו למישהו לבנות משהו משמעותי, החל מפרויקטים חובבים ועד יישומים ארגוניים המשמשים מיליונים.
השפעה יומית בקנה מידה
דפוסי ההורדה היומיים מגלים שימוש עקבי בנפח גבוה, עם שיאים המגיעים למיליוני הורדות ביום[21]. עקביות זו מעידה על היציבות והאמינות של חבילות אלו - מפתחים לא רק מנסים אותן; הם משלבים אותן בזרימות העבודה העיקריות שלהם ותלויים בהן יום אחר יום.
דפוסי הורדה שבועיים מראים מספרים מרשימים אף יותר, הנעים באופן עקבי סביב עשרות מיליוני הורדות בשבוע[22]. זה מייצג טביעת רגל עצומה במערכת האקולוגית של JavaScript, כאשר חבילות אלו פועלות בסביבות ייצור ברחבי העולם.
מעבר למספרים הגולמיים
בעוד שסטטיסטיקות ההורדות מרשימות בפני עצמן, הן מספרות סיפור עמוק יותר על האמון שהקהילה נותנת בחבילות אלו. תחזוקת חבילות בקנה מידה זה דורשת מחויבות בלתי מעורערת ל:
- תאימות לאחור: יש לשקול בקפידה שינויים כדי למנוע פגיעה ביישומים קיימים.
- אבטחה: עם מיליוני יישומים התלויים בחבילות אלו, פגיעויות אבטחה עלולות להיות בעלות השלכות מרחיקות לכת.
- ביצועים: בקנה מידה זה, אפילו שיפורי ביצועים קלים יכולים להביא לתועלת מצטברת משמעותית.
- תיעוד: תיעוד ברור ומקיף חיוני לחבילות המשמשות מפתחים מכל רמות הניסיון.
הצמיחה העקבית במספר ההורדות לאורך זמן משקפת את ההצלחה בעמידה בהתחייבויות אלו, ובבניית אמון עם קהילת המפתחים באמצעות חבילות אמינות ומתוחזקות היטב.
תמיכה במערכת האקולוגית: חסויות הקוד הפתוח שלנו
Tip
קיימות בקוד פתוח אינה רק תרומת קוד - היא גם תמיכה במפתחים שמתחזקים תשתית קריטית.
מעבר לתרומות הישירות שלנו למערכת האקולוגית של JavaScript, אנו גאים לתת חסות לתורמים בולטים ל-Node.js שעבודתם מהווה את הבסיס ליישומים מודרניים רבים. החסויות שלנו כוללות:
אנדריס ריינמן: חלוץ תשתית דוא"ל
אנדריס ריינמן הוא יוצר Nodemailer, ספריית שליחת הדוא"ל הפופולרית ביותר עבור Node.js עם למעלה מ-14 מיליון הורדות שבועיות[23]. עבודתו משתרעת על רכיבי תשתית דוא"ל קריטיים אחרים כמו שרת SMTP, מנתח דואר ו-ברווז בר.
החסות שלנו מסייעת להבטיח את התחזוקה והפיתוח המתמשכים של כלים חיוניים אלה, המניעים תקשורת דוא"ל עבור אינספור יישומי Node.js, כולל שירות העברת הדוא"ל שלנו.
Sindre Sorhus: Mastermind חבילת שירות
סינדרה סורהוס הוא אחד מתורמי הקוד הפתוח הפוריים ביותר במערכת האקולוגית של JavaScript, עם למעלה מ-1,000 חבילות npm על שמו. כלי השירות שלו כמו מפת p, ניסיון חוזר ו-זרם-הוא הם אבני בניין בסיסיות המשמשות ברחבי מערכת האקולוגית של Node.js.
על ידי חסות עבודתו של סינדרה, אנו מסייעים בפיתוח כלי עזר קריטיים אלה שהופכים את פיתוח JavaScript ליעיל ואמין יותר.
חסויות אלו משקפות את מחויבותנו למערכת האקולוגית הרחבה יותר של קוד פתוח. אנו מכירים בכך שההצלחה שלנו בנויה על היסודות שהונחו על ידי תורמים אלה ותורמים אחרים, ואנו מחויבים להבטיח את קיימות המערכת האקולוגית כולה.
גילוי פגיעויות אבטחה במערכת האקולוגית של JavaScript
המחויבות שלנו לקוד פתוח משתרעת מעבר לפיתוח תכונות וכוללת זיהוי וטיפול בפגיעויות אבטחה שעלולות להשפיע על מיליוני מפתחים. כמה מהתרומות המשמעותיות ביותר שלנו למערכת האקולוגית של JavaScript היו בתחום האבטחה.
הצלת הנתב של קואה
בפברואר 2019, ניק זיהה בעיה קריטית בתחזוקת חבילת koa-router הפופולרית. כפי שגילה דווח ב-Hacker News, החבילה ננטשה על ידי המתחזק המקורי שלה, מה שהותיר פגיעויות אבטחה ללא טיפול והקהילה ללא עדכונים.
Warning
חבילות נטוש עם פגיעויות אבטחה מהוות סיכונים משמעותיים לכל המערכת האקולוגית, במיוחד כאשר הן מורדות מיליוני פעמים בשבוע.
בתגובה, ניק יצר את @koa/נתב ועזר להתריע בפני הקהילה על המצב. מאז הוא מתחזק את החבילה הקריטית הזו, ומבטיח שלמשתמשי Koa יש פתרון ניתוב מאובטח ומתוחזק היטב.
טיפול בפגיעויות של ReDoS
בשנת 2020, ניק זיהה וטיפל בפגיעות קריטית מסוג מניעת שירות של ביטויים רגולריים (ReDoS) בחבילת url-regex
הנפוצה. פגיעות זו (SNYK-JS-URLREGEX-569472) עלולה לאפשר לתוקפים לגרום למניעת שירות על ידי מתן קלט בעל מבנה מיוחד שגרם לעקיבה לאחור קטסטרופלית בביטוי הרגולרי.
במקום פשוט לתקן את החבילה הקיימת, ניק יצר את url-regex-safe
, יישום שנכתב מחדש לחלוטין אשר מטפל בפגיעות תוך שמירה על תאימות עם ה-API המקורי. הוא גם פרסם פוסט מקיף בבלוג המסביר את הפגיעות וכיצד לצמצם אותה.
עבודה זו מראה את הגישה שלנו לאבטחה: לא רק תיקון בעיות, אלא גם חינוך הקהילה ומתן חלופות חזקות שימנעו בעיות דומות בעתיד.
תמיכה באבטחת Node.js ו-Chromium
ניק היה פעיל גם בקידום שיפורי אבטחה במערכת האקולוגית הרחבה יותר. באוגוסט 2020, הוא זיהה בעיית אבטחה משמעותית ב-Node.js הקשורה לטיפול בכותרות HTTP, אשר דווחה ב-הרשם.
בעיה זו, שנובעת מתיקון ב-Chromium, עלולה לאפשר לתוקפים לעקוף אמצעי אבטחה. פעילותו של ניק סייעה להבטיח שהבעיה טופלה במהירות, ובכך הגנה על מיליוני יישומי Node.js מפני ניצול אפשרי.
אבטחת תשתית npm
מאוחר יותר באותו חודש, ניק זיהה בעיית אבטחה קריטית נוספת, הפעם בתשתית הדוא"ל של npm. כפי שדווח ב-הרשם, npm לא יישמה כראוי את פרוטוקולי אימות הדוא"ל DMARC, SPF ו-DKIM, מה שאפשר לתוקפים לשלוח הודעות דיוג שנראו כאילו הגיעו מ-npm.
הדו"ח של ניק הוביל לשיפורים במצב אבטחת הדוא"ל של npm, והגן על מיליוני המפתחים המסתמכים על npm לניהול חבילות מפני התקפות פישינג פוטנציאליות.
התרומות שלנו לאקוסיסטם של דוא"ל המשך
"Forward Email" בנוי על גבי מספר פרויקטים קריטיים בקוד פתוח, כולל Nodemailer, WildDuck ו-mailauth. הצוות שלנו תרם תרומות משמעותיות לפרויקטים אלה, וסייע בזיהוי ותיקון בעיות עמוקות המשפיעות על מסירת דוא"ל ואבטחתו.
שיפור פונקציונליות הליבה של Nodemailer
Nodemailer הוא עמוד השדרה של שליחת דוא"ל ב-Node.js, והתרומות שלנו עזרו להפוך אותו לחזק יותר:
- שיפורים בשרת SMTP: תיקנו באגים בניתוח, בעיות בטיפול בזרמים ובעיות תצורה של TLS ברכיב שרת ה-SMTP[24][25].
- שיפורים בניתוח דואר: טיפלנו בשגיאות בפענוח רצף תווים וטיפלנו בבעיות בניתוח שעלולות לגרום לכשלים בעיבוד דואר אלקטרוני[26][27].
תרומות אלו מבטיחות ש-Nodemailer יישאר בסיס אמין לעיבוד דוא"ל ביישומי Node.js, כולל העברת דוא"ל.
קידום אימות דוא"ל עם Mailauth
מיילאוט מספק פונקציונליות קריטית לאימות דוא"ל, והתרומות שלנו שיפרו משמעותית את יכולותיו:
- שיפורי אימות DKIM: גילינו ודיווחנו כי ל-X/Twitter היו בעיות במטמון DNS שגרמו לכשל DKIM עבור הודעות יוצאות, ודיווחנו על כך ב-Hacker One[28].
- שיפורי DMARC ו-ARC: תיקנו בעיות באימות DMARC ו-ARC שעלולות להוביל לתוצאות אימות שגויות[29][30].
- אופטימיזציות ביצועים: תרמנו אופטימיזציות המשפרות את ביצועי תהליכי אימות הדוא"ל[31][32][33][34].
שיפורים אלה עוזרים להבטיח שאימות דוא"ל מדויק ואמין, ומגנים על משתמשים מפני התקפות פישינג וזיוף.
שיפורי זמן פעילות של מפתחות
התרומות שלנו ל-Uptime כוללות:
- ניטור תעודות SSL: הוספנו פונקציונליות לניטור תפוגת תעודות SSL, ומונע זמן השבתה בלתי צפוי עקב תעודות שפג תוקפן[35].
- תמיכה במספר מספרי SMS: יישמנו תמיכה בהתראות למספר חברי צוות באמצעות SMS כאשר מתרחשות תקריות, מה ששיפור זמני התגובה[36].
- תיקוני בדיקת IPv6: תיקנו בעיות בבדיקות קישוריות IPv6, מה שמבטיח ניטור מדויק יותר בסביבות רשת מודרניות[37].
- תמיכה במצב כהה/בהיר: הוספנו תמיכה בערכות נושא כדי לשפר את חוויית המשתמש של דפי סטטוס[38].
- תמיכה טובה יותר ב-TCP-Ping: שיפרנו את פונקציונליות ה-TCP ping כדי לספק בדיקות חיבור אמינות יותר[39].
שיפורים אלה לא רק מועילים לניטור הסטטוס של Forward Email, אלא זמינים לכל קהילת משתמשי Uptime, ומדגימים את מחויבותנו לשיפור הכלים שאנו תלויים בהם.
הדבק שמחבר את הכל יחד: קוד מותאם אישית בקנה מידה גדול
בעוד שחבילות ה-npm שלנו והתרומות שלנו לפרויקטים קיימים הן משמעותיות, דווקא הקוד המותאם אישית שמשלב את הרכיבים הללו הוא שמציג באמת את המומחיות הטכנית שלנו. בסיס הקוד של Forward Email מייצג עשור של מאמצי פיתוח, עוד משנת 2017, כאשר הפרויקט החל כ-העברת דוא"ל בחינם לפני שאוחד לתוך monorepo.
מאמץ פיתוח אדיר
קנה המידה של קוד האינטגרציה המותאם אישית הזה מרשים:
- סה"כ תרומות: מעל 3,217 קומיטים
- גודל בסיס הקוד: מעל 421,545 שורות קוד בקבצי JavaScript, Pug, CSS ו-JSON[^33]
זה מייצג אלפי שעות של עבודת פיתוח, ניתוח שגיאות ואופטימיזציות ביצועים. זהו "הרוטב הסודי" שהופך חבילות בודדות לשירות מגובש ואמין, בו משתמשים אלפי לקוחות מדי יום.
שילוב תלויות ליבה
בסיס הקוד של Forward Email משלב תלות רבות לשלם חלק:
- עיבוד דוא"ל: משלב Nodemailer לשליחה, שרת SMTP לקבלה ו-Mailparser לניתוח
- אימות: משתמש ב-Mailauth לאימות DKIM, SPF, DMARC ו-ARC
- רזולוציית DNS: ממנף Tangerine ל-DNS-over-HTTPS עם אחסון מטמון גלובלי
- חיבור MX: משתמש ב-mx-connect עם שילוב Tangerine לחיבורי שרת דואר אמינים
- תזמון משימות: משתמש ב-Bree לעיבוד משימות ברקע אמין עם הליכי עבודה
- תבניות: משתמש בתבניות דוא"ל לשימוש חוזר בגיליונות סגנונות מהאתר בתקשורת עם לקוחות
- אחסון דוא"ל: מיישם תיבות דואר של SQLite מוצפנות בנפרד באמצעות better-sqlite3-multiple-ciphers עם הצפנת ChaCha20-Poly1305 לפרטיות בטוחה קוונטית, תוך הבטחת בידוד מוחלט בין משתמשים וגישה לתיבת הדואר שלו בלבד
כל אחת מהאינטגרציות הללו דורשת שיקול דעת מדוקדק של מקרי קצה, השלכות ביצועים וחששות אבטחה. התוצאה היא מערכת חזקה המטפלת במיליוני עסקאות דוא"ל בצורה אמינה. יישום ה-SQLite שלנו ממנף גם את msgpackr לסידור בינארי יעיל ואת WebSockets (דרך ws) לעדכוני סטטוס בזמן אמת בכל התשתית שלנו.
תשתית DNS עם Tangerine ו-mx-connect
מרכיב קריטי בתשתית של Forward Email הוא מערכת פתרון ה-DNS שלנו, הבנויה סביב שתי חבילות עיקריות:
-
מַנדָרִינָה: יישום Node.js DNS-over-HTTPS שלנו מספק תחליף מהיר לפתרון ה-DNS הסטנדרטי, עם ניסיונות חוזרים מובנים, פסקי זמן, סיבוב שרת חכם ותמיכה במטמון.
-
mx-connect: חבילה זו יוצרת חיבורי TCP לשרתי MX, תוך לקיחת דומיין או כתובת דוא"ל יעד, זיהוי שרתי MX מתאימים ומתחברות אליהם לפי סדר עדיפות.
שילבנו את Tangerine עם mx-connect דרך בקשת משיכה #4, המבטיחה DNS בשכבת האפליקציה על פני בקשות HTTP בכל רחבי Forward Email. זה מספק אחסון במטמון גלובלי עבור DNS בקנה מידה גדול עם עקביות של 1:1 בכל אזור, אפליקציה או תהליך - קריטי למסירת דוא"ל אמינה במערכת מבוזרת.
השפעה ארגונית: מקוד פתוח לפתרונות קריטיים למשימה
שיאו של המסע שלנו בן עשור בפיתוח קוד פתוח אפשר ל-Forward Email לשרת לא רק מפתחים בודדים אלא גם ארגונים גדולים ומוסדות חינוך המהווים את עמוד השדרה של תנועת הקוד הפתוח עצמה.
מקרי בוחן בתשתית דוא"ל קריטית למשימה
המחויבות שלנו לאמינות, פרטיות ועקרונות קוד פתוח הפכה את Forward Email לבחירה המהימנה עבור ארגונים עם דרישות דוא"ל תובעניות:
-
מוסדות חינוך: כפי שמפורט ב[מחקר מקרה של העברת דוא"ל לבוגרים] שלנו](https://forwardemail.net/blog/docs/alumni-email-forwarding-university-case-study), אוניברסיטאות גדולות מסתמכות על התשתית שלנו כדי לשמור על קשרים לכל החיים עם מאות אלפי בוגרים באמצעות שירותי העברת דוא"ל אמינים.
-
פתרונות לינוקס ארגוניים: ה-מקרה בוחן של דוא"ל קנוניקל אובונטו לארגונים מדגים כיצד גישת הקוד הפתוח שלנו מתיישבת בצורה מושלמת עם הצרכים של ספקי לינוקס ארגוניים, ומציעה להם את השקיפות והשליטה הדרושות להם.
יסודות קוד פתוח: אולי האישור הגדול ביותר הוא השותפות שלנו עם קרן לינוקס, כפי שתועד בקובץ מקרה בוחן של דוא"ל ארגוני של Linux Foundation, שם השירות שלנו מניע את התקשורת עבור הארגון שמנהל את פיתוח לינוקס.
יש סימטריה יפהפייה באופן שבו חבילות הקוד הפתוח שלנו, המתוחזקות בקפידה במשך שנים רבות, אפשרו לנו לבנות שירות דוא"ל התומך כעת באותן קהילות וארגונים שתומכים בתוכנה בקוד פתוח. מסע מעגלי זה - מתרומת חבילות בודדות ועד להפעלת תשתית דוא"ל ברמה ארגונית עבור מובילי קוד פתוח - מייצג את האישור האולטימטיבי לגישתנו לפיתוח תוכנה.
עשור של קוד פתוח: מבט קדימה
כשאנו מביטים לאחור על עשור של תרומות לקוד פתוח וצופים קדימה לעשר השנים הבאות, אנו מלאים הכרת תודה לקהילה שתמכה בעבודתנו ובהתרגשות לקראת מה שעתיד לבוא.
המסע שלנו מתורמים של חבילות בודדות לתחזוקת תשתית דוא"ל מקיפה המשמשת ארגונים גדולים וקרנות קוד פתוח היה יוצא דופן. זוהי עדות לכוחו של פיתוח קוד פתוח ולהשפעה שיכולה להיות לתוכנה מתחשבת ומתוחזקת היטב על המערכת האקולוגית הרחבה יותר.
בשנים הקרובות, אנו מחויבים ל:
- המשך תחזוקה ושיפור של החבילות הקיימות שלנו, תוך הבטחה שהן יישארו כלים אמינים עבור מפתחים ברחבי העולם.
- הרחבת תרומותינו לפרויקטים של תשתית קריטית, במיוחד בתחומי הדוא"ל והאבטחה.
- שיפור יכולות העברת דוא"ל תוך שמירה על מחויבותנו לפרטיות, אבטחה ושקיפות.
- תמיכה בדור הבא של תורמים בקוד פתוח באמצעות חונכות, חסות ומעורבות קהילתית.
אנו מאמינים שעתיד פיתוח התוכנה פתוח, שיתופי ובנוי על בסיס של אמון. על ידי המשך תרומה של חבילות איכותיות וממוקדות אבטחה למערכת האקולוגית של JavaScript, אנו מקווים למלא תפקיד קטן בבניית עתיד זה.
תודה לכל מי שהשתמש בחבילות שלנו, תרם לפרויקטים שלנו, דיווח על בעיות, או פשוט הפיץ את הבשורה על עבודתנו. התמיכה שלכם אפשרה את העשור הזה של השפעה, ואנחנו נרגשים לראות מה נוכל להשיג יחד בעשר השנים הבאות.
סטטיסטיקות הורדה של npm עבור cabin, אפריל 2025 ↩︎
סטטיסטיקות הורדה של npm עבור bson-objectid, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה של npm עבור url-regex-safe, אפריל 2025 ↩︎
ספירת כוכבים ב-GitHub עבור forwardemail/forwardemail.net נכון לאפריל 2025 ↩︎
סטטיסטיקות הורדה של npm עבור superagent, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה של npm עבור supertest, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה npm עבור koa, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה npm עבור @koa/router, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה npm עבור koa-router, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה של npm עבור url-regex, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה של npm עבור preview-email, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה של npm עבור cabin, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה של npm עבור @breejs/later, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה של npm עבור email-templates, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה של npm עבור get-paths, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה של npm עבור url-regex-safe, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה של npm עבור dotenv-parse-variables, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה של npm עבור @koa/multer, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה של npm עבור spamscanner, פברואר-מרץ 2025 ↩︎
סטטיסטיקות הורדה npm עבור bree, פברואר-מרץ 2025 ↩︎
דפוסי הורדה יומיים מסטטיסטיקות npm, אפריל 2025 ↩︎
דפוסי הורדה שבועיים מסטטיסטיקות npm, אפריל 2025 ↩︎
סטטיסטיקות הורדה של npm עבור nodemailer, אפריל 2025 ↩︎
https://github.com/nodemailer/smtp-server/issues/node-v12-requires-tls-min ↩︎
https://github.com/nodemailer/smtp-server/issues/node-v12-requires-tls-min0 ↩︎
מבוסס על בעיות GitHub במאגר Upptime ↩︎
מבוסס על בעיות GitHub במאגר Upptime ↩︎
מבוסס על בעיות GitHub במאגר Upptime ↩︎
מבוסס על בקשות משיכה של GitHub ל-Upptime ↩︎
מבוסס על בקשות משיכה של GitHub ל-Upptime ↩︎