5 توسعه دهنده گره اشتباه برتر

نود یک بستر فوق العاده برای نوشتن نسخه های پشتی است. بجز وقتی درست نمی شوید.


بستگی به این دارد که در کدام طرف از حصار قرار دارید ، نود بهترین یا بدترین اتفاق برای دنیای توسعه وب است. اما نظرات علیرغم این ، هیچ محبوبیتی در مورد محبوبیت نود وجود ندارد. این نسخه از محبوبیت سریعتر از آنچه انتظار می رود ، حتی خالق آن (به گفته او در غیرواقعی بدبینانه) شلیک کرد مصاحبه)!

از زمان نوشتن ، این بستر پیش فرض برای شروع برنامه های جدید است که من اعتراف می کنم اغلب نتیجه ذهنیت گله ها است ، اما اثر خالص این است که تعداد بیشتری شغل ، پول بیشتر ، و پروژه های هیجان انگیزتری در Node نسبت به سایر زبان های اسکریپتینگ سنتی وجود دارد..

متأسفانه به این نکته رسیده است که وقتی شخصی از من سؤال می کند که یک پشته شروع برای توسعه وب یا محصولات جدید راه اندازی شود ، Node توصیه من شماره 1 است حتی اگر من به PHP و Laravel کاملاً آگاه هستم..

اگر ممکن است اجازه دهم که کمی ادامه دهم (که من خواهم بود زیرا من کسی هستم که می نویسم؟) ، نفرت گرایان گره نکته ای دارند که می گویند پشته مورد علاقه آنها می تواند کارهایی را انجام دهد ، همانطور که Node انجام می دهد ، اما مکالمه نیز صادق است. و سپس مواردی برای برنامه نویسی و رویدادهای async وجود دارد که از روز اول در نود پخته شد و اکوسیستم های دیگر اکنون به شدت در تلاشند تا کپی کنند.

امروز در PHP و Python گزینه های async داریم ، اما متأسفانه هسته اصلی کتابخانه های موجود ، کاملاً همزمان هستند ، بنابراین تقریباً مثل این است که شما با سیستم می جنگید. اما به هر حال ، به اندازه کافی برای یک روز شایعه است. ��

بنابراین ، اگر شما یک توسعه دهنده گره (مبتدی یا آشنا) هستید ، به احتمال زیاد شما یکی از این اشتباهات بزرگ را انجام داده اید که روی برنامه شما تأثیر منفی می گذارد. ممکن است به این دلیل باشد که شما با روش خاصی برای انجام بهتر کارها در گره آشنا نیستید ، یا شاید این فقط عاداتی باشد که شما از برخی اکوسیستم دیگر منتقل کرده اید.

عدم رعایت حلقه رویداد

هنگامی که شخصی به نود مهاجرت می کند ، دلیل آن این است که آنها داستانهایی از نحوه مقیاس LinkedIn با استفاده از گره را شنیده اید ، یا معیارهایی را دیده اند که Node را با استفاده از حلقه های در حال اجرا در اطراف PHP ، یاقوت و غیره نشان می دهد ، هنگام مراجعه به درخواست در هر ثانیه یا رسیدگی اتصالات سوکت را باز کنید.

بنابراین آنها برنامه خود را می سازند و انتظار دارند همان زمان واکنش انفجاری را که در خواب دیدند انتظار داشته باشند – به جز اینکه هیچ چیز نزدیک به آن اتفاق نمی افتد.

یکی از دلایل اصلی این امر ، درک درست حلقه رویداد نیست. کد زیر را در نظر بگیرید که مجموعه ای از کتاب ها را از پایگاه داده دریافت می کند و سپس آنها را بر اساس تعداد کل صفحات مرتب می کند:

db.Libarus.get (libraryId ، عملکرد (خطا ، کتابخانه) {
اجازه دهید کتاب = کتابخانه.
books.sort (عملکرد (a ، b)
برگه a.pages < b.pages؟ -1: 1
})؛
})؛

موافقم که این کد با مجموعه کتابهای مرتب شده هیچ کاری انجام نمی دهد ، اما در اینجا نکته ای نیست. نکته این است که چنین رمز بیگناهی به اندازه کافی کافی است تا به محض اینکه شروع به معامله با تعداد بی اهمیت کتاب ها کنید ، حلقه رویداد را منفجر کنید..

دلیل این امر این است که حلقه رویداد به منظور انجام عدم انسداد I / O است. مثال خوب نمونه ای از بسته بندی پیتزا در مفصل پیتزا است – فرد در برش پیتزا ، پوشاندن کاورها در جعبه های تحویل ، قرار دادن پیتزا ، وصل کردن برچسب های مناسب و هل دادن آن به فرد زایمان تخصص دارد..

شگفت انگیز است ، درست است؟ درست مثل نود!

منبع: stackoverflow.com

اما در نظر بگیرید چه اتفاقی خواهد افتاد اگر این فرد همچنین به مخلوط کردن ، تهیه و بسته بندی چاشنی ها بپردازد. بسته به میزان پیچیده بودن این روند ، میزان بسته بندی پیتزا به یک سوم کاهش می یابد یا حتی ممکن است متوقف شود.

منظور ما این است که وظایف “مسدود کننده” را انجام می دهیم – تا زمانی که نود مجبور شود اطلاعات را به اطراف منتقل کند ، بسیار سریع و ایده آل بهترین گزینه است ، اما به محض اینکه نیاز به انجام برخی محاسبات گسترده داشت ، متوقف می شود و همه چیز دیگر باید صبر کند. این اتفاق می افتد زیرا حلقه رویداد تک رشته ای است (جزئیات بیشتر اینجا.)

بنابراین ، مهم نیست که اهمیت آنها چقدر محاسبه شده در حلقه رویداد باشد. منظورم این است که اضافه کردن اعداد و میانگین کردن خوب است ، اما مجموعه های بزرگ داده باعث می شوند برنامه نود شما خزنده شود.

به امید اینکه کد async همکاری کند

این مثال گره بسیار ساده را در نظر بگیرید که داده ها را از یک پرونده می خواند و آن را نمایش می دهد:

const fs = نیاز (‘fs’)؛

اجازه دهید محتوا = fs.readFile (“secret.txt” ، (اشتباه ، داده) => {
بازگشت داده ها؛
})؛

console.log (‘محتویات پرونده:’)؛
console.log (مطالب)؛

قرار گرفتن در معرض زبان های کلاسیک (مانند PHP، Python، Perl، Ruby، C ++، و غیره) باعث می شود تا این حس مشترک را به کار ببرید که پس از اجرای این کد ، محتوای متغیر محتویات پرونده را خواهد داشت. اما این اتفاق می افتد که در واقع کد را اجرا می کنید:

ما تعریف نشده () دلیل این امر آن است که اگر شما ممکن است به Node عمیقاً اهمیت دهید ، ماهیت async به شما اهمیتی نمی دهد (منظور این یک شوخی است! لطفاً در اینجا از نظرات متنفرانه متنفر نباشید.) وظیفه ما این است که ماهیت پیوند آن را درک کنیم و با آن کار کنیم. readFile () یک تابع ناهمزمان است ، به این معنا که به محض فراخوانی ، حلقه رویداد Node کار را به مؤلفه سیستم فایل منتقل می کند و حرکت می کند.

این بعداً هنگام خواندن پرونده به عملکرد باز می گردد ، اما تا آن زمان محتویات مانند یک متغیر ناشناخته رفتار می شوند و بنابراین نامشخص هستند. روش صحیح پردازش داده های پرونده در داخل عملکرد پاسخ به تماس است ، اما من نمی توانم جزئیات بیشتری کسب کنم زیرا این یک مورد نیست آموزش گره. ��

پاسخ به تماس تلفنی که پاسخ به تماس با شما را می دهد . . .

جاوا اسکریپت به برنامه نویسی کاربردی نزدیکتر است که هر زبان قدیمی قدیمی و اصلی دیگری (در واقع همه گفته ها و کارهای انجام شده ، مورد علاقه من است وقتی صحبت از شیء گرا و قابلیت های کاربردی می شود – من آن را بالاتر از پایتون ، PHP ، Perl ، جاوا و … قرار می دهم. حتی روبی هنگام نوشتن کد “لذت بخش” می آید).

یعنی توابع از حقوق شهروندی بیشتری نسبت به سایر زبانها برخوردار می شوند. این موضوع را با این واقعیت همراه کنید که کد ناهمزمان با ارائه یک عملکرد پاسخ به تماس ، کار می کند و ما در پایان به دستور العمل فاجعه معروف به Callback Hell می پردازیم.

در اینجا نمونه ای از کد الکترون وجود دارد که من در Quora با آن برخورد کردم. به نظر شما چه کاری انجام می دهد?

گزینه های var؛

نیاز به (“الکترونی”). app.once (
‘آماده’,

تابع () {

گزینه ها = {
قاب: نادرست,
ارتفاع: 768,
عرض: 1024,
x: 0,
y: 0
؛

options.BrowserWindow = نیاز (“الکترونی”). BrowserWindow؛
options.browserWindow = گزینه های جدید.BrowserWindow (گزینه ها)؛
options.browserWindow.loadURL (‘http://electron.atom.io’)؛
options.browserWindow.webContents.once (
‘متوقف شد بارگیری’,

تابع () {
options.browserWindow.capturePage (
گزینه ها,

تابع (داده) {
((fs)) را بنویسید. writeFileSync (
‘/tmp/screenCapture.testExampleJs.browser..png’,
data.toPng ()

process.exit (0)؛
}

}

}

اگر کار سختی دارید ، به این باشگاه بپیوندید!

توابع داخل توابع قابل خواندن کار دشواری است و استدلال در آن بسیار سخت است ، به همین دلیل آن را “جهنم برگشت پذیر” می نامند (گمان می کنم جهنم مکانی گیج کننده برای خارج شدن از آن است!). در حالی که این از نظر فنی کار می کند ، شما می توانید کد خود را از هرگونه تلاش برای فهم و نگهداری در آینده اثبات کنید.

روش های بسیاری برای جلوگیری از بازگشت به جهنم ، از جمله وجود دارد وعده ها و پسوندهای واکنشی.

عدم استفاده از تمام هسته های CPU

پردازنده های مدرن دارای چندین هسته – 2 ، 4 ، 8 ، 16 ، 32 هستند. . . تعداد همچنان در حال صعود است.

اما این چیزی نیست که خالق نود هنگام انتشار نود در ذهن داشت. در نتیجه ، گره تک رشته ای است ، به این معنی که درون یک رشته واحد اجرا می شود (یا فرایندی را می خواهید انجام دهید ، اگر می خواهید آنرا صدا کنید که اگرچه آنها یکسان نیستند) ، تنها از یک هسته پردازنده استفاده می.

این بدان معناست که اگر شما نود را از آموزش ها و دوستان و قطعه های کد شناور در اطراف یاد گرفته اید و برنامه خود را روی یک سرور 8 هسته ای مستقر کرده اید ، 7/8 از قدرت پردازش موجود را تلف نمی کنید.!

لازم به گفتن نیست ، این یک زباله عظیم است. اگر این مسیر را دنبال کنید ، در صورت نیاز به تنها یک سرور ، هزینه هشت سرور را پرداخت خواهید کرد. یعنی 16000 دلار در هر ماه خرج کنید وقتی 2000 دلار انجام می دهد (از دست دادن پول همیشه صدمه می زند ، درست است؟). همه اینها ، وقتی راه حل بسیار ساده است: با استفاده از خوشه مدول.

من نمی توانم در اینجا تمام جزئیات را بررسی کنم ، اما این یک تکنیک ساده برای تشخیص تعداد هسته هسته دستگاه فعلی و سپس راه اندازی آن بسیاری از موارد گره است. با شناسایی خطاها ، نمونه مجدداً شروع می شود. در اینجا چگونگی اجرای ساده (آموزش) آورده شده است اینجا):

var cluster = نیاز (“خوشه”)؛

if (cluster.isMaster)
var numWorkers = نیاز (“OS”). cpus () طول.

console.log (“راه اندازی استاد خوشه” + numWorkers + “کارگران …”)؛

برای (var i = 0؛ i < numWorkers؛ من ++) {
cluster.fork ()؛
}

cluster.on (“آنلاین” ، عملکرد (کارگر) {
console.log (“کارگر” + working.process.pid + “آنلاین است”)؛
})؛

cluster.on (“خروج” ، عملکرد (کارگر ، کد ، سیگنال) {
console.log (“کارگر” + working.process.pid + “با کد:” + کد + “، و سیگنال درگذشت:” + سیگنال “).
console.log (‘شروع کار جدید’)؛
cluster.fork ()؛
})؛
} دیگه
var app = نیاز (“اکسپرس”) ()؛
app.all (‘/ *’ ، تابع (req ، res) {res.send (“پردازش” + process.pid + “می گوید سلام!”). پایان ()؛})

var server = app.listen (8000 ، عملکرد () {
console.log (“پردازش” + process.pid + “به تمام درخواستهای دریافتی گوش می کند”)؛
})؛
}

همانطور که مشاهده می کنید ، cluster.fork () سحر و جادو را انجام می دهد ، و بقیه به سادگی گوش دادن به یک زن و شوهر از رویدادهای اساسی خوشه و انجام پاک سازی لازم را انجام می دهند.

از TypeScript استفاده نمی کنید

خوب ، اشتباه نیست ، به همین ترتیب ، و تعداد زیادی برنامه نود بدون TypeScript نوشتند و در حال نوشتن هستند.

به گفته این ، TypeScript ضمانت و آرامشی را که نود همیشه به آن نیاز داشت ارائه می دهد و از نظر من این اشتباه است اگر در سال 2019 برای Node کار می کنید و از TypeScript استفاده نمی کنید (به ویژه هنگامی که A (زاویه ای) در پشته MEAN حرکت کرد. به TypeScript مدتها قبل).

انتقال ملایم است و TypeScript تقریباً دقیقاً مانند JavaScript است که شما می شناسید ، با اطمینان از انواع ، ES6 و چند چک دیگر که در آن پر شده است:

// /lib/controllers/crmController.ts
واردات * را به عنوان مانگوز از ‘mongoose’؛
وارد کردن {ContactSchema} از ‘../models/crmModel’؛
وارد کردن {درخواست ، پاسخ} از ‘Express’؛

const Contact = mongoose.model (‘Contact’، ContactSchema)؛
کلاس صادرات ContactController

عمومی addNewContact (req: درخواست ، پاسخ: پاسخ) {
اجازه دهید newContact = مخاطب جدید (req.body)؛

newContact.save ((خطا ، مخاطب) =)> {
اگر (اشتباه)
res.send (err)؛
}
res.json (مخاطب)؛
})؛
}

من توصیه می کنم این خوب و دوستانه را بررسی کنید آموزش TypeScript.

نتیجه

گره چشمگیر است ، اما بدون مشکلات (بسیاری از آن) نیست. به گفته این ، این برای همه فن آوری های موجود در خارج ، جدید و قدیمی صدق می کند ، و ما بهتر است نود را بفهمیم و با آن کار کنیم.

امیدوارم این پنج نکته نتوانند شما را از خوردن اشکالات چندین ساله و مشکلات مربوط به عملکرد شما جلوگیری کنند. اگر چیز جالبی را از دست دادم ، لطفاً به من اطلاع دهید ، و من از اینکه آنها را در مقاله گنجانده شادتر خواهم شد (در واقع ، سپاسگزار!) ��

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map