ঠিক আছে, এটি কিছুক্ষণ হয়ে গেছে এবং এটি একটি জনপ্রিয় প্রশ্ন, তাই আমি এগিয়ে গিয়ে জাভাস্ক্রিপ্ট কোড সহ একটি স্ক্যাফোল্ডিং গিথুব সংগ্রহশালা তৈরি করেছি এবং আমি কীভাবে মাঝারি আকারের এক্সপ্রেস.জেএস অ্যাপ্লিকেশনটি গঠন করতে চাই সে সম্পর্কে একটি দীর্ঘ README তৈরি করেছি।
ফোকাসাউরাস / এক্সপ্রেস_কোড_ কাঠামো এটির জন্য সর্বশেষতম কোড সহ রেপো। অনুরোধ স্বাগত টান।
এখানে README এর একটি স্ন্যাপশট যেহেতু স্ট্যাকওভারফ্লো জাস্ট-এ-লিঙ্কের উত্তর পছন্দ করে না। আমি কিছু আপডেট করব কারণ এটি একটি নতুন প্রকল্প যা আমি আপডেট করা চালিয়ে যাব, তবে শেষ পর্যন্ত গিথুব রেপো এই তথ্যের জন্য আপ-টু-ডেট জায়গা হবে।
এক্সপ্রেস কোড স্ট্রাকচার
এই প্রকল্পটি একটি মাঝারি আকারের এক্সপ্রেস.জেএস ওয়েব অ্যাপ্লিকেশনটি কীভাবে সংগঠিত করা যায় তার একটি উদাহরণ।
কমপক্ষে এক্সপ্রেস v4.14 ডিসেম্বর 2016 এ বর্তমান
আপনার আবেদন কত বড়?
ওয়েব অ্যাপ্লিকেশনগুলি সমস্ত একই নয় এবং আমার মতে একটি একক কোড কাঠামো যা সমস্ত এক্সপ্রেস.জেএস অ্যাপ্লিকেশনগুলিতে প্রয়োগ করা উচিত।
আপনার অ্যাপ্লিকেশন যদি ছোট হয় তবে উদাহরণ হিসাবে এখানে আপনার এত গভীর ডিরেক্টরি কাঠামোর দরকার নেই। কেবল এটিকে সরল রাখুন এবং আপনার ভান্ডারটির মূলটিতে কয়েকটি মুঠো .js
ফাইল আটকে দিন এবং আপনার কাজ শেষ হয়েছে। Voila।
যদি আপনার অ্যাপ্লিকেশনটি বিশাল হয় তবে কোনও সময় আপনাকে এটিকে আলাদা এনপিএম প্যাকেজগুলিতে বিভক্ত করতে হবে। সাধারণত নোড.জেএস পদ্ধতির পক্ষে অনেকগুলি ছোট প্যাকেজ, কমপক্ষে লাইব্রেরির পক্ষে রয়েছে বলে মনে হয় এবং আপনার বেশ কয়েকটি এনপিএম প্যাকেজ ব্যবহার করে আপনার অ্যাপ্লিকেশনটি তৈরি করা উচিত যা এটি বোঝার জন্য এবং ওভারহেডকে ন্যায়সঙ্গত করতে শুরু করে। সুতরাং আপনার অ্যাপ্লিকেশনটি বাড়ার সাথে সাথে কোডের কিছু অংশ আপনার অ্যাপ্লিকেশনের বাইরে পরিষ্কারভাবে পুনরায় ব্যবহারযোগ্য হয়ে ওঠে বা একটি পরিষ্কার সাবসিস্টেম হয়, এটিকে তার নিজস্ব গিট রিপোজিটরিতে স্থানান্তরিত করুন এবং এটিকে স্ট্যান্ডেলোন এনপিএম প্যাকেজে পরিণত করুন।
সুতরাং এই প্রকল্পের কেন্দ্রবিন্দু হল একটি মাঝারি আকারের অ্যাপ্লিকেশনটির জন্য কার্যক্ষম কাঠামো চিত্রিত করা।
আপনার সামগ্রিক স্থাপত্য কি
ওয়েব অ্যাপ্লিকেশন তৈরির জন্য অনেকগুলি পন্থা রয়েছে যেমন
- সার্ভার সাইড এমভিসি একটি লা রুবি রেলগুলিতে
- একক পৃষ্ঠার অ্যাপ্লিকেশন শৈলী একটি লা মঙ্গোডিবি / এক্সপ্রেস / অ্যাঙ্গুলার / নোড (এমইএএন)
- কিছু ফর্ম সহ বেসিক ওয়েব সাইট
- মডেলস / অপারেশনস / ভিউ / ইভেন্টস স্টাইলটিতে একটি লা এমভিসি মারা গেছে, সময়টি মুভি করার
- এবং বর্তমান এবং bothতিহাসিক উভয়ই
এগুলির প্রত্যেকটি আলাদা আলাদা ডিরেক্টরি কাঠামোর সাথে সুন্দরভাবে ফিট করে। এই উদাহরণের উদ্দেশ্যগুলির জন্য, এটি কেবল ভাসমান এবং সম্পূর্ণরূপে কার্যকারী অ্যাপ নয়, তবে আমি নিম্নলিখিত মূল আর্কিটেকচার পয়েন্টগুলি ধরে নিচ্ছি:
- সাইটে কয়েকটি traditionalতিহ্যবাহী স্থির পৃষ্ঠাগুলি / টেম্পলেট রয়েছে
- সাইটের "অ্যাপ্লিকেশন" অংশটি একটি একক পৃষ্ঠা অ্যাপ্লিকেশন শৈলী হিসাবে বিকাশিত
- অ্যাপ্লিকেশনটি ব্রাউজারে একটি REST / JSON স্টাইলের API প্রকাশ করে
- অ্যাপ্লিকেশন মডেলগুলি একটি সাধারণ ব্যবসায়িক ডোমেন, এই ক্ষেত্রে এটি একটি গাড়ি ডিলারশিপ অ্যাপ্লিকেশন
আর রুবেল সম্পর্কে কি?
এটি পুরো প্রকল্পের একটি থিম হবে যা রবি অন রেলস এবং অনেকগুলি গ্রহণযোগ্য ও ব্যবহৃত হলেও, "কনফিগারেশন ওভার কনফিগারেশন" সিদ্ধান্ত গ্রহণ করেছে, বাস্তবে খুব সহায়ক হয় না এবং কখনও কখনও এই সংগ্রহস্থলের বিপরীত হয় পরামর্শ দেওয়া হচ্ছে।
এখানে আমার মূল বক্তব্যটি হচ্ছে কোডটি সাংগঠনিক করার অন্তর্নিহিত নীতিগুলি রয়েছে এবং সেই নীতিগুলির উপর ভিত্তি করে, রবি অন রেলস কনভেনশনগুলি (বেশিরভাগ ক্ষেত্রে) রিল অন রেল সম্প্রদায়ের জন্য অর্থবোধ করে। তবে, এই সম্মেলনগুলিকে কেবল নির্দ্বিধায় আবেদন করা বিষয়টিকে বাদ দেয়। একবার আপনি মৌলিক নীতিগুলি ছাঁটাইয়ের পরে, আপনার সমস্ত প্রকল্পগুলি সুসংহত এবং পরিষ্কার হবে: শেল স্ক্রিপ্ট, গেমস, মোবাইল অ্যাপস, এন্টারপ্রাইজ প্রকল্পগুলি এমনকি আপনার হোম ডিরেক্টরি।
রেল সম্প্রদায়ের জন্য, তারা অ্যাপ্লিকেশন থেকে অ্যাপ্লিকেশানে একটি একক রেল বিকাশকারী স্যুইচ করতে সক্ষম হতে চায় এবং প্রতিটি সময় এটির সাথে পরিচিত এবং আরামদায়ক হতে পারে। আপনি যদি 37 সিগন্যাল বা পিভোটাল ল্যাবস হন এবং এর সুবিধাগুলি থেকে থাকে তবে এটি দুর্দান্ত ধারণা দেয়। সার্ভার-সাইড জাভাস্ক্রিপ্ট বিশ্বে, সামগ্রিক নীতিগুলি কেবল আরও কিছুটা বন্য পশ্চিমের দিকে যায় এবং আমাদের এতে সত্যিই সমস্যা হয় না। এটা আমরা কিভাবে তালিকা করব. আমরা এটি অভ্যস্ত। এমনকি এক্সপ্রেস.জেজেসের মধ্যেও, এটি সিনাট্রার এক নিকটাত্মীয়, জেল নয়, এবং রেলের কাছ থেকে সম্মেলন নেওয়া সাধারণত কোনওরকম সাহায্য করে না। এমনকি কনফিগারেশন ওভার কনফিগারেশন ওভার প্রিন্সিপাল বলতে চাই ।
অন্তর্নিহিত নীতি ও প্রেরণা
অ্যাপ্লিকেশন syMLink কৌশল
নোড.জেএস এর জন্য বৃহত্তর উন্নততর স্থানীয় লোকের প্রয়োজন পথের মধ্যে সম্প্রদায়ের দ্বারা দৈর্ঘ্যে অনেকগুলি পদ্ধতির রূপরেখা এবং আলোচনা করা হয়েছে । আমি শীঘ্রই "কেবলমাত্র প্রচুর ../../../ .. .." এর সাথে অগ্রাধিকার দেওয়ার বা প্রয়োজনীয় ফর্ম মড্লু ব্যবহার করার সিদ্ধান্ত নিতে পারি। যাইহোক, এই মুহুর্তে, আমি নীচে বিশদ সিমলিংক ট্রিক ব্যবহার করছি।
সুতরাং আন্তঃ-প্রকল্প এড়ানোর জন্য একটি উপায়ের মতো বিরক্তিকর আপেক্ষিক পাথের দরকার require("../../../config")
যেমন নিম্নলিখিত কৌশলটি ব্যবহার করা:
- আপনার অ্যাপ্লিকেশনটির জন্য নোড_মডিউলগুলির অধীনে একটি সিমিলিংক তৈরি করুন
- সিডি নোড_মডিউলসমূহ && ln -nsf ../app
- গিটে কেবল নোড_মডিউলস / অ্যাপ্লিকেশন সিমলিংক যোগ করুন , পুরো নোড_মডিউলগুলি ফোল্ডারটি নয়
- গিট অ্যাড -ফ নোড_মডিউলস / অ্যাপ্লিকেশন
- হ্যাঁ, আপনার
.gitignore
ফাইলটিতে এখনও "নোড_মডিউল" থাকা উচিত
- না, আপনার গিট সংগ্রহস্থলের মধ্যে "নোড_মডিউলগুলি" লাগানো উচিত নয়। কিছু লোক আপনাকে এটি করার পরামর্শ দিবে। সেগুলি ভুল।
- এখন আপনার এই উপসর্গটি ব্যবহার করে অন্তর্-প্রকল্পের মডিউলগুলির প্রয়োজন হতে পারে
var config = require("app/config");
var DealModel = require("app/deals/deal-model")
;
- মূলত, এটি অন্তর্-প্রকল্পের বাহ্যিক এনপিএম মডিউলগুলির জন্য খুব একইভাবে কাজের প্রয়োজন করে তোলে।
- দুঃখিত, উইন্ডোজ ব্যবহারকারীগণ, আপনার পিতামাতার ডিরেক্টরি আপেক্ষিক পাথের সাথে আটকে থাকা দরকার।
কনফিগারেশন
সাধারণত কোড মডিউল এবং ক্লাসগুলি কেবলমাত্র একটি বেসিক জাভাস্ক্রিপ্ট options
অবজেক্টটি পাস করার আশা করতে কোড app/server.js
দেয়app/config.js
মডিউলটি । সেখান থেকে এটি options
প্রয়োজন অনুসারে সাবসিস্টেমগুলি কনফিগার করতে ছোট ছোট অবজেক্টগুলিকে সংশ্লেষিত করতে পারে তবে অতিরিক্ত উপাত্ততায় পূর্ণ একটি বৃহত বৈশ্বিক কনফিগার মডিউলে প্রতিটি সাবসিস্টেমকে সংযুক্ত করা খারাপ যুগল coup
ডিবি সংযোগগুলি কেন্দ্রিয়করণের চেষ্টা করুন এবং সংযোগের পরামিতিগুলি পাস করার এবং সাবসিস্টেমগুলি নিজেরাই বহির্গামী সংযোগগুলি তৈরি করার বিপরীতে সাবসিস্টেমগুলিতে পাস করার চেষ্টা করুন।
NODE_ENV
এটি অন্য প্রলোভনজনক তবে ভয়াবহ ধারণাটি রেলগুলি থেকে বহন করা হয়েছে। আপনার অ্যাপ্লিকেশনটিতে ঠিক 1 স্থান থাকা উচিত, app/config.js
এটি NODE_ENV
পরিবেশের পরিবর্তনশীলটিকে দেখায় । ক্লাস কনস্ট্রাক্টর আর্গুমেন্ট বা মডিউল কনফিগারেশন প্যারামিটার হিসাবে সমস্ত কিছুর একটি স্পষ্ট বিকল্প নেওয়া উচিত।
ইমেল মডিউলটিতে কীভাবে ইমেলগুলি সরবরাহ করা যায় সে সম্পর্কে কোনও বিকল্প থাকে (এসএমটিপি, লগ স্টাডাউটে, কাতারে রাখুন ইত্যাদি), এটির মতো একটি বিকল্প নেওয়া উচিত {deliver: 'stdout'}
তবে এটি একেবারে পরীক্ষা করা উচিত নয় NODE_ENV
।
টেস্ট
আমি এখন আমার পরীক্ষার ফাইলগুলিকে তাদের সংশ্লিষ্ট কোডের মতো একই ডিরেক্টরিতে রাখি এবং প্রোডাকশন কোড থেকে পরীক্ষাগুলি আলাদা করতে ফাইলের নাম এক্সটেনশন নামকরণ কনভেনশন ব্যবহার করি।
foo.js
মডিউল "foo" এর কোড আছে
foo.tape.js
ফু জন্য নোড-ভিত্তিক পরীক্ষা আছে এবং একই dir বাস
foo.btape.js
ব্রাউজার পরিবেশে চালানো দরকার এমন পরীক্ষার জন্য ব্যবহার করা যেতে পারে
find . -name '*.tape.js'
প্রয়োজনীয় হিসাবে আমার সমস্ত পরীক্ষার অ্যাক্সেস পেতে আমি ফাইল সিস্টেম গ্লোব এবং কমান্ড ব্যবহার করি ।
প্রতিটি .js
মডিউল ফাইলের মধ্যে কীভাবে কোড সংগঠিত করবেন
এই প্রকল্পের ক্ষেত্রটি বেশিরভাগ ক্ষেত্রে ফাইল এবং ডিরেক্টরিগুলি কোথায় যায় সে সম্পর্কে and
- কমনজেএসের ব্লক খোলার জন্য রাষ্ট্রের নির্ভরতাগুলির জন্য কলগুলি প্রয়োজন
- খাঁটি-জাভাস্ক্রিপ্টের প্রধান কোড ব্লক। এখানে কোনও কমনজেএস দূষণ নেই। রফতানি, মডিউল বা প্রয়োজনীয়তা উল্লেখ করবেন না।
- রফতানি স্থাপনের জন্য কমনজেএসের ব্লক বন্ধ