নোড.জেএস-এ __dirname এবং ./ এর মধ্যে পার্থক্য কী?


497

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


47
tl; dr: সুতরাং, মূলত পার্থক্যটি হ'ল './' এবং 'process.cwd ()' টার্মিনালের বর্তমান দিরকে স্ক্রিপ্ট বলে, যেখানে '__dirname' বোঝায় যে স্ক্রিপ্টটি সেই দিরকে বোঝায় t সংরক্ষণ করা হয়।
গুই ইমামুরা

1
বাইরে কখন .ব্যবহৃত হয় require। ভিতরে requireথাকা পথটি সর্বদা কল থাকা ফাইলের সাথে সম্পর্কিত require
গোবিন্দ রাই

উত্তর:


813

সারমর্ম

নোড.জেএস-এ, __dirnameসর্বদা সেই ডিরেক্টরি যেখানে বর্তমানে সম্পাদনকারী স্ক্রিপ্টটি থাকে (এটি দেখুন )। সুতরাং আপনি যদি টাইপ __dirnameকরেন /d1/d2/myscript.js, মান হবে /d1/d2

বিপরীতে, .আপনি যে ডিরেক্টরিটি থেকে nodeআপনার টার্মিনাল উইন্ডোতে কমান্ডটি চালিয়েছিলেন (যেমন আপনার কার্যনির্বাহী ডিরেক্টরি) আপনি যখন লাইব্রেরি ব্যবহার করেন pathএবং তা দেয় fs। প্রযুক্তিগতভাবে, এটি আপনার কার্যক্ষম ডিরেক্টরি হিসাবে শুরু হয় তবে এটি ব্যবহার করে পরিবর্তন করা যেতে পারে process.chdir()

ব্যতিক্রমটি যখন আপনি ব্যবহার .করবেন তখন require()। ভিতরে requireথাকা পথটি সর্বদা কল থাকা ফাইলের সাথে সম্পর্কিত require

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

ধরা যাক আপনার ডিরেক্টরি কাঠামোটি

/dir1
  /dir2
    pathtest.js

এবং pathtest.jsরয়েছে

var path = require("path");
console.log(". = %s", path.resolve("."));
console.log("__dirname = %s", path.resolve(__dirname));

এবং তুমি কর

cd /dir1/dir2
node pathtest.js

তুমি পাও

. = /dir1/dir2
__dirname = /dir1/dir2

আপনার ওয়ার্কিং ডিরেক্টরিটি /dir1/dir2তাই যা .সমাধান হয়। যেহেতু এটির মধ্যেও সমাধান হয় যা এর pathtest.jsমধ্যে অবস্থিত ।/dir1/dir2__dirname

তবে আপনি যদি স্ক্রিপ্টটি চালান /dir1

cd /dir1
node dir2/pathtest.js

তুমি পাও

. = /dir1
__dirname = /dir1/dir2

সেক্ষেত্রে, আপনার কাজের তালিকা ছিল /dir1যাতে এটা কি .করার সংকল্প কিন্তু __dirnameএখনও সমাধান করা থেকে /dir1/dir2

.ভিতরে ব্যবহার করা হচ্ছে require...

ভিতরে যদি dir2/pathtest.jsআপনি একটি আছে requireমধ্যে কল একটি ফাইল অন্তর্ভুক্ত ভিতরে dir1আপনি হবে সবসময় কি

require('../thefile')

কারণ ভিতরে থাকা পথটি requireসর্বদা সেই ফাইলের সাথে সম্পর্কিত যেখানে আপনি এটি কল করছেন। এটি আপনার কার্যকরী ডিরেক্টরিটির সাথে কোনও সম্পর্ক রাখে না।


38
আইএমও, স্বীকৃত উত্তর থেকে এই ব্যাখ্যাটি কিছুটা পরিষ্কার (আপনি জানেন যে "বর্তমান ডিরেক্টরি" সেখানে কিছুটা দ্বিধাগ্রস্ত)।
দেহধারী

5
আমি রাজী. আমি গৃহীত উত্তর পরিবর্তন করব। দয়া করে মনে রাখবেন যে উত্তরটি মূল উত্তরটি গৃহীত হওয়ার 2.5 বছর পরে যুক্ত করা হয়েছিল এবং আমি কেবল এখন এটি লক্ষ্য করেছি (আরও 2 বছর পরে)। :) আগের চেয়ে বেশি দেরি!
thisissami

14
এটি লক্ষ্য করার মতো ./বিষয় যে নোডটি যে ডিরেক্টরি থেকে শুরু হয়েছিল তা সর্বদা নয় । এটি সেভাবেই শুরু হয় তবে এর মাধ্যমে পরিবর্তন করা যায় process.chdir()। সুতরাং, ./সর্বদা বর্তমান ওয়ার্কিং ডিরেক্টরি, যা সাধারণত ডিরেক্টরি নোড থেকে আরম্ভ করা হয়, যদি না আপনার কোড স্পষ্টভাবে কার্যকরী ডিরেক্টরি পরিবর্তন করে।
গিলি

3
আমি ব্যবহার সম্পর্কে কিছুটা বিভ্রান্ত হয়ে পড়েছি। অভ্যন্তরের অংশের প্রয়োজন হয়, যদি অভ্যন্তরের পাথটি যে কলটি আপনি কল করছেন তার সাথে সর্বদা সম্পর্কিত হয়, তবে ('../ dir1 / thefile') পরিবর্তে সেই পথটির প্রয়োজন হবে না ('../ thefile')? আমি ভেবেছিলাম .. পথের বর্তমান অবস্থানটি ইতিমধ্যে dir2 থেকে dir1 এ এক স্তরে ফিরিয়ে আনুন। আপনার কি এখনও পথটিতে dir1 লাগাতে হবে বা আমি কিছু বুঝতে পারছি না?
andromada

1
আপনি যদি ../someDirকিছু স্ক্রিপ্টে ব্যবহার করতে চান এবং আপনি অন্য একটি ফোল্ডার থেকে কমান্ডটি চালাচ্ছেন তবে আপনি কী করবেন?
সিবিডিভেলপার

154

./require()ফাংশন বাদে বর্তমান ওয়ার্কিং ডিরেক্টরিকে বোঝায় । ব্যবহার করার সময় এটি বর্তমান ফাইলটির ডিরেক্টরিটিতে require()অনুবাদ ./করে। __dirnameসর্বদা বর্তমান ফাইলের ডিরেক্টরি।

উদাহরণস্বরূপ, নিম্নলিখিত ফাইল কাঠামো সহ

/home/user/dir/files/config.json

{
  "hello": "world"
}

/home/user/dir/files/somefile.txt

text file

/home/user/dir/dir.js

var fs = require('fs');

console.log(require('./files/config.json'));
console.log(fs.readFileSync('./files/somefile.txt', 'utf8'));

যদি আমি cdবা /home/user/dirএবং চালানোর node dir.jsআমি পাবেন

{ hello: 'world' }
text file

কিন্তু আমি যখন থেকে একই স্ক্রিপ্টটি রান /home/user/আমি পেতে

{ hello: 'world' }

Error: ENOENT, no such file or directory './files/somefile.txt'
    at Object.openSync (fs.js:228:18)
    at Object.readFileSync (fs.js:119:15)
    at Object.<anonymous> (/home/user/dir/dir.js:4:16)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.0 (module.js:470:10)
    at EventEmitter._tickCallback (node.js:192:40)

ব্যবহার করে তবে ./কাজ করে requireনা fs.readFileSync। এর কারণ fs.readFileSync, ./সিডব্লিউডিতে অনুবাদ (এই ক্ষেত্রে /home/user/)। এবং /home/user/files/somefile.txtঅস্তিত্ব নেই।


ওহ আমি ভেবেছিলাম __ডেরামনামটি বর্তমান ওয়ার্কিং ডিরেক্টরি ছিল ... স্পষ্টতার জন্য ধন্যবাদ!

অ্যাপ্লিকেশনটির ওয়ার্কিং ডিরেক্টরিটি এফএস সহ উল্লেখ করার কোনও উপায় আছে কি? উদাহরণস্বরূপ, আমি ওয়ার্কিং ডিরেক্টরি থেকে একটি ফাইল লোড করার চেষ্টা করছি /movies, তবে যেহেতু আমার মডিউলটি একটি ফাইলে রয়েছে /custom_modules/, __dirnameথেকে সিনেমাটি দখল করার চেষ্টা করে/custom_modules/movies

2
আপনি ব্যবহার করতে পারেন ./বা process.cwd()। দেখতে nodejs.org/api/process.html#process_process_cwd
fent

লক্ষণীয় যে, __dirname ./ এর বেশি ব্যবহার করা ভাল ধারণা নয় কারণ যদিও তারা নোডে অভিন্ন আচরণ করে তবে এটি প্যাকেজগুলির জন্য ব্রাউজারফাই বিল্ডযুক্ত সমস্যাগুলির কারণ হতে পারে যা অন্যথায় সহজেই এড়ানো যায়।
জেড ওয়াটসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.