تصور کنید پروژه Next.js شما آماده انتشار است، کدها کامل هستند و فقط کافی است پروژه را روی سرور Build و Deploy کنید؛ اما درست در همین لحظه دسترسی به اینترنت قطع میشود.
در حالت معمول، این اتفاق میتواند Deployment را متوقف کند؛ زیرا هنگام اجرای npm install یا npm ci، پروژه برای دریافت پکیجهای موردنیاز خود به Registryهای اینترنتی مانند npmjs.com وابسته است.
اما اگر node_modules موردنیاز پروژه را از قبل آماده کرده باشید، میتوانید آن را مستقیماً روی سرور آپلود کنید و پروژه Next.js خود را بدون نیاز به اینترنت روی سرور Build و Deploy کنید.
این دقیقاً یکی از قابلیتهای کاربردی هاست Next.js آویس هاست است.
چرا Build پروژه Next.js معمولاً به اینترنت نیاز دارد؟
در پروژههای Next.js معمولاً وابستگیهای زیادی وجود دارد. برای مثال:
next
react
react-dom
axios
mongoose
tailwindcss
typescript
این پکیجها در پوشه node_modules قرار میگیرند.
زمانی که روی یک سرور جدید پروژه را Deploy میکنیم، معمولاً ابتدا دستور زیر اجرا میشود:
npm install
یا:
npm ci
در این مرحله npm باید پکیجهای موردنیاز را از Registry دریافت کند.
بنابراین اگر ارتباط سرور با اینترنت برقرار نباشد، فرآیند نصب Dependencyها ممکن است متوقف شود.
راهکار چیست؟ آمادهسازی Dependencyها قبل از Deployment
یکی از روشهای حرفهای برای حل این مشکل، آمادهسازی node_modules قبل از انتقال پروژه به سرور است.
به عنوان مثال، توسعهدهنده میتواند روی سیستم شخصی خود که اینترنت در دسترس دارد، پروژه را نصب و آماده کند:
npm install
پس از نصب موفق Dependencyها، پوشه:
node_modules
در پروژه ایجاد میشود.
حالا میتوان این پوشه را به همراه سورس پروژه به سرور منتقل کرد.
در این حالت سرور دیگر برای داشتن Dependencyهای پروژه الزاماً نیازی به اجرای npm install و دریافت تمام پکیجها از اینترنت ندارد.
Build آفلاین Next.js چگونه انجام میشود؟
فرض کنید ساختار پروژه شما به شکل زیر باشد:
my-next-app/
│
├── app/
├── public/
├── components/
├── package.json
├── package-lock.json
├── next.config.js
└── node_modules/
در حالت عادی، روی سرور ممکن است ابتدا این دستور اجرا شود:
npm install
اما در روش Deployment آفلاین، node_modules از قبل همراه پروژه روی سرور قرار گرفته است.
بنابراین میتوان مستقیماً Build را اجرا کرد:
npm run build
و پس از Build:
npm run start
در نتیجه فرآیند Build و اجرای پروژه میتواند بدون دریافت Dependency جدید از اینترنت انجام شود.
مزیت مهم برای توسعهدهندگان ایرانی
قطع یا اختلال اینترنت برای توسعهدهندگان ایرانی مسئلهای کاملاً واقعی است.
ممکن است:
-
اینترنت بینالملل دچار اختلال شود
-
دسترسی به npm registry با مشکل مواجه شود
-
DNS یا مسیرهای بینالمللی دچار اختلال شوند
-
دسترسی به بعضی سرویسهای خارجی محدود شود
-
سرعت دریافت Dependencyها بسیار پایین بیاید
در چنین شرایطی، اگر فرآیند Deployment شما وابسته به دانلود مجدد صدها پکیج باشد، حتی یک پروژه ساده Next.js نیز ممکن است نتواند Build شود.
اینجاست که داشتن یک Deployment آفلاین میتواند بسیار ارزشمند باشد.
آویس هاست؛ Build پروژه Next.js بدون وابستگی به اینترنت
در آویس هاست امکان انتقال node_modules آماده پروژه به سرور فراهم شده است.
یعنی توسعهدهنده میتواند Dependencyهای پروژه را در محیطی که اینترنت در دسترس است نصب کند و سپس فایلهای موردنیاز را روی هاست Next.js خود قرار دهد.
پس از آن، در زمان Build پروژه، Dependencyهای اصلی از قبل روی سرور وجود دارند.
به زبان ساده:
سیستم توسعهدهنده
│
│ npm install
▼
node_modules
│
│ Upload
▼
آویس هاست
│
│ npm run build
▼
Next.js Build
│
▼
Deploy
در نتیجه حتی در شرایطی که اینترنت بینالملل دچار اختلال شده باشد، میتوان پروژهای را که Dependencyهای آن از قبل آماده شدهاند، روی سرور Build و Deploy کرد.
آیا این روش واقعاً حرفهای است؟
بله؛ اما باید یک نکته مهم را در نظر گرفت.
آپلود مستقیم node_modules تنها یک ترفند برای دور زدن اینترنت نیست. این روش در واقع بخشی از مفهوم بزرگتر Offline / Reproducible Deployment است.
در محیطهای حرفهای DevOps معمولاً تلاش میشود Build به یک Dependency خارجی و غیرقابلکنترل وابسته نباشد.
برای مثال، در پروژههای بزرگ ممکن است از موارد زیر استفاده شود:
-
Private npm Registry
-
npm Cache
-
Artifact Repository
-
Docker Image
-
CI/CD Pipeline
-
Internal Package Registry
-
Build Artifact
هدف همه این روشها تقریباً یک چیز است:
Dependencyهای موردنیاز Build باید قابل کنترل و قابل دسترس باشند.
بنابراین ایده اصلی پشت قابلیت Build آفلاین، کاملاً با اصول حرفهای Deployment همراستا است.
چرا فقط Upload کردن سورس کافی نیست؟
فرض کنید فقط این فایلها را روی سرور قرار دادهاید:
package.json
package-lock.json
src/
app/
public/
اما node_modules وجود ندارد.
در این حالت برای Build باید Dependencyها نصب شوند:
npm ci
و npm باید بتواند پکیجها را دریافت کند.
اما اگر اینترنت در دسترس نباشد، Deployment متوقف میشود.
در مقابل، اگر Dependencyهای پروژه از قبل آماده باشند:
node_modules/
نیازی نیست برای هر Deployment تمام پکیجها دوباره دانلود شوند.
آیا آپلود node_modules همیشه بهترین روش است؟
خیر.
این روش برای همه پروژهها و همه شرایط بهترین راهکار نیست.
پوشه node_modules ممکن است حجم زیادی داشته باشد و در پروژههای بزرگ انتقال آن زمانبر باشد.
همچنین باید توجه داشت که Dependencyها باید با محیط سرور سازگار باشند.
به عنوان مثال بعضی پکیجها دارای Native Module هستند و ممکن است به سیستمعامل، معماری CPU یا نسخه Node.js وابسته باشند.
به همین دلیل توصیه میشود:
نسخه Node.js محیط توسعه و سرور تا حد امکان یکسان باشد.
همچنین بهتر است package-lock.json پروژه نیز همراه پروژه نگهداری شود تا نسخه Dependencyها قابل کنترل باشد.
یک روش بهتر برای پروژههای حرفهای
برای پروژههای بزرگتر میتوان این فرآیند را حتی حرفهایتر کرد.
به جای اینکه همیشه کل node_modules را منتقل کنیم، میتوان Dependencyها را در یک محیط Build مشخص آماده کرد و نتیجه Build را به سرور منتقل کرد.
برای مثال:
Developer
│
▼
Git Repository
│
▼
Build Server
│
├── npm ci
├── npm run build
│
▼
Build Artifact
│
▼
Production Server
این معماری برای پروژههای بزرگ بسیار مناسب است.
اما برای بسیاری از پروژههای کوچک و متوسط، داشتن امکان انتقال Dependencyهای آماده و Build آفلاین میتواند یک راهکار بسیار سادهتر و سریعتر باشد.
یک مزیت دیگر؛ کاهش زمان Deployment
قابلیت آماده بودن Dependencyها فقط برای زمان قطعی اینترنت مفید نیست.
در بعضی پروژهها npm install میتواند زمان قابل توجهی از فرآیند Deployment را مصرف کند.
اگر Dependencyهای پروژه از قبل روی سرور موجود باشند، میتوان این مرحله را حذف یا بسیار محدود کرد.
در نتیجه فرآیند Deployment میتواند به شکل زیر باشد:
Upload
↓
Build
↓
Deploy
به جای:
Upload
↓
npm install
↓
Download hundreds of packages
↓
Build
↓
Deploy
آیا پروژه Next.js من میتواند کاملاً بدون اینترنت اجرا شود؟
باید بین Build و Runtime تفاوت قائل شویم.
اگر پروژه شما تمام Dependencyهای موردنیاز خود را از قبل داشته باشد، فرآیند Build میتواند بدون دانلود پکیج جدید انجام شود.
اما خود برنامه ممکن است در زمان اجرا به سرویسهای خارجی نیاز داشته باشد.
برای مثال:
Next.js
│
├── Database
├── Payment Gateway
├── External API
├── Google Maps
└── Third-party Services
اگر خود برنامه برای ارائه سرویس به این منابع نیاز داشته باشد، طبیعتاً قطع دسترسی به آن سرویسها روی عملکرد برنامه تأثیر خواهد گذاشت.
بنابراین منظور از Build و Deploy آفلاین این است که فرآیند نصب Dependency و Build پروژه به اینترنت وابسته نباشد؛ نه اینکه هر نوع ارتباط خارجی برنامه در زمان اجرا نیز حذف شود.
جمعبندی
برای یک توسعهدهنده، قطع اینترنت نباید به معنی متوقف شدن فرآیند Deployment باشد.
با آمادهسازی Dependencyهای پروژه و امکان انتقال node_modules به سرور، میتوان بسیاری از پروژههای Next.js را بدون نیاز به دانلود مجدد پکیجها Build کرد.
این قابلیت در شرایطی که دسترسی به اینترنت بینالملل ناپایدار است، اهمیت بیشتری پیدا میکند.
آویس هاست با فراهم کردن امکان استفاده از node_modules آماده روی سرور، یک راهکار عملی برای Build و Deployment آفلاین پروژههای Next.js ارائه میکند.
اگر برای شما پایداری فرآیند Deployment، سرعت انتشار نسخههای جدید و امکان ادامه کار در شرایط اختلال اینترنت اهمیت دارد، هاست Next.js آویس هاست میتواند گزینهای متفاوت از هاستهای معمولی Node.js باشد.
سوالات متداول
آیا میتوان Next.js را بدون اینترنت Build کرد؟
بله، در صورتی که Dependencyهای موردنیاز پروژه از قبل در محیط Build وجود داشته باشند و پروژه برای دریافت Dependency جدید در زمان Build نیازمند اینترنت نباشد.
آیا میتوان پوشه node_modules را روی هاست آپلود کرد؟
بله. در آویس هاست امکان انتقال node_modules آماده پروژه به سرور وجود دارد.
آیا Build آفلاین برای همه پروژههای Next.js امکانپذیر است؟
در بسیاری از پروژهها بله، اما پروژههایی که Dependencyهای Native یا سرویسهای خارجی خاص دارند ممکن است نیاز به تنظیمات بیشتری داشته باشند.
آیا Build آفلاین به معنی اجرای کامل سایت بدون اینترنت است؟
خیر. Build آفلاین به این معنی است که فرآیند نصب Dependency و Build پروژه به اینترنت وابسته نباشد. اگر خود برنامه در زمان اجرا به API یا سرویس خارجی وابسته باشد، آن سرویس همچنان باید در دسترس باشد.
آیا این روش فقط برای زمان قطعی اینترنت مفید است؟
خیر. علاوه بر شرایط قطعی اینترنت، آماده بودن Dependencyها میتواند فرآیند Deployment را سادهتر و در بعضی پروژهها سریعتر کند.
چرا این قابلیت برای توسعهدهندگان ایرانی اهمیت دارد؟
زیرا اختلال یا محدودیت دسترسی به اینترنت بینالملل میتواند فرآیند دریافت Dependencyها و Deployment پروژه را مختل کند. داشتن Dependencyهای آماده روی سرور، یک لایه اطمینان بیشتر برای فرآیند انتشار پروژه ایجاد میکند.
1405/07/12 23:08:41