কিভাবে নোড.জেস তৈরি করতে পরম প্রয়োজন? (আত্মীয়ের পরিবর্তে)


234

আমি আমার ফাইলগুলি সর্বদা আমার প্রকল্পের মূল দ্বারা প্রয়োজন এবং বর্তমান মডিউলের সাথে তুলনামূলকভাবে চাই না।

উদাহরণস্বরূপ, আপনি যদি https://github.com/visionmedia/express/blob/2820f2227de0229c5d7f28009aa432f9f3a7b5f9/exults/downloads/app.js লাইন 6 এ দেখেন আপনি দেখতে পাবেন

express = require('../../')

এটি আসলেই খারাপ আইএমও। কল্পনা করুন যে আমি আমার সমস্ত উদাহরণকে কেবলমাত্র একটি স্তর দ্বারা মূলের কাছে রাখতে চাই। এটি অসম্ভব হবে, কারণ আমাকে প্রতিটি উদাহরণের মধ্যে 30 টিরও বেশি উদাহরণ এবং বহুবার আপডেট করতে হবে। এটি:

express = require('../')

আমার সমাধানটি মূল ভিত্তিক জন্য একটি বিশেষ কেস হবে: যদি স্ট্রিংটি একটি an দিয়ে শুরু হয় তবে এটি প্রকল্পের রুট ফোল্ডারের সাথে সম্পর্কিত।

কোন সাহায্য প্রশংসা করা হয়, ধন্যবাদ

আপডেট 2

এখন আমি need.js ব্যবহার করছি যা আপনাকে এক উপায়ে লেখার অনুমতি দেয় এবং ক্লায়েন্ট এবং সার্ভার উভয় ক্ষেত্রেই কাজ করে। Require.js আপনাকে কাস্টম পাথ তৈরি করতে দেয়।

আপডেট 3

এখন আমি ওয়েবপ্যাক + গল্পে চলে এসেছি এবং সার্ভারের পাশে মডিউলগুলি হ্যান্ডেল করতে আমি বর্ধিত-প্রয়োজনীয় ব্যবহার করি। এখানে যুক্তি দেখুন: http://hackhat.com/p/110/module-loader-webpack-vs-requirejs-vs-browserify/


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

উত্তর:


162

এবং কি সম্পর্কে:

var myModule = require.main.require('./path/to/module');

এটি ফাইলটিকে এমনভাবে প্রয়োজন যেমন এটি মূল জেএস ফাইল থেকে প্রয়োজনীয় ছিল, সুতরাং এটি যতক্ষণ না আপনার মূল জেএস ফাইলটি আপনার প্রকল্পের মূলে রয়েছে ততক্ষণ এটি বেশ সুন্দরভাবে কাজ করে ... এবং এটিই আমি প্রশংসা করি।


কোনও খারাপ ধারণা নয় (: এরপরে আপনি আপনার প্রয়োজনীয়.মেন মডিউলটিতে অ্যাপটি পুনরায় পুনর্নির্মাণের জন্য কিছু অন্যান্য পদ্ধতি সংজ্ঞায়িত করতে পারেন I আমি মনে করি আপনি তখন প্রয়োজনীয়.main.req ('ক্লায়েন্ট / সামারমড') করতে পারেন N দুর্দান্ত ধারণা, তবে এটি হবে আমার বর্তমানের প্রয়োজনের চেয়ে আরও ভার্জোজ হও Also এছাড়াও আমি মনে করি না যে আমি ব্রাউসরিফাইও অপছন্দ করি কারণ পরিবর্তনগুলি তাত্ক্ষণিক নয় এবং পরিবর্তনগুলি মিস করে না (কারণ আমার কোডটি ব্রাউজার এবং
নোড.জেজে

4
যদি আপনি এটি খুব ভার্বোস মনে করেন তবে কেবল .bind () ব্যবহার করুন: var rootReq = need.bind (প্রয়োজনীয়.main); রুটরেক ('./path/to/module');
ক্রোনভেল

হ্যাঁ, এটি এমন কারও পক্ষে কার্যকর হতে পারে যে এখনও ক্লায়েন্ট পক্ষের জন্য ব্রাউজারিফাই ব্যবহার করতে চায়। আমার জন্য আর দরকার নেই, তবে আপনার জবাবের জন্য যাইহোক ধন্যবাদ (:
Totty.js

6
যদি প্রধান আপনার প্রকল্পের মূলে থাকে :)
আলেকজান্ডার মিলস

12
কোডটি মোচা টেস্টের মতো ইউনিট পরীক্ষাগুলি দিয়ে আচ্ছাদিত হলে এই সমাধানটি কার্যকর হবে না
লার্ক লার্ক

129

ব্রাউজার্ফি হ্যান্ডবুকটিতে একটি সত্যিই আকর্ষণীয় বিভাগ রয়েছে :

এড়ানো হচ্ছে ../../../../..../.... .. ..

অ্যাপ্লিকেশনটিতে থাকা সমস্ত কিছুই সঠিকভাবে পাবলিক এনপিএমের সাথে সম্পর্কিত নয় এবং প্রাইভেট এনএমপি বা গিট রেপো স্থাপনের ওভারহেড এখনও অনেক ক্ষেত্রেই বড় নয়। ../../../../../../../আপেক্ষিক পাথের সমস্যা এড়ানোর জন্য কয়েকটি পন্থা এখানে দেওয়া হল ।

node_modules

লোকেরা কখনও কখনও অ্যাপ্লিকেশন-নির্দিষ্ট মডিউলগুলিকে নোড_মডিউলগুলিতে স্থাপন করতে আপত্তি জানায় কারণ এনপিএম থেকে তৃতীয় পক্ষের মডিউলগুলিও পরীক্ষা না করে আপনার অভ্যন্তরীণ মডিউলগুলি কীভাবে চেক করা যায় তা স্পষ্ট নয়।

উত্তরটা বেশ সাধারন! আপনার যদি এমন কোনও .gitignoreফাইল থাকে যা উপেক্ষা করে node_modules:

node_modules

!আপনার অভ্যন্তরীণ অ্যাপ্লিকেশন মডিউলগুলির জন্য আপনি কেবল একটি ব্যতিক্রম যুক্ত করতে পারেন :

node_modules/*
!node_modules/foo
!node_modules/bar

দয়া করে মনে রাখবেন যে পিতা-মাতা ইতিমধ্যে উপেক্ষা করা থাকলে আপনি একটি উপ-ডিরেক্টরিটি স্বাক্ষর করতে পারবেন না । সুতরাং উপেক্ষা পরিবর্তে node_modules, আপনি প্রতি ডিরেক্টরির উপেক্ষা করা আছে ভিতরে node_modules সঙ্গে node_modules/*কৌতুক, এবং তারপর আপনি আপনার ব্যতিক্রম যোগ করতে পারেন।

এখন আপনার আবেদনের যে কোনও জায়গায় আপনি খুব বড় এবং ভঙ্গুর আপেক্ষিক পাথ require('foo') বা require('bar')ছাড়াই সক্ষম হবেন ।

আপনার যদি অনেকগুলি মডিউল থাকে এবং এগুলি এনএমপি দ্বারা ইনস্টল করা তৃতীয় পক্ষের মডিউলগুলি থেকে আরও আলাদা রাখতে চান তবে আপনি সেগুলি কেবল একটি ডিরেক্টরিতে রাখতে পারেন node_modulesযেমন node_modules/app:

node_modules/app/foo
node_modules/app/bar

এখন আপনি আপনার অ্যাপ্লিকেশনটিতে require('app/foo')বা require('app/bar')যে কোনও জায়গা থেকে সক্ষম হবেন ।

আপনার মধ্যে .gitignore, কেবল এর জন্য একটি ব্যতিক্রম যুক্ত করুন node_modules/app:

node_modules/*
!node_modules/app

যদি আপনার অ্যাপ্লিকেশনটির প্যাকেজ.জসনে কনফিগার হয়েছে, আপনার নিজের উপাদান node_modules/fooবা node_modules/app/fooডিরেক্টরিতে নিজস্ব রূপান্তর ক্ষেত্র সহ একটি পৃথক প্যাকেজ.জসন তৈরি করতে হবে কারণ রূপান্তরগুলি মডিউল সীমানা জুড়ে প্রযোজ্য নয়। এটি আপনার অ্যাপ্লিকেশনটিতে কনফিগারেশন পরিবর্তনের বিরুদ্ধে আপনার মডিউলগুলি আরও শক্তিশালী করে তুলবে এবং আপনার আবেদনের বাইরে প্যাকেজগুলি স্বাধীনভাবে পুনরায় ব্যবহার করা সহজ হবে।

সিমবলিক লিঙ্ক

আরেকটি কুশলী কৌতুক যদি আপনি একটি অ্যাপ্লিকেশন যেখানে আপনি symlinks করতে পারেন এবং সমর্থন উইন্ডোজ প্রয়োজন হবে না কাজ করছি একটি সিমবলিক লিঙ্ক হয় lib/ বা app/মধ্যে ফোল্ডারের node_modules। প্রকল্পের মূল থেকে, করুন:

ln -s ../lib node_modules/app

এবং এখন আপনার প্রকল্পের যে কোন জায়গা থেকে আপনি ফাইল প্রয়োজন করতে সক্ষম হবেন lib/করে require('app/foo.js')পেতে lib/foo.js

কাস্টম পাথ

আপনি হয়ত কিছু স্থানে $NODE_PATH পরিবেশের পরিবর্তনশীল ব্যবহার বা opts.pathsনোডের জন্য ডিরেক্টরি যুক্ত করতে এবং মডিউলগুলি সন্ধান করার জন্য ব্রাউজারফাইয়ের কথা বলতে পারেন।

অন্যান্য প্ল্যাটফর্মগুলির বিপরীতে, ডিরেক্টরিটির $NODE_PATHকার্যকর ব্যবহারের তুলনায় নোডের সাথে শথ-স্টাইলের পাথ ডিরেক্টরিগুলি ব্যবহার করা সুবিধাজনক নয় node_modules

এটি কারণ আপনার অ্যাপ্লিকেশনটি রানটাইম এনভায়রনমেন্ট কনফিগারেশনের সাথে আরও দৃ tight়তার সাথে মিলিত হয়েছে তাই আরও চলমান অংশ রয়েছে এবং আপনার পরিবেশটি সঠিকভাবে সেটআপ হওয়ার সময় আপনার অ্যাপ্লিকেশনটি কাজ করবে।

নোড এবং উভয় সমর্থন ব্রাউজ করুন তবে এর ব্যবহারকে নিরুৎসাহিত করুন $NODE_PATH


17
node_modulesফোল্ডারে রাখার একমাত্র নীচের দিকটি হ'ল এটি শক্ত ( rm -rf node_modules) ফোল্ডারটি শক্ত করা
মাইকেল

13
@ মিশেল এতটা কঠিন নয়: গিট ক্লিন -ডেক্স নোড_মডিউলস
পিটার উইলকিনসন

3
অথবা আপনি যদি git cleanবাক্যবিন্যাসটি ভুলে গেছেন তবে সর্বদা একটি হতে rm -rf node_modules && git checkout node_modulesপারে - সাব git stash- node_modulesডিরেক্টরিতে কোনও পরিবর্তন হয়েছে সে ক্ষেত্রে নিশ্চিত হন ।
ডেরেনিও

1
আমি নোড_মডিউলগুলি ব্যবহার করার ধারণাটি পছন্দ করি তবে এটি কতটা অস্থির হতে পারে তা বিবেচনা করে উত্স কোডটি সঞ্চয় করার জন্য নয়। বিচ্ছিন্ন মডিউলটি প্রকাশ করা এবং মূল প্রকল্পের নির্ভরতা হিসাবে এটি সংরক্ষণ করা কি আরও বেশি অর্থবোধ করে না? এটি নোড_মডিউলগুলির ডিরেক্টরিটির অস্থিরতার জন্য একটি পরিষ্কার সমাধান সরবরাহ করে এবং গিট, সিম্বলিক লিঙ্কগুলি বা $ NODE_PATH সমাধানের উপর নির্ভর না করে কেবল এনপিএমের উপর নির্ভর করে।
কেভিন কোশিয়ল

1
NODE_PATH দেখতে যাওয়ার মতো দেখাচ্ছে। "আপনার অ্যাপ্লিকেশনটি কেবল তখনই কার্যকর হবে যখন আপনার পরিবেশটি সঠিকভাবে সেট আপ হবে" এটি সর্বদা সত্য! প্রতিটি ফাইলের প্রতিটি আমদানি পরিবর্তনের চেয়ে পরিবেশ সেটআপ (সাধারণত একটি ফাইলে) পাওয়া কী সহজ নয়?
সিপিল

73

আমি node_modulesভাগ করা কোডের জন্য একটি নতুন ফোল্ডার তৈরি করতে চাই , তারপরে নোড দিন এবং এটি সর্বোত্তমভাবে করা দরকার require

উদাহরণ স্বরূপ:

- node_modules // => these are loaded from your package.json
- app
  - node_modules // => add node-style modules
    - helper.js
  - models
    - user
    - car
- package.json
- .gitignore

উদাহরণস্বরূপ, যদি আপনি আছেন car/index.jsআপনি যা করতে পারেন require('helper')এবং নোড এটা পাবেন!

নোড_মডিউলগুলি কীভাবে কাজ করে

মডিউলগুলি সমাধানের জন্য নোডের একটি চতুর অ্যালগরিদম রয়েছে যা প্রতিদ্বন্দ্বী প্ল্যাটফর্মগুলির মধ্যে অনন্য।

আপনি যদি require('./foo.js')থেকে /beep/boop/bar.js, নোড জন্য চেহারা হবে ./foo.jsমধ্যে /beep/boop/foo.js। যে পথগুলি একটি দিয়ে শুরু হয় ./বা ../যে ফাইলগুলি কল করে সেগুলিতে সর্বদা স্থানীয় থাকে require()

তবে যদি আপনার কোনও অপ-আপেক্ষিক নাম প্রয়োজন হয় যেমন require('xyz')থেকে /beep/boop/foo.js, নোড এই পাথগুলি যথাযথভাবে অনুসন্ধান করে, প্রথম ম্যাচে থামবে এবং কিছু না পাওয়া গেলে ত্রুটি বাড়িয়ে তুলবে:

/beep/boop/node_modules/xyz
/beep/node_modules/xyz
/node_modules/xyz

xyzবিদ্যমান প্রতিটি ডিরেক্টরির জন্য নোড প্রথমে ক্ষেত্রের অস্তিত্ব xyz/package.jsonআছে কিনা তা সন্ধান করবে "main""main"ফিল্ড কে সংজ্ঞায়িত যা ফাইল চার্জ যদি আপনি গ্রহণ করা উচিত require()ডিরেক্টরির পাথ।

উদাহরণস্বরূপ, যদি /beep/node_modules/xyzএটি প্রথম ম্যাচ হয় এবং /beep/node_modules/xyz/package.jsonথাকে:

{
  "name": "xyz",
  "version": "1.2.3",
  "main": "lib/abc.js"
}

তারপরে রফতানিগুলি /beep/node_modules/xyz/lib/abc.jsফিরে আসবে require('xyz')

যদি package.jsonকোনও "main"ক্ষেত্র বা না থাকে index.jsতবে ধরে নেওয়া হয়:

/beep/node_modules/xyz/index.js

2
কিভাবে এটি কাজ করে যখন একটি মডিউল লোড উপর মহান ব্যাখ্যা
goenning

2
এটি একটি খুব মার্জিত সমাধান, উপরের উত্তরের সমস্ত সমস্যা এড়িয়ে চলে। উত্তর, বিবেচনা করা উচিত।
রডুরিখো

38

বড় ছবি

এটি "সত্যিই খারাপ" বলে মনে হচ্ছে তবে সময় দিন। এটি আসলে সত্যই ভাল। স্পষ্টত require()এসগুলি সম্পূর্ণ স্বচ্ছতা এবং বোঝার স্বাচ্ছন্দ্য দেয় যা প্রকল্পের জীবনচক্রের সময় তাজা বাতাসের শ্বাসের মতো।

এটিকে এভাবে ভাবুন: আপনি নোড.জেজে আপনার পায়ের আঙ্গুলগুলি ডুবিয়ে একটি উদাহরণ পড়ছেন এবং আপনি সিদ্ধান্ত নিয়েছেন যে এটি "সত্যই খারাপ আইএমও"। আপনি নোড.জেএস সম্প্রদায়ের দ্বিতীয় অনুমানের নেতারা, এমন লোকেরা যারা নোড.জেএস অ্যাপ্লিকেশন লিখতে এবং বজায় রাখতে আরও বেশি ঘন্টা লগ করেছেন have লেখক এমন একটি ছদ্মবেশী ভুল করার সুযোগ কী? (এবং আমি সম্মত হলাম, আমার রুবি এবং পাইথনের পটভূমি থেকে এটি প্রথমে একটি বিপর্যয়ের মতো বলে মনে হচ্ছে seems)

নোড.জেএসকে ঘিরে প্রচুর হাইপ এবং কাউন্টার-হাইপ রয়েছে কিন্তু যখন ধুলো স্থির হয়ে যায়, আমরা স্বীকার করব যে সুস্পষ্ট মডিউল এবং "স্থানীয় প্রথম" প্যাকেজগুলি গ্রহণের প্রধান চালক ছিল।

সাধারণ ঘটনা

অবশ্যই, node_modulesবর্তমান ডিরেক্টরি থেকে, তারপর পিতা-মাতার, তারপরে পিতামহ, পিতামহ, ইত্যাদি অনুসন্ধান করা হয়। সুতরাং আপনি ইনস্টল করা প্যাকেজগুলি ইতিমধ্যে এইভাবে কাজ করে। সাধারণত আপনি require("express")আপনার প্রকল্পের যে কোনও জায়গা থেকে এটি করতে পারেন এবং এটি দুর্দান্ত কাজ করে।

আপনি যদি নিজের প্রকল্পের মূল থেকে নিজেকে সাধারণ ফাইলগুলি লোড করে দেখতে পান (সম্ভবত এটি সাধারণ ইউটিলিটি ফাংশন কারণ) তবে এটি একটি বড় সূত্র যে প্যাকেজ তৈরির সময়। প্যাকেজগুলি খুব সহজ: আপনার ফাইল সরানো node_modules/এবং একটি করা package.json আছে। ভাল খবর! এই নামের স্থানের সমস্ত কিছুই আপনার সম্পূর্ণ প্রকল্প থেকে অ্যাক্সেসযোগ্য। বিশ্বব্যাপী নেমস্পেসে আপনার কোডটি পাওয়ার প্যাকেজগুলি সঠিক উপায়।

অন্যান্য কর্মক্ষেত্রসমূহ

আমি ব্যক্তিগতভাবে এই কৌশলগুলি ব্যবহার করি না, তবে তারা আপনার প্রশ্নের উত্তর দেয় এবং অবশ্যই আপনি নিজের পরিস্থিতি আমার চেয়ে ভাল জানেন।

আপনি $NODE_PATHআপনার প্রকল্পের রুটে সেট করতে পারেন । আপনি যখন ডিরেক্টরিটি অনুসন্ধান করা হবে require()

এর পরে, আপনি আপস করতে পারেন এবং আপনার সমস্ত উদাহরণ থেকে একটি সাধারণ, স্থানীয় ফাইল প্রয়োজন। এই সাধারণ ফাইলটি কেবল দাদা-পিতামহ ডিরেক্টরিতে সঠিক ফাইলটি পুনরায় রফতানি করে।

উদাহরণ / ডাউনলোড / অ্যাপ.জেএস (এবং আরও অনেকে এটি পছন্দ করে)

var express = require('./express')

উদাহরণ / ডাউনলোড / express.js

module.exports = require('../../')

এখন আপনি যখন এই ফাইলগুলি স্থানান্তরিত করবেন, তখন সবচেয়ে খারাপ পরিস্থিতিটি একটি শিম মডিউলটি ঠিক করছে।


14
আমি সম্মত হই যে নোড.জেস ছেলেরা অবশ্যই কোনও কারণে আত্মীয়কে বেছে নিয়েছে। আমি কেবল তার উত্তরগুলি থেকে দেখতে পাচ্ছি না। এটি এখনও আমার কাছে "খারাপ" বোধ করে;)
অ্যাডাম শ্মিদেগ

21
"আপনি নোড.জেএস সম্প্রদায়ের দ্বিতীয় অনুমানকারী নেতা" - একই নেতারা ভবিষ্যত বা প্রতিশ্রুতির পরিবর্তে কলব্যাক ব্যবহার করার সিদ্ধান্ত নিয়েছে। আমার নোডেজের বেশিরভাগ পরামর্শে "নেতৃবৃন্দ" বলে অভিশাপ দেওয়া এবং লোকদের জেভিএম এ যাওয়ার জন্য রাজি করা জড়িত। যা নোডেজ ব্যবহারের কয়েক মাস পরে খুব সহজ :)
ডেভিড সের্গেই

8
@ জন্ম, জেভিএম এ চলে? Sakeশ্বরের দোহাই, কেন?
ইভানচো

31
"আপনি নোড.জেএস সম্প্রদায়ের দ্বিতীয় অনুমানের নেতারা" দয়া করে এই চিন্তা-হতাশার সুরটি এড়িয়ে যান।
atlex2

15
অভিহিত ঠিক তিনি দ্বিতীয় অনুমান নোড নেতাদের। শিল্পটি এভাবেই এগিয়ে যায়। যদি নোড ছেলেরা থ্রেড ভিত্তিক সম্মতিযুক্ত মডেলগুলিকে অগ্রণী করে এমন নেতাদের অনুমান না করে তবে আমাদের নোড হবে না।
d512

20

কটাক্ষপাত আছে নোড-rfr

এটি এর মতোই সহজ:

var rfr = require('rfr');
var myModule = rfr('projectSubDir/myModule');

আমি মনে করি দ্বিতীয় লাইনটি ভার মাইমডিউল = আরএফআর ('/ প্রজেক্টসুবডির / মাইমডিউল') হওয়া উচিত;
সিকোরস্কি

1
দস্তাবেজগুলি থেকে: var মডিউল 2 = rfr ('lib / মডিউল 2'); // শীর্ষস্থানীয় স্ল্যাশ বাদ দেওয়া যেতে পারে।
ইজলাইনো

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

13

আপনি যদি এনপিএমের পরিবর্তে সুতা ব্যবহার করেন তবে আপনি ওয়ার্কস্পেস ব্যবহার করতে পারেন ।

আসুন বলুন যে আমার কাছে আরও একটি ফোল্ডার রয়েছে যা servicesআমি আরও সহজেই চাই:

.
├── app.js
├── node_modules
├── test
├── services
   ├── foo
   └── bar
└── package.json

সুতা কর্মক্ষেত্র তৈরি করতে, এর package.jsonভিতরে একটি ফাইল তৈরি করুন services folder:

{
  "name": "myservices",
  "version": "1.0.0"
}

আপনার মূল প্যাকেজ.জসনে যোগ করুন:

"private": true,
"workspaces": ["myservices"]

yarn installপ্রকল্পের মূল থেকে চালান ।

তারপরে, আপনার কোডের যে কোনও জায়গায়, আপনি এটি করতে পারেন:

const { myFunc } = require('myservices/foo')

পরিবর্তে যেমন কিছু:

const { myFunc } = require('../../../../../../services/foo')

6
সম্ভবত এটি পরিষ্কার করার একটি ধারণা যে এটি কেবল সূতার জন্য কাজ করে , এনপিএমের জন্য নয়? আমি গণনা করেছি এটি সম্ভবত এনপিএমের জন্যও কাজ করবে, সুতরাং আমি যতটা ভুল করেছি তার পরিবর্তে সুতাটি ব্যবহার না করে অবাক করে ভেবে কিছু সময় ব্যয় করেছি। একটি বোকা ধারণা হতে পারে, কিন্তু সম্ভবত আমি একমাত্র না।
আর্নেহুগো

2
আমি স্পষ্ট করতে কিছুটা সম্পাদনা করেছি। বিভ্রান্তির জন্য দুঃখিত.
সাইবারওয়ম্ব্যাট

12

আইএমএইচও, সবচেয়ে সহজ উপায় হ'ল GLOBALবস্তুর অংশ হিসাবে নিজের ফাংশনটি সংজ্ঞায়িত করা । projRequire.jsনীচের বিষয়বস্তু দিয়ে আপনার প্রকল্পের মূলে তৈরি করুন :

var projectDir = __dirname;

module.exports = GLOBAL.projRequire = function(module) {
  return require(projectDir + module);
}

requireপ্রকল্প-নির্দিষ্ট মডিউলগুলির কোনও আইংয়ের আগে আপনার প্রধান ফাইলে :

// init projRequire
require('./projRequire');

এর পরে নিম্নলিখিতটি আমার পক্ষে কাজ করে:

// main file
projRequire('/lib/lol');

// index.js at projectDir/lib/lol/index.js
console.log('Ok');


@ টট্টি, আমি আরও একটি সমাধান নিয়ে এসেছি, যা আপনার মন্তব্যে বর্ণিত ক্ষেত্রে কার্যকর হতে পারে। বিবরণ হবে tl;dr, সুতরাং আমি আমার পরীক্ষার প্রকল্পের কাঠামো সহ আরও ভাল একটি ছবি দেখাব ।


ভাল, এখন পর্যন্ত এটি এটি করার সর্বোত্তম উপায় বলে মনে হচ্ছে। আমি করি: GLOBAL.requires = প্রয়োজনীয় ('r')। R; আমার index.js ফাইলে। তবে আমার মানত পরীক্ষায় আমার সমস্যা আছে, তারা সূচি.জগুলি চালায় না তাই আমার পরীক্ষাগুলি ব্যর্থ হয় কারণ এটির অপরিজ্ঞাত প্রয়োজন। যাইহোক আপাতত আমি GLOBAL.requires = প্রয়োজনীয় ('r') যোগ করতে পারি r প্রতিটি পরীক্ষার শীর্ষে। আরও ভাল ধারণা? github.com/totty90/pr Prod001_server
commit

পরীক্ষারবিহীন ফাইলের জন্য: github.com/totty90/pr Prod001_server / blob / global-require/… , প্রতিটি পরীক্ষার ফাইলে: github.com/totty90/pr Prod001_server
blob

সমস্যাটি তখন ঘটে যখন আমি "প্যাথস-টেস্ট / নোড_মডিউল / অন্যান্য.জেএস" এ থাকি এবং আমার জন্য "প্যাথস-টেস্ট / নোড_মডিউলগুলি / some.js" প্রয়োজন। আমার প্রয়োজন হবে ('./ কিছু') পরিবর্তে ("প্রজ / কিছু")। এবং এইভাবে আমার সমস্ত অ্যাপ নোড_মডিউলগুলিতে থাকবে?
টোটটি.জেএস

@Totty, প্রয়োজন কোন সমস্যা prj/someথেকে prj/other(ঠিক পরীক্ষিত require('prj/some')। আপনার অ্যাপ্লিকেশনটির সমস্ত সাধারণ মডিউলগুলি সেখানে যেতে পারে (উদাহরণস্বরূপ ডাটাবেস স্তর)। আপনার যেখানে বলা যাক, কোনও libতাত্পর্য তৈরি করবে না। চেষ্টা করুন এবং দেখুন এটি উপযুক্ত কিনা।
আলেকসেই জ্যাব্রোডস্কি

ইয়েস্ট, আমি এটি আপডেট করেছি: github.com/totty90/pr Prod001_server / tree / master / node_modules/… যে দুর্দান্ত কাজ করেছে। তবে আমি নোড_মডিউলগুলি না ব্যবহার করে আমার সমস্ত ফাইল এক স্তর উপরে রাখতে পারি?
টট্টি.জেএস

12

আমি process.cwd()আমার প্রকল্পগুলিতে ব্যবহার করি। উদাহরণ স্বরূপ:

var Foo = require(process.cwd() + '/common/foo.js');

এটি লক্ষ করার মতো হতে পারে যে এটির ফলে requireএকটি পরম পথে ইঙ্গিত হবে , যদিও আমি এখনও এ নিয়ে সমস্যাগুলি ছড়িয়েছি।


1
এটি খারাপ ধারণা কারণ অ্যাপ্লিকেশনটি সংরক্ষণ করা হয় যেখানে সিডব্লুডির একই ডিরেক্টরি হতে হবে না।
জিওয়োপেন

11

এখানে এই ইস্যু সম্পর্কে একটি ভাল আলোচনা আছে

আমি একই আর্কিটেকচারাল সমস্যায় পড়েছিলাম: আমার অ্যাপ্লিকেশনটিকে আরও সংগঠন এবং অভ্যন্তরীণ নেমস্পেসগুলি দেওয়ার উপায় চাই:

  • বাহ্যিক নির্ভরতার সাথে অ্যাপ্লিকেশন মডিউলগুলি মিশ্রণ করা বা অ্যাপ্লিকেশন-নির্দিষ্ট কোডের জন্য ব্যক্তিগত এনএমপি রেপোর সাথে বিরক্ত করা
  • আপেক্ষিক ব্যবহারের প্রয়োজন হয় যা রিফ্যাক্টরিং এবং বোধগম্যকে শক্ত করে তোলে
  • সিমলিঙ্কগুলি ব্যবহার করে বা নোডের পথ পরিবর্তন করা যা উত্সের অবস্থানগুলিকে অস্পষ্ট করতে পারে এবং উত্স নিয়ন্ত্রণের সাথে সুন্দরভাবে খেলতে পারে না

শেষ পর্যন্ত, আমি সিদ্ধান্ত নিয়েছি যে ডিরেক্টরিগুলির পরিবর্তে ফাইল নামকরণ কনভেনশন ব্যবহার করে আমার কোডটি সংগঠিত করব to কাঠামোর মতো দেখতে কিছু হবে:

  • npm-shrinkwrap.json
  • package.json
  • node_modules
    • ...
  • src
    • app.js
    • app.config.js
    • app.models.bar.js
    • app.models.foo.js
    • app.web.js
    • app.web.routes.js
    • ...

তারপরে কোডে:

var app_config = require('./app.config');
var app_models_foo = require('./app.models.foo');

বা শুধু

var config = require('./app.config');
var foo = require('./app.models.foo');

এবং বহিরাগত নির্ভরতা নোড_মডিউলগুলি যথারীতি উপলভ্য:

var express = require('express');

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

মূল অসুবিধা অবশ্যই হ'ল কোনও ফাইল ব্রাউজারে আপনি গাছটিকে প্রসারিত / ধস করতে পারবেন না যদিও এটি বাস্তবে ডিরেক্টরিতে সজ্জিত। তবে আমি এটি পছন্দ করি যে সমস্ত কোডটি কোথা থেকে আসছে তা সম্পর্কে খুব স্পষ্ট। এবং এটি কোনও 'যাদু' ব্যবহার করে না।


আপনি যে সংযোগটি সংযুক্ত করেছেন, সেগুলি থেকে সমাধান # 7, "দ্য র্যাপার" বেশ সহজ এবং সুবিধাজনক।
পিয়র-লুক জেনড্রেও

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

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

9

আপনার প্রকল্পের মূলটিকে বর্তমানের চলমান ডিরেক্টরি বলে ধরে নিলে এটি কাজ করা উচিত:

// require built-in path module
path = require('path');

// require file relative to current working directory
config = require( path.resolve('.','config.js') );

config = require('./config.js');বৈধ।
cespon

7
@ এসপোন এমন কোনও নয় যা কেবলমাত্র প্রয়োজনীয় ফাইলের সাথে সম্পর্কিত।
প্রোটোমেটা

8

আমি এই সমাধানগুলির অনেকগুলি চেষ্টা করেছি। আমি এটিকে আমার মূল ফাইলের শীর্ষে যুক্ত করে শেষ করেছি (উদাঃ index.js):

process.env.NODE_PATH = __dirname;
require('module').Module._initPaths();

স্ক্রিপ্টটি লোড হওয়ার পরে এটি NODE_PATH এ প্রকল্পের মূলটিকে যুক্ত করে। প্রকল্পটি যেমন প্রকল্পের মূল থেকে এর আপেক্ষিক পথটি উল্লেখ করে আমার প্রকল্পের কোনও ফাইলের জন্য আমাকে অনুমতি দেয় var User = require('models/user')। আপনার প্রকল্পে অন্য কোনও কিছু চালানোর আগে আপনি প্রকল্পের মূল স্ক্রিপ্টটি চালাচ্ছেন না কেন এই সমাধানটি কাজ করা উচিত।


8

উত্তরের কয়েকটি বলছে যে প্যাকেজ হিসাবে নোড_মডিউলটিতে কোড যুক্ত করা সবচেয়ে ভাল উপায়, আমি সম্মত এবং এটি সম্ভবত হারানোর সর্বোত্তম উপায় ../../../তবে তাদের মধ্যে কেউই আসলে এটি করার উপায় দেয় না।

সংস্করণ থেকে 2.0.0আপনি স্থানীয় ফাইলগুলি থেকে একটি প্যাকেজ ইনস্টল করতে পারেন, যার অর্থ আপনি যে সমস্ত প্যাকেজগুলি চান তা আপনার রুটে ফোল্ডার তৈরি করতে পারেন,

-modules
 --foo
 --bar 
-app.js
-package.json

সুতরাং প্যাকেজ.জেসন আপনি এইভাবে বাহ্যিক সার্ভার প্রকাশ বা ব্যবহার না করে প্যাকেজ হিসাবে modules(বা fooএবং bar) যুক্ত করতে পারেন :

{
  "name": "baz",
  "dependencies": {
    "bar": "file: ./modules/bar",
    "foo": "file: ./modules/foo"
  }
}

এর পরে আপনি করেন npm installএবং আপনি var foo = require("foo")অন্যান্য প্যাকেজগুলির মতোই কোডটি অ্যাক্সেস করতে পারেন ।

এখানে আরও তথ্য পাওয়া যাবে :

https://docs.npmjs.com/files/package.json#local-paths

এবং এখানে কীভাবে প্যাকেজ তৈরি করবেন:

https://docs.npmjs.com/getting-started/creating-node-modules


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

7

আপনি আমার তৈরি একটি মডিউল ব্যবহার করতে পারেন, আনডট । এটি উন্নত কিছুই নয়, কেবল সহায়ক so

উদাহরণ:

var undot = require('undot');
var User = undot('models/user');
var config = undot('config');
var test = undot('test/api/user/auth');

6

আপনি আপনার অ্যাপ্লিকেশনগুলিতে এর মতো কিছু সংজ্ঞায়িত করতে পারেন:

requireFromRoot = (function(root) {
    return function(resource) {
        return require(root+"/"+resource);
    }
})(__dirname);

এবং তারপরে যে কোনও সময় আপনি রুট থেকে কোনও জিনিস চাইবেন, আপনি যেখানেই থাকুন না কেন, আপনি কেবল ভ্যানিলা প্রয়োজনের পরিবর্তে প্রয়োজনীয়FromRoot ব্যবহার করেন। আমার জন্য এখনও পর্যন্ত বেশ ভাল কাজ করে।


ধন্যবাদ! আমি মনে করি এটি বেশ স্মার্ট এবং সোজা।
রায়ান

আমাকে ক্ষমা কর বাবা আমি পাপ করেছি. আমি ES6 এই বৈশিষ্ট্যসমূহ নিয়ে আসা এবং নিচের করেছেন: requireFromRoot = ((root) => (resource) => require(`${root}/${resource}`))(__dirname);। সমাধানটি ভালোবাসি, তবে আপনাকে কি __ড্রিনামটি এমনভাবে বাঁধতে হবে?
নাক

1
এতে আমার স্মৃতিশক্তি কিছুটা দুর্বল, তবে আমি বিশ্বাস করি __ ডিরেক্টরিতে কোন ফাইলের মধ্যে এটি ব্যবহৃত হয় তার উপর নির্ভর করে মান পরিবর্তন করে। এখন এটি হতে পারে যেহেতু ফাংশনটি একক স্থানে সংজ্ঞায়িত করা হয়েছে তবে একাধিক স্থানে ব্যবহৃত হয়েছে, তাই এই বাঁধাই না করেও মানটি স্থির থাকবে, তবে আমি কেবল এটি করেছি যাতে এটি সত্য হয় তা নিশ্চিত করার জন্য।
ব্যবহারকারী 1417684

এটি একটি দীর্ঘ সময় আগে করেছে, পরীক্ষাগুলি envs এবং এর মতো ব্যথা করে। ওভারহেডের মূল্য নেই। এলোমেলো নতুন গ্লোবাল নতুন মানুষকে
ব্লে ব্ল্যাক করে

এবং আপনি requireএই ফাংশনটি কীভাবে করবেন ?
ডার্কো মাক্সিমোভিক

5

এখানে আমি 6 মাসেরও বেশি সময় ধরে আসছি way আমি প্রকল্পে আমার মূল ফোল্ডার হিসাবে নোড_মডিউলস নামের একটি ফোল্ডারটি ব্যবহার করি, এইভাবে যেখানেই আমি একে অপ্রয়োজনীয় ফোন করি না কেন এটি সর্বদা সেই ফোল্ডারটির সন্ধান করবে:

  • node_modules
    • আমার প্রকল্প
      • index.js আমার প্রয়োজনের পরিবর্তে ("আমারপ্রজেক্ট / কিছু ফোল্ডার / হেই.জেএস") প্রয়োজন হতে পারে ("./ কিছু ফোল্ডার / হেই.জেএস")
      • কিছু ফোল্ডার যা hey.js রয়েছে

আপনি যখন ফোল্ডারে বাসা বেঁধে থাকেন তখন এটি আরও কার্যকর এবং যদি সম্পূর্ণ উপায়ে সেট করা থাকে তবে কোনও ফাইলের অবস্থান পরিবর্তন করা খুব কম কাজ। আমি আমার সম্পূর্ণ অ্যাপ্লিকেশনটিতে কেবল 2 টি আপেক্ষিক প্রয়োজন ।


4
আমি লোকাল (প্রকল্পের) node_modulesএ যুক্ত করে ব্যতীত অনুরূপ পন্থা ব্যবহার করি /srcএবং /node_modulesবিক্রেতাদের জিনিস আলাদা রাখতে রাখি। সুতরাং আমার কাছে /src/node_modulesস্থানীয় কোড এবং /node_modulesবিক্রেতাদের জন্য রয়েছে।
মারিয়াস বালিয়েটাইস

33
নোড_মডিউলগুলি ফোল্ডারটি কেবল নোড_মডিউলগুলির জন্য IM আপনার পুরো প্রকল্পটি সেই ফোল্ডারের ভিতরে রাখা ভাল অভ্যাস নয়।
ম্যাকসাস

2
@ এমসিএসাস উপরের মত একই প্রভাব পেতে বিকল্প হিসাবে আপনি কী প্রস্তাব করবেন?
spieglio

3
@cspiegl আপনি NODE_PATHপরিবেশের পরিবর্তনশীল ব্যবহার করতে পারেন
ক্রিস্টোফার

5

ইমো এটি অর্জনের সবচেয়ে সহজ উপায় হ'ল অ্যাপ স্টার্টআপে প্রতীকী লিঙ্ক তৈরি করা node_modules/app(বা আপনি যেটাকেই বলুন ) কোন দিকে ইঙ্গিত করে ../app। তারপরে আপনি কেবল কল করতে পারেন require("app/my/module")। প্রতীকী লিঙ্কগুলি সমস্ত বড় প্ল্যাটফর্মগুলিতে উপলব্ধ।

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


উইন্ডোজ সমর্থন সমর্থন নোড এবং ওএস আরও গভীরতর জ্ঞান প্রয়োজন। এটি কোনও ওপেন সোর্স প্রকল্পের ব্যাপক ব্যবহারকে সীমাবদ্ধ করতে পারে।
স্টিভেন ওয়াচন

সাধারণত আমি কোনও লাইব্রেরির জন্য এই প্যাটার্নটি ব্যবহার করব না (যা বেশিরভাগ ওপেন সোর্স প্রকল্পগুলি)। তবে এনপিএম বিল্ড হুকের মধ্যে এই সিমলিংকগুলি তৈরি করা সম্ভব তাই ব্যবহারকারীর দ্বারা প্রয়োজনীয় কোনও গভীর-জ্ঞানের প্রয়োজন নেই।
জোহানেস ইয়াল্ড

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

4

আপনার নিজের প্রকল্পে আপনি রুট ডিরেক্টরিতে ব্যবহৃত কোন .js ফাইল পরিবর্তন করতে পারেন এবং process.envভেরিয়েবলের কোনও সংস্থায় এর পথ যুক্ত করতে পারেন । উদাহরণ স্বরূপ:

// in index.js
process.env.root = __dirname;

এরপরে আপনি যে কোনও জায়গায় সম্পত্তি অ্যাক্সেস করতে পারবেন:

// in app.js
express = require(process.env.root);

4

অন্য উত্তর:

এই ফোল্ডারগুলির গঠনটি কল্পনা করুন:

  • node_modules
    • lodash
  • src
    • subdir
      • foo.js
      • bar.js
    • main.js
  • পরীক্ষা

    • test.js

তারপরে টেস্ট.জেজে , আপনাকে এই জাতীয় ফাইলের প্রয়োজন হবে:

const foo = require("../src/subdir/foo");
const bar = require("../src/subdir/bar");
const main = require("../src/main");
const _ = require("lodash");

এবং মেইন.জেএস এ :

const foo = require("./subdir/foo");
const bar = require("./subdir/bar");
const _ = require("lodash");

এখন আপনি এটির সাথে ব্যাবেল এবং ব্যাবেল-প্লাগইন-মডিউল-রেজোলভার ব্যবহার করতে পারেন । 2 টি মূল ফোল্ডার কনফিগার করতে বাবিলার্ক ফাইল:

{
    "plugins": [
        ["module-resolver", {
            "root": ["./src", "./src/subdir"]
        }]
    ]
}

এখন আপনি একই পদ্ধতিতে ফাইল প্রয়োজন হতে পারে পরীক্ষা এবং src :

const foo = require("foo");
const bar = require("bar");
const main = require("main");
const _ = require("lodash");

এবং আপনি যদি এস 6 মডিউল বাক্য গঠন ব্যবহার করতে চান :

{
    "plugins": [
        ["module-resolver", {
            "root": ["./src", "./src/subdir"]
        }],
        "transform-es2015-modules-commonjs"
    ]
}

তারপরে আপনি পরীক্ষাগুলি এবং এসসিআরগুলিতে ফাইলগুলি আমদানি করুন :

import foo from "foo"
import bar from "bar"
import _ from "lodash"


3

examplesডিরেক্টরিতে node_modulesপ্রকল্পের মূলের সাথে একটি প্রতীকী লিঙ্কযুক্ত এমনটি থাকতে পারে না project -> ../../যাতে উদাহরণগুলি ব্যবহারের অনুমতি দেয় require('project'), যদিও এটি ম্যাপিংটি সরিয়ে দেয় না, এটি উত্সটি require('project')পরিবর্তে ব্যবহার করার অনুমতি দেয় require('../../')

আমি এটি পরীক্ষা করেছি এবং এটি v0.6.18 এর সাথে কাজ করে।

projectডিরেক্টরি তালিকা

$ ls -lR project
project:
drwxr-xr-x 3 user user 4096 2012-06-02 03:51 examples
-rw-r--r-- 1 user user   49 2012-06-02 03:51 index.js

project/examples:
drwxr-xr-x 2 user user 4096 2012-06-02 03:50 node_modules
-rw-r--r-- 1 user user   20 2012-06-02 03:51 test.js

project/examples/node_modules:
lrwxrwxrwx 1 user user 6 2012-06-02 03:50 project -> ../../

বিষয়বস্তু অবজেক্টের index.jsএকটি সম্পত্তির জন্য একটি মূল্য নির্ধারণ করে exportsএবং console.logএকটি বার্তাকে অনুরোধ করে যাতে এটি প্রয়োজনীয় ছিল was বিষয়বস্তু test.jsহয় require('project')


আপনি কি আপনার পরীক্ষার উত্সকোডটি দেখাতে পারেন? ভাল, এবং এটি কাজ করবে যদি আমাকে এইভাবে ('प्रोजेक्ट.এ') প্রয়োজন হয়?
Totty.js

আপনি কি বলতে চাইছেন require('project.a')? আমি মনে করি এর অর্থ হতে পারে require('project/a'), যদিও require('project').aএটিও সম্ভব?
ড্যান ডি

তবে আপনার উদাহরণের সাথে আমার প্রতিটি ফোল্ডারে সেই ফোল্ডারগুলি তৈরি করা দরকার যেখানে একটি মডিউল রয়েছে যেখানে প্রয়োজনীয় পদ্ধতির প্রয়োজন হয়। যাইহোক আপনার ফোল্ডারটির উপর নির্ভর করে "../" সময় সম্পর্কে যত্ন নেওয়া প্রয়োজন।
Totty.js

আসলে লিঙ্কটি কেবলমাত্র node_modulesফাইলের উভয়ের নিকটতম পিতামাতার একটি ডিরেক্টরিতে থাকা দরকার এবং লিঙ্কটি উভয়ের ক্ষেত্রে একই হবে the Nodejs.org/api/…
ডান ডি

এবং যে অবস্থান থেকে আপেক্ষিক হতে হবে। উদাহরণস্বরূপ: project/node_modules/project -> ../
ড্যান ডি

2

যদি কেউ এই সমস্যাটি সমাধানের জন্য আর কোনও উপায় সন্ধান করে থাকেন তবে এই প্রচেষ্টাতে আমার নিজের অবদান এখানে:

https://www.npmjs.com/package/use-import

প্রাথমিক ধারণা: আপনি প্রকল্পের মূলটিতে একটি JSON ফাইল তৈরি করেন যা আপনার ফাইলপ্যাথগুলি শর্টহ্যান্ডের নামগুলিতে মানচিত্র করে (বা এটি করার জন্য ব্যবহার-অটোম্যাপার পান)। তারপরে আপনি এই নামগুলি ব্যবহার করে আপনার ফাইল / মডিউলগুলির জন্য অনুরোধ করতে পারেন। তাই ভালো:

var use = require('use-import');
var MyClass = use('MyClass');

সুতরাং যে আছে।


2

আমি যা করতে চাই তা হ'ল লিভারেজ কীভাবে নোড_মডিউল ডিরেক্টরিটি এর জন্য লোড হয়।

যদি কেউ মডিউল "জিনিস" লোড করার চেষ্টা করে তবে কেউ এমন কিছু করবে

require('thing');

নোড তারপরে 'নোড_মডিউল' ডিরেক্টরিতে 'জিনিস' ডিরেক্টরিটি অনুসন্ধান করবে।

যেহেতু নোড_মডিউল সাধারণত প্রকল্পের মূলে থাকে তাই আমরা এই ধারাবাহিকতাটি উপকার করতে পারি। (যদি নোড_মডিউল মূলে না থাকে, তবে আপনার সাথে মোকাবিলা করার জন্য অন্যান্য স্ব-প্রবৃদ্ধ মাথাব্যথাও রয়েছে))

যদি আমরা ডিরেক্টরিতে চলে যাই এবং তারপরে ফিরে আসি তবে আমরা নোড প্রকল্পের মূলের একটি ধারাবাহিক পথ পেতে পারি।

require('thing/../../');

তারপরে যদি আমরা / হ্যাপি ডিরেক্টরিটি অ্যাক্সেস করতে চাই তবে আমরা এটি করব।

require('thing/../../happy');

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

বিষয়গুলি পরিষ্কার করার জন্য, আমি এটি করি কারণ মডিউলের নামটি কোনও ব্যাপার নয়।

require('root/../../happy');

আমি সম্প্রতি এটি কৌনিক 2 এর জন্য ব্যবহার করেছি। আমি মূল থেকে কোনও পরিষেবা লোড করতে চাই।

import {MyService} from 'root/../../app/services/http/my.service';

আপনার কৌনিক রেফারেন্স সম্পর্কে, একটি স্ট্যান্ডার্ড সিএলআই অ্যাপ্লিকেশন সহ, আপনি কেবল আমদানি src/app/my.serviceকরতে পারেন, টাইপস্ক্রিপ্ট ফাইলগুলির জন্য আপেক্ষিক আমদানি ব্যবহার করতে আপনি ভিএসসি কনফিগার করতে পারেন।
প্লপি

2

আমি এই ছোট প্যাকেজটি লিখেছি যা আপনাকে কোনও গ্লোবাল ভেরিয়েবলগুলি প্রবর্তন করা বা নোড ডিফল্টকে ছাড়িয়ে না দিয়ে প্রকল্পের মূল থেকে তাদের আপেক্ষিক পথে প্যাকেজগুলির প্রয়োজন হতে দেয়

https://github.com/Gaafar/pkg-require

এটি এভাবে কাজ করে

// create an instance that will find the nearest parent dir containing package.json from your __dirname
const pkgRequire = require('pkg-require')(__dirname);

// require a file relative to the your package.json directory 
const foo = pkgRequire('foo/foo')

// get the absolute path for a file
const absolutePathToFoo = pkgRequire.resolve('foo/foo')

// get the absolute path to your root directory
const packageRootPath = pkgRequire.root()

কখনও কখনও প্রধান প্রকল্পে আমার ব্যক্তিগত প্যাকেজ থাকে, এটির সাথে এই স্ক্রিপ্টটি ভেঙে যায়। এটি ছাড়াও আমি নিশ্চিত না যে ওয়েবপ্যাকটি দিয়ে ভাল কাজ করবে (যদি আপনি আমার মতো নোড.জেএস সহ ওয়েবপ্যাক ব্যবহার করেন)
Totty.js

আপনার যদি প্যাকেজ ফাইল সহ ডিরেক্টরিতে বাসা বাঁধে তবে প্রতিটি দির কেবল তার প্যাকেজের মধ্যেই ফাইলগুলির প্রয়োজন হবে। আপনি কি আচরণ চান না? আমি ওয়েবপ্যাক দিয়ে পরীক্ষা করিনি।
গাফি

এটি একটি সাধারণ প্রকল্পের জন্য নিখুঁতভাবে কাজ করেছে এবং অন্য উত্তরগুলির তুলনায় অনেক সহজ।
বাইকসর

2

পাওলো মোরেটি এবং ব্রাউজারফি থেকে দুর্দান্ত উত্তরটি অনুসরণ করতে চাই । আপনি যদি একটি transpiler ব্যবহার করে থাকেন (যেমন, Babel, টাইপ করা বিষয়) এবং আপনি উৎস জন্য পৃথক ফোল্ডার ও মত transpiled কোড আছে এবংsrc/dist/ , আপনি সমাধানের একটি প্রকরণ ব্যবহার করতে পারে

node_modules

নিম্নলিখিত ডিরেক্টরি কাঠামো সহ:

app
  node_modules
    ... // normal npm dependencies for app
  src
    node_modules
      app
        ... // source code
  dist
    node_modules
      app
        ... // transpiled code

এরপরে আপনি বাবেল ইত্যাদিকে srcডিরেক্টরিতে স্থানান্তর করতে দিতে পারেনdist ডিরেক্টরিতে ।

সিমবলিক লিঙ্ক

সিমলিংক ব্যবহার করে আমরা নীড়ের কিছু স্তর থেকে মুক্তি পেতে পারি:

app
  node_modules
    ... // normal npm dependencies for app
  src
    node_modules
      app // symlinks to '..'
    ... // source code
  dist
    node_modules
      app // symlinks to '..'
    ... // transpiled code

Babel সঙ্গে একটি সতর্কীকরণ --copy-ফাইল--copy-files পতাকা babelভাল symlinks সাথে মোকাবিলা করে না। এটি ..সিমলিংকে নেভিগেট করতে এবং অবিরাম ফাইলগুলি পুনরুদ্ধার করে দেখতে পারে। একটি কর্মপরিকল্পনা নিম্নলিখিত ডিরেক্টরি কাঠামো ব্যবহার করা হয়:

app
  node_modules
    app // symlink to '../src'
    ... // normal npm dependencies for app
  src
    ... // source code
  dist
    node_modules
      app // symlinks to '..'
    ... // transpiled code

এইভাবে, এর অধীনে srcথাকা কোডগুলি এখনও appসমাধান হয়ে যাবে src, যেখানে বাবেল আর সিমলিংক দেখতে পাবে না।


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

প্রকৃতপক্ষে প্রবাহটি আমার ক্ষেত্রে কাজ করে বলে মনে হচ্ছে, এটি বিস্ময়ের কিছু নয় যেহেতু সমাধানগুলি স্ট্যান্ডার্ড নোড মডিউল রেজোলিউশন মডেল এবং সিমলিংকের উপর নির্ভর করে। সুতরাং প্রবাহের মতো বোঝার মতো সরঞ্জামগুলির পক্ষে এটি আসলে যাদু নয়। তবে আইডিই আলাদা।
ব্যবহারকারী 716468

2

আমি যে কোনও স্তর থেকে ফাইলগুলি প্রয়োজন ঠিক একই সরলতার সন্ধান করছিলাম এবং আমি মডিউল-ওরফে খুঁজে পেয়েছি

কেবল ইনস্টল করুন:

npm i --save module-alias

আপনার প্যাকেজ.জসন ফাইলটি খুলুন, এখানে আপনি আপনার পাথের জন্য এলিয়াস যুক্ত করতে পারেন, উদাহরণস্বরূপ

"_moduleAliases": {
 "@root"      : ".", // Application's root
 "@deep"      : "src/some/very/deep/directory/or/file",
 "@my_module" : "lib/some-file.js",
 "something"  : "src/foo", // Or without @. Actually, it could be any string
}

এবং আপনার উপস্বকে সহজভাবে ব্যবহার করুন:

require('module-alias/register')
const deep = require('@deep')
const module = require('something')

1

আমি "রেকিউর" নামে একটি নোড মডিউল তৈরি করেছি

এটি আপনাকে আপেক্ষিক পাথ ব্যবহার না করেই প্রয়োজনীয়তার অনুমতি দেয়

https://npmjs.org/package/rekuire

এটি ব্যবহার করা অত্যন্ত সহজ


1

আমরা এই সমস্যাটি মোকাবেলায় নতুন উপায়ে চেষ্টা করতে চলেছি।

বসন্ত এবং গুইস এর মতো অন্যান্য পরিচিত প্রকল্পগুলির উদাহরণ গ্রহণ করে আমরা একটি "প্রসঙ্গ" অবজেক্টটি সংজ্ঞায়িত করব যাতে "প্রয়োজনীয়" বিবৃতি থাকবে।

এই অবজেক্টটি তারপরে ব্যবহারের জন্য অন্য সমস্ত মডিউলকে দেওয়া হবে।

উদাহরণ স্বরূপ

var context = {}

context.module1 = require("./module1")( { "context" : context } )
context.module2 = require("./module2")( { "context" : context } )

এটি আমাদের প্রতিটি মডিউলকে একটি ফাংশন হিসাবে লিখতে হবে যা অপ্টস গ্রহণ করে, যা আমাদের যাইহোক সেরা অনুশীলন হিসাবে দেখায় ..

module.exports = function(context){ ... }

এবং তারপরে আপনি স্টাফের প্রয়োজনের পরিবর্তে প্রসঙ্গটি উল্লেখ করবেন।

varডিডিআরএফ = প্রসঙ্গ.মুডুয়েল 1;

আপনি যদি চান, প্রয়োজনীয় বিবৃতিগুলি করতে আপনি সহজেই একটি লুপ লিখতে পারেন

var context = {};
var beans = {"module1" : "./module1","module2" : "./module2" }; 
for ( var i in beans ){
    if ( beans.hasOwnProperty(i)){
         context[i] = require(beans[i])(context);
    }
};

আপনি যখন উপহাস করতে চান (পরীক্ষাগুলি) এবং প্যাকেজ হিসাবে আপনার কোডটিকে পুনরায় ব্যবহারযোগ্য করার সময় আপনার সমস্যাটি সমাধান করতে চান তখন এটি জীবনকে সহজ করে তুলতে হবে।

আপনি এর থেকে মটরশুটির ঘোষণা পৃথক করে প্রসঙ্গ সূচনা কোডটি পুনরায় ব্যবহার করতে পারেন। উদাহরণস্বরূপ, আপনার main.jsফাইলটি এর মতো দেখতে পারে

var beans = { ... }; // like before
var context = require("context")(beans); // this example assumes context is a node_module since it is reused.. 

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

পরবর্তীতে আমরা মটরশুটিগুলি ফাংশন হিসাবেও সংজ্ঞায়িত করতে পারি - যা আমাদের requireপরিবেশ অনুযায়ী বিভিন্ন মডিউলে অনুমতি দেবে - তবে এটি এই থ্রেডের আওতার বাইরে।


1

আমি এই একই সমস্যা নিয়ে সমস্যায় পড়ছিলাম, তাই আমি অন্তর্ভুক্ত নামে একটি প্যাকেজ লিখেছিলাম ।

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

var async = require('async'),
    foo   = include('lib/path/to/foo')

আমি আশা করি এটি কার্যকর হতে পারে।


1

যদি আপনার অ্যাপের এন্ট্রি পয়েন্ট জেএস ফাইল (যেমন আপনি আসলে "নোড" চালনা করেন) আপনার প্রকল্পের রুট ডিরেক্টরিতে থাকে তবে আপনি রুটপাথ এনপিএম মডিউলটি দিয়ে খুব সহজেই এটি করতে পারেন । কেবল এটির মাধ্যমে ইনস্টল করুন

npm install --save rootpath

... তারপরে এন্ট্রি পয়েন্ট জেএস ফাইলের একেবারে শীর্ষে, যুক্ত করুন:

require('rootpath')();

সেই বিন্দু থেকে সমস্ত প্রয়োজনীয় কলগুলি এখন প্রকল্পের মূলের সাথে তুলনামূলক - যেমনটি require('../../../config/debugging/log'); হয়ে যায় require('config/debugging/log');(যেখানে কনফিগার ফোল্ডারটি প্রকল্পের মূলে থাকে)।


1

সাধারণ লাইনে আপনি নিজের ফোল্ডারটিকে মডিউল হিসাবে কল করতে পারেন:

তার জন্য আমাদের দরকার: গ্লোবাল এবং অ্যাপ্লিকেশন-মডিউল-পাথ মডিউল

এখানে "অ্যাপ্লিকেশন-মডিউল-পাথ" হল মডিউল, এটি আপনাকে নোড.জেএস মডিউল অনুসন্ধানের পথে অতিরিক্ত ডিরেক্টরি যুক্ত করতে সক্ষম করে এবং "গ্লোবাল" হ'ল, আপনি এই বস্তুর সাথে যা কিছু সংযুক্ত করবেন তা আপনার অ্যাপ্লিকেশনের যে কোনও জায়গায় পাওয়া যাবে।

এখন এই স্নিপেটটি দেখুন:

global.appBasePath = __dirname;

require('app-module-path').addPath(appBasePath);

__ডিরনামটি নোডের বর্তমান চলমান ডিরেক্টরি module মডিউলটির পথ অনুসন্ধান করতে আপনি এখানে নিজের পাথ দিতে পারেন।

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