এক্সপ্রেসজেএস কীভাবে কোনও অ্যাপ্লিকেশন গঠন করবেন?


526

আমি নোডজেএস-এর জন্য এক্সপ্রেসজেএস ওয়েব ফ্রেমওয়ার্ক ব্যবহার করছি।

এক্সপ্রেসজেএস ব্যবহার করা লোকেরা তাদের পরিবেশগুলি (উন্নয়ন, উত্পাদন, পরীক্ষা ...), তাদের রুটগুলি ইত্যাদিতে রাখে app.js। আমি মনে করি এটি কোনও সুন্দর উপায় নয় কারণ আপনার যখন বড় অ্যাপ্লিকেশন থাকে তখন অ্যাপ্লিকেশন.জেএসএস খুব বড়!

আমি এই ডিরেক্টরি কাঠামো পেতে চাই:

| my-application
| -- app.js
| -- config/
     | -- environment.js
     | -- routes.js

আমার কোডটি এখানে:

app.js

var express = require('express');
var app = module.exports = express.createServer();

require('./config/environment.js')(app, express);
require('./config/routes.js')(app);

app.listen(3000);

কনফিগ / environment.js

module.exports = function(app, express){
    app.configure(function() {
    app.use(express.logger());
    });

    app.configure('development', function() {
    app.use(express.errorHandler({
        dumpExceptions: true,
        showStack: true
    }));
    });

    app.configure('production', function() {
    app.use(express.errorHandler());
    });
};

কনফিগ / routes.js

module.exports = function(app) {
    app.get('/', function(req, res) {
    res.send('Hello world !');
    });
};

আমার কোডটি ভালভাবে কাজ করে এবং আমি মনে করি যে ডিরেক্টরিগুলির কাঠামোটি সুন্দর। তবে কোডটি মানিয়ে নিতে হয়েছিল এবং আমি নিশ্চিত যে এটি ভাল / সুন্দর।

আমার ডিরেক্টরিগুলির কাঠামোটি ব্যবহার করে কোডটি মানিয়ে নেওয়া বা কেবল একটি ফাইল (app.js) ব্যবহার করা কি ভাল?

আপনার পরামর্শের জন্য ধন্যবাদ!


এইভাবে এটি করার পারফর্মেন্স ইস্যুগুলি কি এখনও চারপাশে লুকিয়ে আছে? আমি কোথাও (সম্ভবত এক্সপ্রেস গ্রুপ) পড়া মনে করি যে আপনি যখন এই জাতীয় সবকিছু পৃথক করেন তখন আপনি এক টন পারফরম্যান্স হারাবেন। আপনার রেকস / সেকেন্ডের মতো কিছু লক্ষ্যযোগ্য পরিমাণে নেমে আসবে, প্রায় যেন এটি কোনও বাগ।
অ্যান্টেলোপসালাদ

2
এটি এক্সপ্রেস গুগল গ্রুপ থেকে ছিল। এখানে লিঙ্কটি রয়েছে: groups.google.com/group/express-js/browse_thread/thread/…
AntelopeSalad


উত্তর:


306

ঠিক আছে, এটি কিছুক্ষণ হয়ে গেছে এবং এটি একটি জনপ্রিয় প্রশ্ন, তাই আমি এগিয়ে গিয়ে জাভাস্ক্রিপ্ট কোড সহ একটি স্ক্যাফোল্ডিং গিথুব সংগ্রহশালা তৈরি করেছি এবং আমি কীভাবে মাঝারি আকারের এক্সপ্রেস.জেএস অ্যাপ্লিকেশনটি গঠন করতে চাই সে সম্পর্কে একটি দীর্ঘ README তৈরি করেছি।

ফোকাসাউরাস / এক্সপ্রেস_কোড_ কাঠামো এটির জন্য সর্বশেষতম কোড সহ রেপো। অনুরোধ স্বাগত টান।

এখানে README এর একটি স্ন্যাপশট যেহেতু স্ট্যাকওভারফ্লো জাস্ট-এ-লিঙ্কের উত্তর পছন্দ করে না। আমি কিছু আপডেট করব কারণ এটি একটি নতুন প্রকল্প যা আমি আপডেট করা চালিয়ে যাব, তবে শেষ পর্যন্ত গিথুব রেপো এই তথ্যের জন্য আপ-টু-ডেট জায়গা হবে।


এক্সপ্রেস কোড স্ট্রাকচার

এই প্রকল্পটি একটি মাঝারি আকারের এক্সপ্রেস.জেএস ওয়েব অ্যাপ্লিকেশনটি কীভাবে সংগঠিত করা যায় তার একটি উদাহরণ।

কমপক্ষে এক্সপ্রেস v4.14 ডিসেম্বর 2016 এ বর্তমান

স্থিতি তৈরি করুন

JS-মানক শৈলী

আপনার আবেদন কত বড়?

ওয়েব অ্যাপ্লিকেশনগুলি সমস্ত একই নয় এবং আমার মতে একটি একক কোড কাঠামো যা সমস্ত এক্সপ্রেস.জেএস অ্যাপ্লিকেশনগুলিতে প্রয়োগ করা উচিত।

আপনার অ্যাপ্লিকেশন যদি ছোট হয় তবে উদাহরণ হিসাবে এখানে আপনার এত গভীর ডিরেক্টরি কাঠামোর দরকার নেই। কেবল এটিকে সরল রাখুন এবং আপনার ভান্ডারটির মূলটিতে কয়েকটি মুঠো .jsফাইল আটকে দিন এবং আপনার কাজ শেষ হয়েছে। Voila।

যদি আপনার অ্যাপ্লিকেশনটি বিশাল হয় তবে কোনও সময় আপনাকে এটিকে আলাদা এনপিএম প্যাকেজগুলিতে বিভক্ত করতে হবে। সাধারণত নোড.জেএস পদ্ধতির পক্ষে অনেকগুলি ছোট প্যাকেজ, কমপক্ষে লাইব্রেরির পক্ষে রয়েছে বলে মনে হয় এবং আপনার বেশ কয়েকটি এনপিএম প্যাকেজ ব্যবহার করে আপনার অ্যাপ্লিকেশনটি তৈরি করা উচিত যা এটি বোঝার জন্য এবং ওভারহেডকে ন্যায়সঙ্গত করতে শুরু করে। সুতরাং আপনার অ্যাপ্লিকেশনটি বাড়ার সাথে সাথে কোডের কিছু অংশ আপনার অ্যাপ্লিকেশনের বাইরে পরিষ্কারভাবে পুনরায় ব্যবহারযোগ্য হয়ে ওঠে বা একটি পরিষ্কার সাবসিস্টেম হয়, এটিকে তার নিজস্ব গিট রিপোজিটরিতে স্থানান্তরিত করুন এবং এটিকে স্ট্যান্ডেলোন এনপিএম প্যাকেজে পরিণত করুন।

সুতরাং এই প্রকল্পের কেন্দ্রবিন্দু হল একটি মাঝারি আকারের অ্যাপ্লিকেশনটির জন্য কার্যক্ষম কাঠামো চিত্রিত করা।

আপনার সামগ্রিক স্থাপত্য কি

ওয়েব অ্যাপ্লিকেশন তৈরির জন্য অনেকগুলি পন্থা রয়েছে যেমন

  • সার্ভার সাইড এমভিসি একটি লা রুবি রেলগুলিতে
  • একক পৃষ্ঠার অ্যাপ্লিকেশন শৈলী একটি লা মঙ্গোডিবি / এক্সপ্রেস / অ্যাঙ্গুলার / নোড (এমইএএন)
  • কিছু ফর্ম সহ বেসিক ওয়েব সাইট
  • মডেলস / অপারেশনস / ভিউ / ইভেন্টস স্টাইলটিতে একটি লা এমভিসি মারা গেছে, সময়টি মুভি করার
  • এবং বর্তমান এবং bothতিহাসিক উভয়ই

এগুলির প্রত্যেকটি আলাদা আলাদা ডিরেক্টরি কাঠামোর সাথে সুন্দরভাবে ফিট করে। এই উদাহরণের উদ্দেশ্যগুলির জন্য, এটি কেবল ভাসমান এবং সম্পূর্ণরূপে কার্যকারী অ্যাপ নয়, তবে আমি নিম্নলিখিত মূল আর্কিটেকচার পয়েন্টগুলি ধরে নিচ্ছি:

  • সাইটে কয়েকটি traditionalতিহ্যবাহী স্থির পৃষ্ঠাগুলি / টেম্পলেট রয়েছে
  • সাইটের "অ্যাপ্লিকেশন" অংশটি একটি একক পৃষ্ঠা অ্যাপ্লিকেশন শৈলী হিসাবে বিকাশিত
  • অ্যাপ্লিকেশনটি ব্রাউজারে একটি REST / JSON স্টাইলের API প্রকাশ করে
  • অ্যাপ্লিকেশন মডেলগুলি একটি সাধারণ ব্যবসায়িক ডোমেন, এই ক্ষেত্রে এটি একটি গাড়ি ডিলারশিপ অ্যাপ্লিকেশন

আর রুবেল সম্পর্কে কি?

এটি পুরো প্রকল্পের একটি থিম হবে যা রবি অন রেলস এবং অনেকগুলি গ্রহণযোগ্য ও ব্যবহৃত হলেও, "কনফিগারেশন ওভার কনফিগারেশন" সিদ্ধান্ত গ্রহণ করেছে, বাস্তবে খুব সহায়ক হয় না এবং কখনও কখনও এই সংগ্রহস্থলের বিপরীত হয় পরামর্শ দেওয়া হচ্ছে।

এখানে আমার মূল বক্তব্যটি হচ্ছে কোডটি সাংগঠনিক করার অন্তর্নিহিত নীতিগুলি রয়েছে এবং সেই নীতিগুলির উপর ভিত্তি করে, রবি অন রেলস কনভেনশনগুলি (বেশিরভাগ ক্ষেত্রে) রিল অন রেল সম্প্রদায়ের জন্য অর্থবোধ করে। তবে, এই সম্মেলনগুলিকে কেবল নির্দ্বিধায় আবেদন করা বিষয়টিকে বাদ দেয়। একবার আপনি মৌলিক নীতিগুলি ছাঁটাইয়ের পরে, আপনার সমস্ত প্রকল্পগুলি সুসংহত এবং পরিষ্কার হবে: শেল স্ক্রিপ্ট, গেমস, মোবাইল অ্যাপস, এন্টারপ্রাইজ প্রকল্পগুলি এমনকি আপনার হোম ডিরেক্টরি।

রেল সম্প্রদায়ের জন্য, তারা অ্যাপ্লিকেশন থেকে অ্যাপ্লিকেশানে একটি একক রেল বিকাশকারী স্যুইচ করতে সক্ষম হতে চায় এবং প্রতিটি সময় এটির সাথে পরিচিত এবং আরামদায়ক হতে পারে। আপনি যদি 37 সিগন্যাল বা পিভোটাল ল্যাবস হন এবং এর সুবিধাগুলি থেকে থাকে তবে এটি দুর্দান্ত ধারণা দেয়। সার্ভার-সাইড জাভাস্ক্রিপ্ট বিশ্বে, সামগ্রিক নীতিগুলি কেবল আরও কিছুটা বন্য পশ্চিমের দিকে যায় এবং আমাদের এতে সত্যিই সমস্যা হয় না। এটা আমরা কিভাবে তালিকা করব. আমরা এটি অভ্যস্ত। এমনকি এক্সপ্রেস.জেজেসের মধ্যেও, এটি সিনাট্রার এক নিকটাত্মীয়, জেল নয়, এবং রেলের কাছ থেকে সম্মেলন নেওয়া সাধারণত কোনওরকম সাহায্য করে না। এমনকি কনফিগারেশন ওভার কনফিগারেশন ওভার প্রিন্সিপাল বলতে চাই ।

অন্তর্নিহিত নীতি ও প্রেরণা

  • মানসিকভাবে পরিচালনাযোগ্য হন
    • মস্তিষ্ক কেবল একবারে কয়েকটি সংখ্যক সম্পর্কিত বিষয় নিয়ে ডিল করতে এবং ভাবতে পারে। এজন্য আমরা ডিরেক্টরি ব্যবহার করি। এটি আমাদের ছোট ছোট অংশগুলিতে ফোকাস করে জটিলতা মোকাবেলা করতে সহায়তা করে।
  • আকার-উপযুক্ত হতে হবে
    • "মেনশন ডিরেক্টরিগুলি" তৈরি করবেন না যেখানে কেবল 1 টি ফাইল রয়েছে যেখানে কেবল 3 টি ডিরেক্টরি থাকে। আপনি উত্তরীয় সেরা অভ্যাসগুলিতে এটি ঘটতে দেখতে পারেন যা 10+ ফাইল ধরে রাখতে 10+ ডিরেক্টরি তৈরি করার ক্ষেত্রে ছোট প্রকল্পগুলিকে লজ্জা দেয় যখন 3 টি ফাইল সহ 1 ডিরেক্টরি আরও বেশি উপযুক্ত হবে। আপনি কাজ করার জন্য বাস চালাবেন না (যদি না আপনি বাসের চালক হন, তবে তারপরেও আপনার বাস চালনা এটি কাজ করে না), সুতরাং সেই ফাইল সিস্টেমের কাঠামো তৈরি করবেন না যা তাদের ভিতরে প্রকৃত ফাইল দ্বারা ন্যায়সঙ্গত নয় files ।
  • মডুলার কিন্তু বাস্তববাদী হন
    • নোড সম্প্রদায় সামগ্রিকভাবে ছোট মডিউলগুলির পক্ষে। আপনার অ্যাপ্লিকেশন থেকে পুরোপুরি আলাদাভাবে আলাদা করা যায় এমন কোনও কিছু অভ্যন্তরীণ ব্যবহারের জন্য মডিউলে তোলা উচিত বা এনপিএমে প্রকাশ্যে প্রকাশ করা উচিত। তবে, মাঝারি আকারের অ্যাপ্লিকেশনগুলির জন্য যা এখানে স্কোপ, এটির ওভারহেডটি যথাযথ মান ছাড়াই আপনার ওয়ার্কফ্লোতে টেডিয়াম যুক্ত করতে পারে। সুতরাং সেই সময়ের জন্য যখন আপনার কাছে এমন কিছু কোড রয়েছে যা প্রমাণিত হয়েছে তবে সম্পূর্ণ পৃথক এনপিএম মডিউলটিকে ন্যায়সঙ্গত করার পক্ষে যথেষ্ট নয়, কেবলমাত্র এই প্রত্যাশা সহ এটি একটি " প্রোটো-মডিউল " হিসাবে বিবেচনা করুন যে যখন এটি কিছু আকারের প্রান্তকে অতিক্রম করবে, তখন এটি বের করা হবে।
    • @ হাইজ 1 এনএক্স এর মতো কিছু অংশ এমনকি একটি app/node_modulesডিরেক্টরি অন্তর্ভুক্ত করে এবং প্রোটো-মডিউল ডিরেক্টরিগুলিতে package.jsonফাইলগুলি সেই সংক্রমণটি সহজ করার জন্য এবং একটি অনুস্মারক হিসাবে কাজ করে।
  • কোড সনাক্ত করতে সহজ হন
    • বিল্ড করার জন্য একটি বৈশিষ্ট্য দেওয়া বা ঠিক করার জন্য একটি বাগ দেওয়া হয়েছে, আমাদের লক্ষ্য হ'ল কোনও বিকাশকারী জড়িত উত্স ফাইলগুলি সনাক্ত করতে কোনও লড়াই করেন না।
    • নামগুলি অর্থবহ এবং নির্ভুল
    • ক্রুফটি কোড পুরোপুরি সরিয়ে ফেলা হয়েছে, এতিম ফাইলে রেখে দেওয়া বা কেবল মন্তব্য করা হয়নি
  • অনুসন্ধান-বান্ধব হন
    • সমস্ত প্রথম পক্ষের উত্স কোডটি appডিরেক্টরিতে থাকে যাতে আপনি cdচালাতে / গ্রেপ / এক্সার্গস / এজি / এসি / ইত্যাদি চালাতে পারেন এবং তৃতীয় পক্ষের ম্যাচগুলিতে বিভ্রান্ত না হয়ে
  • সহজ এবং সুস্পষ্ট নামকরণ ব্যবহার করুন
    • এনপিএম এখন সমস্ত-ছোট হাতের প্যাকেজের নাম প্রয়োজন বলে মনে হচ্ছে। আমি এটি বেশিরভাগই ভয়ানক মনে করি তবে আমি অবশ্যই পশুপালনটি অনুসরণ করি, সুতরাং kebab-caseজাভাস্ক্রিপ্টে এর জন্য চলক নাম হওয়া উচিত যদিও ফাইলের নামগুলি ব্যবহার করা উচিত camelCaseকারণ -এটি জাভাস্ক্রিপ্টে একটি বিয়োগ চিহ্ন।
    • পরিবর্তনশীল নামটি মডিউল পাথের বেসনামের সাথে মেলে তবে kebab-caseরূপান্তরিত হয়েcamelCase
  • গ্রুপ অনুসারে কাপলিং, ফাংশন দ্বারা নয়
    • এই রুবি পাগল সম্মেলন থেকে একটি প্রধান দুর্ভিক্ষ হয় app/views, app/controllers, app/models, ইত্যাদি
    • বৈশিষ্ট্যগুলি একটি সম্পূর্ণ স্ট্যাকের সাথে যুক্ত হয়, তাই আমি আমার বৈশিষ্ট্যের সাথে প্রাসঙ্গিক ফাইলগুলির একটি সম্পূর্ণ স্ট্যাকের দিকে ফোকাস করতে চাই। যখন আমি ব্যবহারকারীর মডেলটিতে একটি টেলিফোন নম্বর ক্ষেত্র যুক্ত করি, তখন আমি ব্যবহারকারীর নিয়ামক ব্যতীত অন্য কোনও নিয়ামকের বিষয়ে চিন্তা করি না এবং আমি ব্যবহারকারীর মডেল ব্যতীত অন্য কোনও মডেল সম্পর্কে চিন্তা করি না।
    • সুতরাং তাদের নিজস্ব ডিরেক্টরিতে প্রতিটি files টি ফাইল সম্পাদনা করার পরিবর্তে এবং সেই ডিরেক্টরিগুলিতে আরও অনেকগুলি ফাইল উপেক্ষা করার পরিবর্তে, এই সংগ্রহস্থলটি এমনভাবে সজ্জিত করা হয়েছে যাতে আমার একটি বৈশিষ্ট্য তৈরি করার জন্য প্রয়োজনীয় সমস্ত ফাইল একত্রিত করা হয়
    • এমভিসির প্রকৃতি অনুসারে, ব্যবহারকারী দৃষ্টিভঙ্গিটি ব্যবহারকারী নিয়ামকের সাথে মিলিত হয় যা ব্যবহারকারীর মডেলটির সাথে মিলিত হয়। সুতরাং যখন আমি ব্যবহারকারীর মডেলটি পরিবর্তন করি, তখন এই 3 টি ফাইল প্রায়শই একসাথে পরিবর্তিত হয়, তবে ডিলগুলি নিয়ন্ত্রক বা গ্রাহক নিয়ন্ত্রক ডিউপলড হয় এবং সুতরাং এতে জড়িত হয় না। একই জিনিস সাধারণত নন-এমভিসি ডিজাইনের ক্ষেত্রেও প্রযোজ্য।
    • এমভিসি বা মোভ শৈলীর ডিউপলিংয়ের ক্ষেত্রে কোন কোডটি যায় কোন মডিউলটিতে এখনও উত্সাহ দেওয়া হয় তবে এমভিসি ফাইলগুলি ভাইবোন ডিরেক্টরিতে ছড়িয়ে দেওয়া কেবল বিরক্তিকর।
    • এইভাবে আমার প্রতিটি রুট ফাইলের নিজস্ব রুটের অংশ রয়েছে। routes.rbআপনি যদি অ্যাপ্লিকেশনটিতে সমস্ত রুটের একটি ওভারভিউ চান তবে একটি রেল-স্টাইল ফাইল হ'ল তবে আপনি যখন বৈশিষ্ট্যগুলি তৈরি করছেন এবং বাগগুলি ঠিক করছেন তখন কেবলমাত্র আপনি যে টুকরোটি পরিবর্তন করছেন তার সাথে সম্পর্কিত রুটগুলিই যত্নবান হন care
  • কোডের পাশেই পরীক্ষা করুন
    • এটি "সংযুক্ত হয়ে গ্রুপ" এর উদাহরণ মাত্র, তবে আমি এটি বিশেষভাবে কল করতে চেয়েছিলাম। আমি অনেকগুলি প্রকল্প লিখেছি যেখানে পরীক্ষাগুলি একটি "সমীক্ষা" নামক সমান্তরাল ফাইল সিস্টেমের অধীনে থাকে এবং এখন যেহেতু আমি আমার পরীক্ষাগুলি তাদের সংশ্লিষ্ট কোড হিসাবে একই ডিরেক্টরিতে রেখে শুরু করেছি, আমি কখনই ফিরে যাব না। এটি পাঠ্য সম্পাদকগণের সাথে কাজ করা আরও মডিউলার এবং অনেক সহজ এবং "../../ .." "পথের বাজে কথাগুলি হ্রাস করে। যদি আপনার সন্দেহ হয় তবে কয়েকটি প্রকল্পে চেষ্টা করে দেখুন এবং নিজেই সিদ্ধান্ত নিন। আমি আপনাকে বোঝাতে এটির চেয়েও ভাল কিছু করতে যাচ্ছি না better
  • ইভেন্টগুলির সাথে ক্রস-কাটিং কাপলিং হ্রাস করুন
    • "ঠিক আছে, যখনই কোনও নতুন ডিল তৈরি হয়, আমি সমস্ত বিক্রয়কর্মীর কাছে একটি ইমেল প্রেরণ করতে চাই", এটি ভাবতে সহজ হয় এবং তারপরে সেই ইমেলগুলি যে পথে ডিল তৈরি করে তা প্রেরণে কোডটি রেখে দেওয়া হয়।
    • যাইহোক, এই সংমিশ্রণটি শেষ পর্যন্ত আপনার অ্যাপটিকে কাদার দৈত্য বল হিসাবে রূপান্তরিত করবে।
    • পরিবর্তে, ডিলমোডেলকে কেবল একটি "তৈরি" ইভেন্ট চালিয়ে দেওয়া উচিত এবং এর প্রতিক্রিয়াতে সিস্টেম আরও কী করতে পারে সে সম্পর্কে সম্পূর্ণ অজানা।
    • আপনি যখন এইভাবে কোড করেন, তখন ব্যবহারকারীর সাথে সম্পর্কিত সমস্ত কোডটি স্থাপন করা আরও অনেক বেশি সম্ভব হয়ে ওঠে app/usersকারণ সেখানে ইউজার কোড বেসের বিশুদ্ধতা দূষিত করার জায়গাতে জুড়ে ব্যবসায়িক যুক্তির কোনও ইঁদুরের বাসা নেই।
  • কোড প্রবাহ অনুসরণযোগ্য
    • যাদু জিনিস না। ফাইল সিস্টেমে ম্যাজিক ডিরেক্টরি থেকে ফাইলগুলি অটোল্যাড করবেন না। রিয়েল না। অ্যাপ্লিকেশনটি শুরু হয় app/server.js:1এবং কোডটি অনুসরণ করে আপনি এটি লোড করে এবং কার্যকর করেন এমন সমস্ত কিছু দেখতে পাবেন।
    • আপনার রুটের জন্য ডিএসএল তৈরি করবেন না। যখন এটির জন্য ডাকা হয় না তখন মূর্খ রূপক কাজ করবেন না।
    • যদি আপনার অ্যাপটি যে এত বড় করছে magicRESTRouter.route(somecontroller, {except: 'POST'})বড় জয় জন্য তোমাদের উপর 3 মৌলিক app.get, app.put, app.delকল, আপনি সম্ভবত যে কার্যকরভাবে কাজ করার অত্যন্ত বড় একটি একশিলা অ্যাপ্লিকেশন তৈরি করছেন। 3 টি সাধারণ লাইনকে 1 জটিল লাইনে রূপান্তর করার জন্য নয়, বিআইজি জয়ের জন্য অভিনবতা পান।
  • লোয়ার কাবাব-কেস ফাইলের নাম ব্যবহার করুন

    • এই ফর্ম্যাটটি প্ল্যাটফর্মগুলিতে ফাইল সিস্টেমের ক্ষেত্রে সংবেদনশীলতা সম্পর্কিত সমস্যাগুলি এড়িয়ে চলে
    • এনপিএম নতুন প্যাকেজের নামগুলিতে বড় হাতের অক্ষম করে এবং এটি এটির সাথে ভালভাবে কাজ করে

      express.js নির্দিষ্টকরণ

  • ব্যবহার করবেন না app.configure। এটি প্রায় সম্পূর্ণ অকেজো এবং আপনার এটির দরকার নেই। বুদ্ধিহীন কোপাইপাস্টার কারণে এটি প্রচুর বয়লারপ্লেটে রয়েছে।

  • মিডলওয়্যারের অর্ডার এবং এক্সপ্রেস ম্যাটারগুলিতে রুটগুলি !!!
    • স্ট্যাকওভারফ্লোতে দেখা প্রায় প্রতিটি রাউটিং সমস্যা হ'ল আউট-অফ-অর্ডার এক্সপ্রেস মিডলওয়্যার
    • সাধারণভাবে, আপনি চান যে আপনার রুটগুলি decoupled হয়েছে এবং এত বেশি অর্ডারের উপর নির্ভর করে না
    • app.useআপনার যদি সত্যিই কেবল 2 টি রুটের জন্য মিডলওয়্যারের প্রয়োজন হয় তবে আপনার পুরো অ্যাপ্লিকেশনটির জন্য ব্যবহার করবেন না (আমি আপনাকে দেখছি, body-parser)
    • যখন সমস্ত কিছু বলা হয় এবং হয়ে যায় আপনি ঠিক ঠিক এই অর্ডারটি নিশ্চিত করেছেন:
      1. যে কোনও অতি-গুরুত্বপূর্ণ অ্যাপ্লিকেশন-প্রশস্ত মিডলওয়্যার
      2. আপনার সমস্ত রুট এবং বিভিন্ন রুটের মিডলওয়্যারগুলি
      3. ত্রুটি পরিচালনাকারীরা
  • দুঃখের বিষয়, সিনাত্রা-অনুপ্রাণিত হয়ে এক্সপ্রেস.জে আপনার বেশিরভাগ রুট আসবে server.jsএবং এটি কীভাবে অর্ডার করা হয়েছে তা স্পষ্ট হবে। একটি মাঝারি আকারের অ্যাপ্লিকেশনের জন্য, পৃথক রুটগুলির মডিউলগুলিতে জিনিসগুলি ভাঙা দুর্দান্ত, তবে এটি অর্ডার-অফ-মিডলওয়্যারের বিপদটি প্রকাশ করে does

অ্যাপ্লিকেশন 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

  1. কমনজেএসের ব্লক খোলার জন্য রাষ্ট্রের নির্ভরতাগুলির জন্য কলগুলি প্রয়োজন
  2. খাঁটি-জাভাস্ক্রিপ্টের প্রধান কোড ব্লক। এখানে কোনও কমনজেএস দূষণ নেই। রফতানি, মডিউল বা প্রয়োজনীয়তা উল্লেখ করবেন না।
  3. রফতানি স্থাপনের জন্য কমনজেএসের ব্লক বন্ধ

1
বডি পার্সারের পরিবর্তে আমার কী ব্যবহার করা উচিত যদি আমার কাছে এটি ব্যবহার করার মতো কয়েকটি রুট থাকে?
ইলান ফ্রুমার

3
: আমি আমি এখানে খুঁজছেন ছিল পাওয়া stackoverflow.com/questions/12418372/...
Ilan Frumer

1
এই সমস্যাটির জন্য উপলব্ধ পদ্ধতির বিশদ আলোচনা করার জন্য @ ওলিংক gist.github.com/branneman/8048520 দেখুন
পিটার লায়ন্স

@ পেটারলায়ন্স এটি ভাগ করে নেওয়ার জন্য ধন্যবাদ। পড়ার পরে, আমি মনে করি আমি একটি স্টার্টআপ স্ক্রিপ্ট লিখব। ধন্যবাদ!
উইলিংক

2
শুভেচ্ছা সঙ্গে অ্যাপ্লিকেশন সিমবলিক লিঙ্ক কৌতুক , সেখানে এই সামান্য মডিউল যার ফলে সব সমস্যার দূরে যেতে
Hayko Koryun

157

আপডেট (২০১৩-১০-২৯) : দয়া করে আমার অন্য উত্তরগুলিও দেখুন যা জনপ্রিয় চাহিদা অনুসারে কফিস্ক্রিপ্টের পরিবর্তে জাভাস্ক্রিপ্ট পাশাপাশি বয়লারপ্লেট গিথুব রেপো এবং এই বিষয়ে আমার সর্বশেষ সুপারিশগুলির বিশদ পুনঃনির্মাণ রয়েছে।

কনফিগ

আপনি কি করছেন ঠিক আছে। আমার নিজের কনফিগারেশন নেমস্পেসটি config.coffeeএমন একটি নেস্টেড নেমস্পেসের সাথে একটি শীর্ষ-স্তরের ফাইলটিতে সেট আপ করতে চাই।

#Set the current environment to true in the env object
currentEnv = process.env.NODE_ENV or 'development'
exports.appName = "MyApp"
exports.env =
  production: false
  staging: false
  test: false
  development: false
exports.env[currentEnv] = true
exports.log =
  path: __dirname + "/var/log/app_#{currentEnv}.log"
exports.server =
  port: 9600
  #In staging and production, listen loopback. nginx listens on the network.
  ip: '127.0.0.1'
if currentEnv not in ['production', 'staging']
  exports.enableTests = true
  #Listen on all IPs in dev/test (for testing from other machines)
  exports.server.ip = '0.0.0.0'
exports.db =
  URL: "mongodb://localhost:27017/#{exports.appName.toLowerCase()}_#{currentEnv}"

এটি সিসাদমিন সম্পাদনার জন্য বন্ধুত্বপূর্ণ। তারপরে আমার যখন ডিবি সংযোগের মতো তথ্যের দরকার হয় তখন এটি

require('./config').db.URL

রুট / কন্ট্রোলার

আমি আমার কন্ট্রোলারদের সাথে আমার রুটগুলি ছেড়ে একটি app/controllersসাব-ডিরেক্টরিতে এগুলি সংগঠিত করতে চাই । তারপরে আমি এগুলি লোড করতে পারি এবং তাদের প্রয়োজনীয় যে কোনও রুট যুক্ত করতে দিন।

আমার app/server.coffeeকফিসিপি ফাইলটিতে আমি এটি করি:

[
  'api'
  'authorization'
  'authentication'
  'domains'
  'users'
  'stylesheets'
  'javascripts'
  'tests'
  'sales'
].map (controllerName) ->
  controller = require './controllers/' + controllerName
  controller.setup app

সুতরাং আমার কাছে ফাইলগুলি রয়েছে:

app/controllers/api.coffee
app/controllers/authorization.coffee
app/controllers/authentication.coffee
app/controllers/domains.coffee

এবং উদাহরণস্বরূপ আমার ডোমেনগুলি নিয়ন্ত্রকের ক্ষেত্রে আমার setupএই জাতীয় একটি ফাংশন রয়েছে।

exports.setup = (app) ->
  controller = new exports.DomainController
  route = '/domains'
  app.post route, controller.create
  app.put route, api.needId
  app.delete route, api.needId
  route = '/domains/:id'
  app.put route, controller.loadDomain, controller.update
  app.del route, controller.loadDomain, exports.delete
  app.get route, controller.loadDomain, (req, res) ->
    res.sendJSON req.domain, status.OK

দেখেছে

মতামত app/viewsরাখার প্রথাগত জায়গা হয়ে উঠছে। আমি এটি এই মত ছড়িয়ে।

app/views/layout.jade
app/views/about.jade
app/views/user/EditUser.jade
app/views/domain/EditDomain.jade

স্ট্যাটিক ফাইল

একটি publicউপ-ডিরেক্টরিতে যান ।

GitHub / Semver / NPM

গিথবের জন্য আপনার গিট রেপো রুটে একটি README.md মার্কডাউন ফাইলটি রাখুন।

NPM- এর জন্য আপনার গিট রেপো রুটে একটি অর্থসূচক সংস্করণ নম্বর সহ একটি প্যাকেজ.জসন ফাইল রাখুন ।


1
আরে পিটার! আপনি যে পদ্ধতির জন্য যাচ্ছেন তা আমি সত্যিই পছন্দ করি। আমি একটি এক্সপ্রেস প্রকল্প তৈরির জন্য কাজ করছি এবং আমি কেবল এটি হ্যাক করে এটিকে ঘিরে রাখার চেয়ে জিনিসগুলি সঠিক উপায়ে করতে চাই। গিথুব এবং / অথবা এটিতে কোনও ব্লগ পোস্টে যদি আপনার নমুনা রেপো থাকে তবে চমত্কার হবে।
suVasH .....


75
কফি স্ক্রিপ্ট এটি পড়া শক্ত করে: / ভ্যানিলা জেএস সম্পাদনা করার কোনও সুযোগ? ধন্যবাদ
টোস্টড_ফ্লেকস

1
এই উত্তরের জন্য ধন্যবাদ। আমি কেবল আমার মনটিকে এটি ঘিরে রাখার চেষ্টা করছি। আপনি কীভাবে অন্য কন্ট্রোলারগুলিকে অন্যের অভ্যন্তরে অ্যাক্সেস করতে পারেন (যেমন উপরের মতো সেটআপ ফাংশনেapp.put route, api.needId
চ্যানি

@ পিটারলাইন্স: আরে মানুষ, আমি আপনার উত্স কোডটি দেখেছি কিন্তু বিল্ড মোডটি কীভাবে করবেন তা সম্পর্কে কোনও ধারণা নেই, আমি ইতিমধ্যে ইনস্টল করে দিয়ে কাঠামোর Goমধ্যে binফাইলটি অন্তর্ভুক্ত করেছি । আপনি কিভাবে এই goফাইল চালাতে চান bin?
ব্যবহারকারী2002495

51

নীচে বেশ কয়েকটি অন্যের অনুরোধ অনুসারে, কফিফ্রিপ্ট থেকে ভ্যানিলা জেএস-এ পোর্ট করা পিটার লায়নের উত্তর ভারব্যাটিম নীচে রয়েছে। পিটারের উত্তরটি খুব সক্ষম, এবং যে কেউ আমার উত্তরে ভোট দিচ্ছে সেও তার উচিত ভোট দেওয়া।


কনফিগ

আপনি কি করছেন ঠিক আছে। আমার নিজের কনফিগারেশন নেমস্পেসটি config.jsএমন একটি নেস্টেড নেমস্পেসের সাথে একটি শীর্ষ-স্তরের ফাইলটিতে সেট আপ করতে চাই।

// Set the current environment to true in the env object
var currentEnv = process.env.NODE_ENV || 'development';
exports.appName = "MyApp";
exports.env = {
  production: false,
  staging: false,
  test: false,
  development: false
};  
exports.env[currentEnv] = true;
exports.log = {
  path: __dirname + "/var/log/app_#{currentEnv}.log"
};  
exports.server = {
  port: 9600,
  // In staging and production, listen loopback. nginx listens on the network.
  ip: '127.0.0.1'
};  
if (currentEnv != 'production' && currentEnv != 'staging') {
  exports.enableTests = true;
  // Listen on all IPs in dev/test (for testing from other machines)
  exports.server.ip = '0.0.0.0';
};
exports.db {
  URL: "mongodb://localhost:27017/#{exports.appName.toLowerCase()}_#{currentEnv}"
};

এটি সিসাদমিন সম্পাদনার জন্য বন্ধুত্বপূর্ণ। তারপরে আমার যখন ডিবি সংযোগের মতো তথ্যের দরকার হয় তখন এটি

require('./config').db.URL

রুট / কন্ট্রোলার

আমি আমার কন্ট্রোলারদের সাথে আমার রুটগুলি ছেড়ে একটি app/controllersসাব-ডিরেক্টরিতে এগুলি সংগঠিত করতে চাই । তারপরে আমি এগুলি লোড করতে পারি এবং তাদের প্রয়োজনীয় যে কোনও রুট যুক্ত করতে দিন।

আমার app/server.jsজাভাস্ক্রিপ্ট ফাইলটিতে আমি এটি করি:

[
  'api',
  'authorization',
  'authentication',
  'domains',
  'users',
  'stylesheets',
  'javascripts',
  'tests',
  'sales'
].map(function(controllerName){
  var controller = require('./controllers/' + controllerName);
  controller.setup(app);
});

সুতরাং আমার কাছে ফাইলগুলি রয়েছে:

app/controllers/api.js
app/controllers/authorization.js
app/controllers/authentication.js
app/controllers/domains.js

এবং উদাহরণস্বরূপ আমার ডোমেনগুলি নিয়ন্ত্রকের ক্ষেত্রে আমার setupএই জাতীয় একটি ফাংশন রয়েছে।

exports.setup = function(app) {
  var controller = new exports.DomainController();
  var route = '/domains';
  app.post(route, controller.create);
  app.put(route, api.needId);
  app.delete(route, api.needId);
  route = '/domains/:id';
  app.put(route, controller.loadDomain, controller.update);
  app.del(route, controller.loadDomain, function(req, res){
    res.sendJSON(req.domain, status.OK);
  });
}

দেখেছে

মতামত app/viewsরাখার প্রথাগত জায়গা হয়ে উঠছে। আমি এটি এই মত ছড়িয়ে।

app/views/layout.jade
app/views/about.jade
app/views/user/EditUser.jade
app/views/domain/EditDomain.jade

স্ট্যাটিক ফাইল

একটি publicউপ-ডিরেক্টরিতে যান ।

GitHub / Semver / NPM

গিথবের জন্য আপনার গিট রেপো রুটে একটি README.md মার্কডাউন ফাইলটি রাখুন।

NPM- এর জন্য আপনার গিট রেপো রুটে একটি অর্থসূচক সংস্করণ নম্বর সহ একটি প্যাকেজ.জসন ফাইল রাখুন ।


43

আমার প্রশ্নটি এপ্রিল ২০১১ সালে প্রবর্তিত হয়েছিল, এটি শান্ত পুরানো। এই সময়ে, আমি এক্সপ্রেস.জেএস এবং এই গ্রন্থাগারটি ব্যবহার করে কোনও অ্যাপ্লিকেশনকে কীভাবে আর্কিটেকচার করব তার অভিজ্ঞতা আমার উন্নত করতে পারে। সুতরাং, আমি এখানে আমার অভিজ্ঞতা ভাগ করে নিই।

এখানে আমার ডিরেক্টরি কাঠামো:

├── app.js   // main entry
├── config   // The configuration of my applications (logger, global config, ...)
├── models   // The model data (e.g. Mongoose model)
├── public   // The public directory (client-side code)
├── routes   // The route definitions and implementations
├── services // The standalone services (Database service, Email service, ...)
└── views    // The view rendered by the server to the client (e.g. Jade, EJS, ...)

App.js

app.jsফাইলটির লক্ষ্য এক্সপ্রেস অ্যাপ্লিকেশনটি বুটস্ট্র্যাপ করা। এটি কনফিগারেশন মডিউল, লগার মডিউল লোড করে, ডাটাবেস সংযোগের জন্য অপেক্ষা করে ..., এবং এক্সপ্রেস সার্ভার চালায়।

'use strict';
require('./config');
var database = require('./services/database');
var express = require('express');
var app = express();
module.exports = app;

function main() {
  var http = require('http');

  // Configure the application.
  app.configure(function () {
    // ... ... ...
  });
  app.configure('production', function () {
    // ... ... ...
  });
  app.configure('development', function () {
    // ... ... ...
  });

  var server = http.createServer(app);

  // Load all routes.
  require('./routes')(app);

  // Listen on http port.
  server.listen(3000);
}

database.connect(function (err) {
  if (err) { 
    // ...
  }
  main();
});

যাত্রাপথ /

রুট ডিরেক্টরিতে একটি রয়েছে index.js ফাইল রয়েছে। routes/ডিরেক্টরিটির ভিতরে অন্য সমস্ত ফাইল লোড করার জন্য এক ধরণের যাদুকে পরিচয় করিয়ে দেওয়াই এর লক্ষ্য । বাস্তবায়ন এখানে:

/**
 * This module loads dynamically all routes modules located in the routes/
 * directory.
 */
'use strict';
var fs = require('fs');
var path = require('path');

module.exports = function (app) {
  fs.readdirSync('./routes').forEach(function (file) {
    // Avoid to read this current file.
    if (file === path.basename(__filename)) { return; }

    // Load the route file.
    require('./' + file)(app);
  });
};

সেই মডিউলটির সাথে একটি নতুন রুটের সংজ্ঞা তৈরি করা এবং বাস্তবায়ন করা খুব সহজ। উদাহরন স্বরূপ,hello.js :

function hello(req, res) {
  res.send('Hello world');
}

module.exports = function (app) {
  app.get('/api/hello_world', hello);
};

প্রতিটি রুট মডিউল একক


আপনি এই কাঠামোটি তৈরি করতে কোনও জেনারেটর ব্যবহার করেন?
আশীষ

18

আমি কোনও ক্রিয়াকলাপ ইত্যাদি রফতানির পরিবর্তে একটি গ্লোবাল "অ্যাপ" ব্যবহার করতে চাই


আমি নির্মাতাদের কাছ থেকে পরামর্শ নিতে পছন্দ করি :) বিটিডাব্লু, আপনি দয়া করে কিছু কোড সরবরাহ করতে পারেন?
দেহধারী

সেটা ঠিক. এই অ্যাপ্লিকেশনগুলিতে আপনি দেখতে পাবেন - github.com/visionmedia/screenshot-app
ডিপ্রোয়ার্ট

17

আমি মনে করি এটি করার এক দুর্দান্ত উপায়। কেবলমাত্র প্রকাশের মধ্যেই সীমাবদ্ধ নয় তবে আমি গিথুবটিতে একই কাজ করে বেশ কয়েকটি নোড.জেএস প্রকল্প দেখেছি। তারা কনফিগারেশন প্যারামিটারগুলি + ছোট মডিউলগুলি নিয়ে থাকে (কিছু ক্ষেত্রে প্রতিটি ইউআরআই) পৃথক ফাইলে যুক্ত থাকে।

আমি ধারণা পেতে গিথুব-এ এক্সপ্রেস-নির্দিষ্ট প্রকল্পগুলির মধ্য দিয়ে যাওয়ার পরামর্শ দেব going IMO আপনি যেভাবে করছেন তা সঠিক।


16

এটি এখন ২০১৫ এর শেষ এবং আমার কাঠামোটি 3 বছরের জন্য এবং ছোট এবং বৃহত প্রকল্পগুলিতে বিকাশের পরে। উপসংহার?

একটি বড় এমভিসি করবেন না, তবে এটি মডিউলগুলিতে আলাদা করুন

তাই ...

কেন?

  • সাধারণত একটি মডিউলে (যেমন পণ্য) কাজ করে, যা আপনি স্বাধীনভাবে পরিবর্তন করতে পারেন।

  • আপনি মডিউলগুলি পুনরায় ব্যবহার করতে সক্ষম

  • আপনি এটি আলাদাভাবে পরীক্ষা করতে সক্ষম

  • আপনি এটি আলাদাভাবে প্রতিস্থাপন করতে সক্ষম

  • তাদের স্পষ্ট (স্থিতিশীল) ইন্টারফেস রয়েছে

    সর্বশেষে, যদি একাধিক বিকাশকারী কাজ করতেন তবে মডিউল বিচ্ছিন্নতা সহায়তা করে

Nodebootstrap প্রকল্পের আমার চূড়ান্ত গঠন একটি অনুরূপ পদ্ধতির হয়েছে। ( গিথুব )

এই কাঠামোটি কেমন দেখাচ্ছে?

  1. ছোট, ক্যাপসুলেটেড মডিউলগুলি প্রতিটি পৃথক এমভিসি সহ

  2. প্রতিটি মডিউলে একটি প্যাকেজ.জসন রয়েছে

  3. কাঠামোর অংশ হিসাবে পরীক্ষা করা (প্রতিটি মডিউলে)

  4. গ্লোবাল কনফিগারেশন , গ্রন্থাগার এবং পরিষেবা

  5. ইন্টিগ্রেটেড ডকার, ক্লাস্টার, চিরকাল

ফোল্ডারওভারভিউ (মডিউলগুলির জন্য লিব ফোল্ডার দেখুন):

নোডবूटস্ট্র্যাপ কাঠামো


3
আপনি যদি সেই সাথে ফোল্ডার ওভারভিউ চিত্র পৃথক পৃথক মডিউলগুলি প্রসারিত করতে পারেন তবে এটি কীভাবে আপনার কাঠামোগত গঠন করবে তার উদাহরণ হিসাবেও সহায়ক হবে।
তরুণরার

8

আমি এমভিসি স্টাইলের ফোল্ডার কাঠামো দিচ্ছি দয়া করে নম্র সন্ধান করুন।

আমরা আমাদের বড় এবং মাঝারি ওয়েব অ্যাপ্লিকেশনগুলির জন্য বেলো ফোল্ডার কাঠামো ব্যবহার করি।

 myapp   
|
|
|____app
|      |____controllers
|      |    |____home.js
|      |
|      |____models
|      |     |___home.js
|      |
|      |____views
|           |___404.ejs
|           |___error.ejs
|           |___index.ejs
|           |___login.ejs
|           |___signup.ejs
|   
|
|_____config
|     |___auth.js
|     |___constants.js
|     |___database.js
|     |___passport.js
|     |___routes.js
|
|
|____lib
|    |___email.js
|
|____node_modules
|
|
|____public.js
|    |____css
|    |    |__style.css
|    |    
|    |____js
|    |    |__script.js
|    |
|    |____img
|    |    |__img.jpg
|    |
|    |
|    |____uploads
|         |__img.jpg
|      
|   
|
|_____app.js
|
|
|
|_____package.json

আমি প্রজন্মের এক্সপ্রেস এমভিসি ফোল্ডার স্ট্রাকচারারের জন্য একটি এনপিএম মডিউল তৈরি করেছি।

দয়া করে বেলো https://www.npmjs.com/package/express-mvc- জেনারেটরটি সন্ধান করুন

এই মডিউলগুলি উত্পাদন এবং ব্যবহারের জন্য কেবল সহজ পদক্ষেপ।

i) মডিউল ইনস্টল করুন npm install express-mvc-generator -g

ii) চেক অপশন express -h

iii) এক্সপ্রেস এমভিসি কাঠামো উত্পন্ন করুন express myapp

iv) নির্ভরতা ইনস্টল করুন npm install:

v) আপনার কনফিগারেশন / ডাটাবেস.জেগুলি খুলুন, দয়া করে আপনার মঙ্গো ডিবি কনফিগার করুন।

vi) অ্যাপ্লিকেশন চালান node appবাnodemon app

vii) ইউআরএল টিপ করুন: // লোকালহোস্ট: 8042 / সাইনআপ বা HTTP: // ইউরিপ: 8042 / সাইনআপ


7

এই প্রশ্নের শেষ উত্তর হওয়ার পরে বেশ কিছুক্ষণ হয়ে গেছে এবং এক্সপ্রেস সম্প্রতি সম্প্রতি সংস্করণ 4 প্রকাশ করেছে, যা আপনার অ্যাপ্লিকেশন কাঠামোটি সংগঠিত করার জন্য কয়েকটি দরকারী জিনিস যুক্ত করেছে।

আপনার এক্সপ্রেস অ্যাপ্লিকেশনটি কীভাবে গঠন করবেন সে সম্পর্কে সেরা অনুশীলনগুলি সম্পর্কে নীচে একটি দীর্ঘ আপ টু ডেট ব্লগ পোস্ট রয়েছে। http://www.terlici.com/2014/08/25/best-practices-express-structure.html

নিবন্ধে পরামর্শটি প্রয়োগ করে একটি গিটহাবের সংগ্রহশালাও রয়েছে। সর্বশেষতম এক্সপ্রেস সংস্করণ সহ এটি সর্বদা আপ টু ডেট থাকে।
https://github.com/terlici/base-express


7

আমি মনে করি না যে এটির জন্য কনফিগার করতে রুট যুক্ত করা ভাল approach একটি ভাল কাঠামো এই জাতীয় কিছু হতে পারে:

application/
| - app.js
| - config.js
| - public/ (assets - js, css, images)
| - views/ (all your views files)
| - libraries/ (you can also call it modules/ or routes/)
    | - users.js
    | - products.js
    | - etc...

সুতরাং product.js এবং users.js এ আপনার সমস্ত রুট থাকবে এতে সমস্ত যুক্তি থাকবে।


6

ঠিক আছে আমি আমার রুটগুলি একটি জসন ফাইল হিসাবে রেখেছি, যা আমি শুরুতে পড়েছিলাম এবং অ্যাপ.জেজে একটি লুপে রুটগুলি সেট আপ করেছি। রুট.জসনে অন্তর্ভুক্ত রয়েছে যে দর্শনটি কল করা উচিত এবং সেই মানগুলির জন্য কী যা রুটে প্রেরণ করা হবে।
এটি অনেকগুলি সাধারণ ক্ষেত্রে কাজ করে তবে আমাকে বিশেষ ক্ষেত্রে কয়েকটি রুট নিজেই তৈরি করতে হয়েছিল।


6

আমি এই বিষয়ে ঠিক একটি পোস্ট লিখেছি। এটি মূলত routeRegistrarএমন একটির ব্যবহার করে যা ফোল্ডারে /controllersতার ফাংশনটিকে কল করে এমন ফাইলগুলির মাধ্যমে পুনরাবৃত্তি করে init। ফাংশনটি initএক্সপ্রেস appভেরিয়েবলটিকে প্যারামিটার হিসাবে গ্রহণ করে যাতে আপনি আপনার রুটগুলি যেভাবে চান রেজিস্টার করতে পারেন।

var fs = require("fs");
var express = require("express");
var app = express();

var controllersFolderPath = __dirname + "/controllers/";
fs.readdirSync(controllersFolderPath).forEach(function(controllerName){
    if(controllerName.indexOf("Controller.js") !== -1){
        var controller = require(controllersFolderPath + controllerName);
        controller.init(app);
    }
});

app.listen(3000);

5

এটি আগ্রহী হতে পারে:

https://github.com/flatiron/nconf

ফাইল, পরিবেশের ভেরিয়েবল, কমান্ড-লাইন আর্গুমেন্ট এবং পারমাণবিক বস্তু মার্জ করে হাইয়ারাকিকাল নোড.জেএস কনফিগারেশন।


4

1) আপনার এক্সপ্রেস প্রকল্পের ফাইল সিস্টেমটি এটির মতো হতে পারে:

/ ...
/lib
/node_modules
/public
/views
      app.js
      config.json
      package.json

app.js - আপনি বিশ্ব অ্যাপ্লিকেশন ধারক

2) মডিউল প্রধান ফাইল (lib / mymodule / index.js):

var express = require('express');    
var app = module.exports = express();
// and load module dependencies ...  

// this place to set module settings
app.set('view engine', 'jade');
app.set('views', __dirname + '/views');

// then do module staff    
app.get('/mymodule/route/',function(req,res){ res.send('module works!') });

3) মূল অ্যাপ্লিকেশনগুলিতে সংযুক্ত মডিউল

...
var mymodule = require('mymodule');
app.use(mymodule);

4) নমুনা যুক্তি

lib/login
lib/db
lib/config
lib/users
lib/verify
lib/
   /api/ 
   ...
lib/
   /admin/
      /users/
      /settings/
      /groups/
...
  • পরীক্ষার জন্য সেরা
  • স্কেল জন্য সেরা
  • মডিউল দ্বারা পৃথক করে
  • কার্যকারিতা (বা মডিউল) দ্বারা গোষ্ঠীকরণের রুট

tj কীভাবে Vimeo আকর্ষণীয় ধারণাটি এক্সপ্রেস অ্যাপ্লিকেশনকে আধুনিকীকরণ করে তা দেখায় - নোড.জেএস এবং এক্সপ্রেসের সাথে মডুলার ওয়েব অ্যাপ্লিকেশন । শক্তিশালী এবং সহজ।


4

http://locomotivejs.org/ নোড.জেএস এবং এক্সপ্রেস দিয়ে নির্মিত একটি অ্যাপ্লিকেশন গঠনের একটি উপায় সরবরাহ করে।

ওয়েবসাইট থেকে:

"লোকোমোটিভ হ'ল নোড.জেএসের জন্য একটি ওয়েব কাঠামো Loc নোড থেকে। "


3

আমি সম্প্রতি স্বতন্ত্র মিনি-অ্যাপস হিসাবে মডিউলগুলি আলিঙ্গন করেছি।

|-- src
  |--module1
  |--module2
     |--www
       |--img
       |--js
       |--css
     |--#.js
     |--index.ejs
  |--module3
  |--www
     |--bower_components
     |--img
     |--js
     |--css
  |--#.js
  |--header.ejs
  |--index.ejs
  |--footer.ejs

এখন যে কোনও মডিউল রাউটিংয়ের জন্য (# .js), ভিউ (* .জেস), জেএস, সিএসএস এবং সম্পদ একে অপরের পাশে রয়েছে। দুটি অতিরিক্ত লাইন সহ প্যারেন্ট # .js এ সাব-মডুল রাউটিং সেট আপ করা হয়েছে

router.use('/module2', opt_middleware_check, require('./module2/#'));
router.use(express.static(path.join(__dirname, 'www')));

এই উপায়ে এমনকি সাবসোমডিউলগুলিও সম্ভব।

Src ডিরেক্টরিতে ভিউ সেট করতে ভুলবেন না

app.set('views', path.join(__dirname, 'src'));

রুট, ভিউ এবং মডেলগুলি কীভাবে বোঝা হচ্ছে তা দেখার আগ্রহী এমন কাঠামোর সাথে গিথুবের কোনও লিঙ্ক
মুহাম্মদ উমর

আমি মনে করি সবকিছু ব্যাখ্যা করা হয়েছে। রুটগুলি কেবল ক্লাসিক এক্সপ্রেস রুট। মডিউলের নামের সাথে ভিউগুলি উপসর্গ লোড করা প্রয়োজন, আপেক্ষিক পথটি উল্লেখ করে মডেলগুলি লোড করা দরকার।
জেভেরো

আমার শেষ লাইনে, আমি ভিউটি এসআরসি ডিরেক্টরিতে সেট করেছি। সুতরাং এখান থেকে, সমস্ত ভিউ এসসিআর ডিরেক্টরিতে আপেক্ষিক। অভিনব কিছু না।
zevero

1

আমার এক্সপ্রেস প্রকল্পের ডিরেক্টরি কাঠামোর বেশিরভাগ অংশ এটিই দেখায়।

আমি সাধারণত express dirnameপ্রকল্পটি আরম্ভ করার জন্য করি, আমার অলসতা ক্ষমা করি, তবে এটি খুব নমনীয় এবং প্রসারণযোগ্য। পিএস - আপনার express-generatorএটির জন্য দরকার (যারা এটি সন্ধান করছেন তাদের জন্য sudo npm install -g express-generator, সুডো কারণ আপনি এটি বিশ্বব্যাপী ইনস্টল করছেন)

|-- bin
    |-- www //what we start with "forever"
|-- bower_components
|-- models
    |-- database.js
    |-- model1.js //not this exact name ofcourse.
    |-- .
|-- node_modules
|-- public
    |-- images
    |-- javascripts
        |-- controllers
        |-- directives
        |-- services
        |-- app.js
        |-- init.js //contains config and used for initializing everything, I work with angular a lot.
    |-- stylesheets
|-- routes
    |-- some
    |-- hierarchy
    .
    .
|-- views
    |-- partials
    |-- content
|-- .env
|-- .env.template
|-- app.js
|-- README.md

আপনি নিশ্চয়ই ভাবছেন কেন .env ফাইলগুলি? কারণ তারা কাজ! আমি dotenvআমার প্রকল্পগুলিতে মডিউল ব্যবহার করি (খুব সম্প্রতি) এবং এটি কার্যকর হয়! এই 2 বিবৃতিতে app.jsবা এগুলিতে পপ করুনwww

var dotenv = require('dotenv');
dotenv.config({path: path.join(__dirname + "/.env")});

এবং অন্য লাইনটি দ্রুত /bower_componentsসংস্থার অধীনে স্থির সামগ্রী সরবরাহ করতে সেট করুন/ext

app.use('/ext', express.static(path.join(__dirname, 'bower_components')));

এটি সম্ভবত এমন লোকদের জন্য উপযুক্ত হতে পারে যারা এক্সপ্রেস এবং কৌণিক একসাথে ব্যবহার করতে চাইছেন বা javascriptsঅবশ্যই অবশ্যই এই শ্রেণিবদ্ধতা ছাড়াই প্রকাশ করুন ।


1

আমার গঠন দ্রুতগামী 4. https://github.com/odirleiborgert/borgert-express-boilerplate

প্যাকেজগুলি

View engine: twig
Security: helmet
Flash: express-flash
Session: express-session
Encrypt: bcryptjs
Modules: express-load
Database: MongoDB
    ORM: Mongoose
    Mongoose Paginate
    Mongoose Validator
Logs: winston + winston-daily-rotate-file
Nodemon
CSS: stylus
Eslint + Husky

গঠন

|-- app
    |-- controllers
    |-- helpers
    |-- middlewares
    |-- models
    |-- routes
    |-- services
|-- bin
|-- logs
|-- node_modules
|-- public
    |-- components
    |-- images
    |-- javascripts
    |-- stylesheets
|-- views
|-- .env
|-- .env-example
|-- app.js
|-- README.md

0

আপনার এক্সপ্রেস অ্যাপ্লিকেশন গঠনের একটি সহজ উপায়:

  • প্রধান সূচক.জেজে নিম্নলিখিত আদেশ বজায় রাখা উচিত।

    সমস্ত app.set প্রথম হওয়া উচিত।

    সমস্ত অ্যাপ্লিকেশন.উস দ্বিতীয় হওয়া উচিত।

    অন্যান্য এপিআইগুলি তাদের ফাংশন সহ বা অন্য ফাইলগুলিতে রুট চালিয়ে যান

    Exapmle

    app.use ("/ পাসওয়ার্ড", পাসওয়ার্ডএপিআই);

    app.use ("/ ইউজার", ইউজারএপিআই);

    app.post ("/ টোকেন", পাসপোর্ট ক্রেট টোকেন);

    app.post ("/ লগআউট", পাসপোর্ট.লগআউট)


0

এক্সপ্রেসজেস ​​প্রকল্পের হ্যান্ডেলবার এবং পাসপোর্টজ সহ এমভিসি কাঠামোর সেরা উপায়

- app
      -config 
        -passport-setup.js
      -controllers
      -middleware
      -models
      -routes
      -service
    -bin
      -www
      -configuration.js
      -passport.js
    -node_modules
    -views
     -handlebars page
    -env
    -.gitignore
    -package.json
    -package-lock.json

@ স্যান্ড্রো-মুন্ডা দয়া করে পরীক্ষা করুন
মণীশকুমার ভাবনানী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.