নোড.জেএস এর অধীনে কোনও স্ক্রিপ্ট চলছে কিনা তা কীভাবে পরীক্ষা করবেন?


159

আমার কাছে নোড.জেএস স্ক্রিপ্ট থেকে আমার একটি স্ক্রিপ্ট রয়েছে যা আমি জাভাস্ক্রিপ্ট ইঞ্জিনকে স্বাধীন রাখতে চাই।

উদাহরণস্বরূপ, আমি exports.x = y;কেবলমাত্র এটি করতে চাই যদি এটি নোড.জেএস এর অধীনে চলছে if আমি এই পরীক্ষাটি কীভাবে সম্পাদন করতে পারি?


এই প্রশ্নটি পোস্ট করার সময়, আমি জানতাম না নোড.জেএস মডিউল বৈশিষ্ট্যটি কমনজেএস-এর উপর ভিত্তি করে ।

আমি যে নির্দিষ্ট উদাহরণটি দিয়েছি তার জন্য আরও সঠিক প্রশ্নটি হ'ল:

কোনও স্ক্রিপ্ট কীভাবে বলতে পারে যে এটি একটি কমনজেএস মডিউল হিসাবে প্রয়োজন হয়েছে কিনা?


3
আপনি কেন এটি চেষ্টা করছেন তা আমার কোনও ধারণা নেই তবে থাম্বের নিয়ম হিসাবে আপনাকে ইঞ্জিন সনাক্তকরণের পরিবর্তে বৈশিষ্ট্য সনাক্তকরণ ব্যবহার করা উচিত। quirksmode.org/js/support.html
কোয়ান্টিন

4
এটি আসলে কীভাবে বৈশিষ্ট্য সনাক্তকরণ কার্যকর করতে হবে তার একটি অনুরোধ, তবে প্রশ্নটি নিজেকে খারাপভাবে বর্ণনা করে।
একরঙা

আমার নিজের ব্যবহারের জন্য একটি গ্রন্থাগার প্রকাশ করেছে, এটি npmjs.com/package/detect-is-node
abhirathore2006


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

উত্তর:


80

কমনজেএস সমর্থনটি সন্ধান করে , এভাবেই অ্যান্ডস্কোর.জেএস গ্রন্থাগার এটা আছে:

আপনার আপডেট হওয়া প্রশ্নে সম্পাদনা করুন:

(function () {

    // Establish the root object, `window` in the browser, or `global` on the server.
    var root = this; 

    // Create a reference to this
    var _ = new Object();

    var isNode = false;

    // Export the Underscore object for **CommonJS**, with backwards-compatibility
    // for the old `require()` API. If we're not in CommonJS, add `_` to the
    // global object.
    if (typeof module !== 'undefined' && module.exports) {
            module.exports = _;
            root._ = _;
            isNode = true;
    } else {
            root._ = _;
    }
})();

উদাহরণ এখানে মডিউল প্যাটার্ন ধরে রাখে।


45
এটি কমনজেএস সমর্থন সনাক্ত করে, যা ব্রাউজারগুলি সমর্থন করতে পারে।
মাইকমেকানা

7
এখানে একটি সমস্যা আছে এবং নাইলার "এটি পেরেক দিয়েছিল"। আমি ব্রাউজারে কমনজেএস চেষ্টা করছি এবং আমি যে মডিউল লোডারটি ব্যবহার করছি মডিউল.এক্সপোর্টগুলি সংজ্ঞায়িত করছি তাই এই সমাধানটি ভুলভাবে আমাকে বলবে যে আমি নোডে আছি।
মার্ক মেলভিল

1
@ মার্কমেলভিলি যুক্তিযুক্তভাবে বলছেন, ওপি ঠিক তাই বলেছে তাই সমস্যা নয়
রস

13
আমার পক্ষে খারাপ শব্দ করা। মানে এই সমাধানে কোনও সমস্যা আছে। ওপি হয়ত এটি মেনে নিয়েছে, তবে আমি তা গ্রহণ করি না।
মার্ক মেলভিলে

7
এটি অবশ্যই দেওয়া সেরা উত্তর নয়।
ব্যবহারকারী3751385

107

ঠিক আছে নোড.জেজে চালানো সনাক্ত করার কোনও নির্ভরযোগ্য উপায় নেই যেহেতু প্রতিটি ওয়েবসাইট সহজেই একই ভেরিয়েবলগুলি ডিক্লেয়ার করতে পারে, তবে windowডিফল্টরূপে নোড.জেসগুলিতে কোনও বস্তু নেই বলে আপনি অন্য উপায়ে যেতে পারেন এবং পরীক্ষা করতে পারেন যে আপনি কোনও অভ্যন্তরে চলছে কিনা। ব্রাউজার।

ব্রাউজারে এবং নোড.জেএস এর অধীনে উভয়ই কাজ করা উচিত এমন লিবের জন্য আমি এটি ব্যবহার করি:

if (typeof window === 'undefined') {
    exports.foo = {};

} else {
    window.foo = {};
}

এটি এখনও বিস্ফোরিত হতে পারে যা windowনোড.জেজে সংজ্ঞায়িত হয়েছে তবে কারও পক্ষে এটি করার কোনও ভাল কারণ নেই কারণ আপনার স্পষ্টতই এই জিনিসটির varউপর সম্পত্তি ছেড়ে দিতে হবে বা সম্পত্তি সেট করতে হবে global

সম্পাদনা

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

function (exports, require, module, __filename, __dirname) { 

দেখুন: https://github.com/ry/node/blob/master/src/node.js#L325

তবে কিছু ক্রেজি স্টাফের মাধ্যমে এটি সনাক্ত করার চেষ্টা করবেন নাarguments.callee.toString() , তার পরিবর্তে কেবল উপরে আমার উদাহরণ কোডটি ব্যবহার করুন যা ব্রাউজারের জন্য পরীক্ষা করে। নোড.জেএস হ'ল একটি উপায় পরিষ্কার পরিবেশ তাই এটি windowএখানে ঘোষিত হওয়ার সম্ভাবনা কম ।


2
সম্পর্কে "নোড.জেএস একটি উপায় পরিষ্কার পরিবেশ, সুতরাং উইন্ডোটি সেখানে ঘোষিত হওয়ার সম্ভাবনা নেই।": ভাল, আমি আমার স্ক্রিপ্টটি নোড.জেএস + জেএসডিএম দ্বারা অনুকরণ করা ব্রাউজারে চলছে কিনা তা জানার একটি উপায় অনুসন্ধান করতে এখানে এসেছি well বা একটি সাধারণ ব্রাউজারে ... কারণটি হ'ল আমার কাছে ইউআরএল অবস্থান যাচাই করতে সেটটাইমআউট ব্যবহার করে অসীম লুপ রয়েছে যা ব্রাউজারে ভাল, তবে নোড.জেএস স্ক্রিপ্টটি চিরতরে চলতে থাকবে ... সুতরাং উইন্ডো থাকতে পারে সর্বোপরি একটি
নোড.জেএস

1
@ এরিক আমার অত্যন্ত সন্দেহ আছে এটি বিশ্বব্যাপী সুযোগে থাকবে, সুতরাং আপনি যদি windowআপনার মডিউলের প্রথম লাইনের মতো কিছু আমদানি না করেন তবে আপনার কোনও সমস্যা হবে না। আপনি একটি বেনামি ফাংশনও চালাতে পারেন এবং [[Class]]এর thisঅভ্যন্তরীণটি পরীক্ষা করতে পারেন (কেবলমাত্র অ-কঠোর মোডে কাজ করে) "ক্লাস" এর অধীনে দেখুন: বোনসেইডেন.github.com/ জাভা স্ক্রিপ্ট- গার্ডেন
আইভো ওয়েটজেল

1
আমার ইস্যুটি ওপির থেকে কিছুটা পৃথক: আমি স্ক্রিপ্টের প্রয়োজন হচ্ছি না, এটি জেএসডিএএম দ্বারা বিশ্বব্যাপী প্রসঙ্গ হিসাবে এমুলেটেড উইন্ডো দিয়ে লোড করা হয়েছে ... এটি এখনও সাধারণ মডিউলগুলির চেয়ে আলাদা প্রসঙ্গে, নোড.জেএস + ভি 8 দ্বারা চালিত হয়।
এরিক ব্রচেমিয়ার

1
সম্ভবত ... আমি অন্য দিকে গেলাম: 1) অনন্ত লুপ তৈরি এড়াতে ওনশ্যাশচে ("উইন্ডোতে" onhash بدل ") জন্য সমর্থন সনাক্ত করুন 2) মূল নোড.জেএস স্ক্রিপ্টে এমুলেটেড উইন্ডোতে অনহ্যাশচেঞ্জ সম্পত্তি সেট করে সমর্থন সিমুলেট করুন।
এরিক ব্রচেমিয়ার

1
typeof self === 'object'typeof window === 'undefined'ওয়েব কর্মীদের সুযোগ ব্যর্থ হওয়ায় নিরাপদ হতে পারে ।
লুইস

45

আমি বর্তমানে নোডের একটি ভুল সনাক্তকরণের জন্য হোঁচট খেয়েছি যা একটি বিভ্রান্তিকর বৈশিষ্ট্য-সনাক্তকরণের কারণে বৈদ্যুতিনের নোড-পরিবেশ সম্পর্কে অবগত নয় । নিম্নলিখিত সমাধানগুলি প্রক্রিয়া-পরিবেশকে স্পষ্টভাবে সনাক্ত করে।


কেবল নোড.জেএস সনাক্ত করুন

(typeof process !== 'undefined') && (process.release.name === 'node')

আপনি যে কোনও নোড-প্রক্রিয়াতে চলছেন তা এটি আবিষ্কার করবে process.release "বর্তমান [নোড-] মুক্তির সাথে সম্পর্কিত মেটাডেটা" রয়েছে।

এর ডিম পর io.js মান process.release.nameএছাড়াও হতে পারে io.js(দেখুন প্রক্রিয়া-ডক )। নোড-প্রস্তুত পরিবেশটি যথাযথভাবে সনাক্ত করার জন্য আমি অনুমান করি যে আপনার নিম্নলিখিত হিসাবে পরীক্ষা করা উচিত:

নোড (> = 3.0.0) বা io.js সনাক্ত করুন

(typeof process !== 'undefined') &&
(process.release.name.search(/node|io.js/) !== -1)

এই বিবৃতিটি নোড 5.5.0, ইলেক্ট্রন 0.36.9 (নোড 5.1.1 সহ) এবং ক্রোম 48.0.2564.116 দিয়ে পরীক্ষা করা হয়েছিল।

নোড (> = 0.10.0) বা io.js শনাক্ত করুন

(typeof process !== 'undefined') &&
(typeof process.versions.node !== 'undefined')

@ ডালুয়েজের মন্তব্য আমাকে আরও সাধারণ প্রমাণ সম্পর্কে চিন্তা করতে অনুপ্রাণিত করেছিল। এটি নোড.জেএস> = 0.10 থেকে কাজ করা উচিত । পূর্ববর্তী সংস্করণগুলির জন্য আমি কোনও অনন্য সনাক্তকারীকে পাইনি।


পিএস: আমি এখানে উত্তরটি পোস্ট করছি যেহেতু প্রশ্ন আমাকে এখানে নিয়ে গেছে, যদিও ওপি একটি অন্য প্রশ্নের উত্তর খুঁজছিল।


2
এটি এখন পর্যন্ত সবচেয়ে নির্ভরযোগ্য পদ্ধতির বলে মনে হচ্ছে, আপনাকে ধন্যবাদ। যদিও শুধুমাত্র সংস্করণ> = 3.0.0 এর জন্য কাজ করা হচ্ছে।
ফিলিপ

@ ডালয়েজ - অনুপ্রেরণার জন্য ধন্যবাদ দুর্ভাগ্যক্রমে আমি 0.10 এর চেয়ে কমের প্রমাণ পাইনি।
ফ্লোরিয়ান ব্রেকিশ

3
আমি webpack প্রতিক্রিয়া ব্যবহার করে পাওয়া, processএবং process.versionতাই আমি একটি অতিরিক্ত চেক যোগ বান্ডেলের মধ্যে বিদ্যমান, process.versionযেখানে process.release.nodeক্লায়েন্ট সাইড উপর undefined হয় কিন্তু একটি সার্ভার পাশ মান হিসাবে একটি নোড সংস্করণ রয়েছে
হারুন

@ অ্যারন: এই ইঙ্গিতটির জন্য ধন্যবাদ। আমি process.versionভেরিয়েবলের কোনও সংজ্ঞা (প্রতিক্রিয়া, ওয়েবপ্যাক বা প্রতিক্রিয়া-ওয়েবপ্যাক) খুঁজে পাইনি was আমি উত্তরটিতে যুক্ত করার জন্য সংস্করণ-পরিবর্তনশীল সংজ্ঞায়িত এমন কোনও ইঙ্গিতকে প্রশংসা করব।
রিলিজ.নোডের

2
এক-লাইনের ও নিরাপদ:function isNodejs() { return typeof "process" !== "undefined" && process && process.versions && process.versions.node; }
brillout

25

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

তবে, আপনি কোন পরিবেশে রয়েছেন তা নিশ্চিত করার জন্য আমরা কয়েকটি কৌশল ব্যবহার করতে পারি।

আন্ডারস্কোর লাইব্রেরিতে ব্যবহৃত সাধারণভাবে গৃহীত সমাধানটি শুরু করা যাক:

typeof module !== 'undefined' && module.exports

এই কৌশলটি সার্ভারের পক্ষে আসলে পুরোপুরি সূক্ষ্ম, কারণ যখন requireফাংশনটি বলা হয় তখন এটি thisবস্তুটি একটি খালি বস্তুর সাথে পুনরায় সেট করে এবং moduleআপনার জন্য আবার নতুন সংজ্ঞা দেয়, এর অর্থ আপনাকে কোনও বাহ্যিক টেম্পারিংয়ের বিষয়ে চিন্তা করতে হবে না। যতক্ষণ না আপনার কোডটি লোড হয়require আপনি নিরাপদ হন।

যাইহোক, এটি ব্রাউজারে পৃথক হয়ে যায়, যেহেতু যে কেউ সহজেই moduleএটির জন্য এটি নির্ধারণ করতে পারে যে এটি আপনি যে অবজেক্টটির সন্ধান করছেন এটি মনে হয়। একদিকে এটি আপনার পছন্দসই আচরণ হতে পারে তবে এটি গ্রন্থাগার ব্যবহারকারীরা বৈশ্বিক পরিমণ্ডলে কী পরিবর্তনশীল ব্যবহার করতে পারে তা নির্দেশ করে। হয়তো কেউ নামের সাথে একটি ভেরিয়েবল ব্যবহার করতে চায়module যে exportsঅন্য ব্যবহারের জন্য এটি ভেতরে। এটি অসম্ভব, তবে অন্য পরিবেশটি এই পরিবর্তনশীল নামটি ব্যবহার করার কারণে আমরা অন্য কে কী পরিবর্তনশীল ব্যবহার করতে পারি তা বিচার করার জন্য কে?

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

this.module !== module

moduleএটির সাহায্যে , যদি কেউ ব্রাউজারে বিশ্বব্যাপী স্কোপে ঘোষণা করে তবে এটি thisবস্তুতে স্থাপন করা হবে, যা পরীক্ষায় ব্যর্থ হতে পারে, কারণ this.module, মডিউল হিসাবে একই বস্তু হবে। নোডে, this.moduleবিদ্যমান নেই এবং moduleবাইরের বন্ধের মধ্যে উপস্থিত রয়েছে, সুতরাং পরীক্ষাগুলি সফল হবে কারণ তারা সমতুল্য নয়।

সুতরাং, চূড়ান্ত পরীক্ষাটি হ'ল:

typeof module !== 'undefined' && this.module !== module

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


2
বাহ, আপনার ওয়ানলাইনারের প্রতিটি অংশের পিছনে যুক্তি পরিষ্কারভাবে ব্যাখ্যা করার জন্য ধন্যবাদ thanks
জন কম্বস

পেয়েছি Cannot read property 'module' of undefinedকারণ এটি মোচা পরীক্ষায় উদাহরণস্বরূপ
শ্রদ্ধমা

20

ইচ্ছাকৃতভাবে, স্পষ্টভাবে নাশকতা না দেওয়া থাকলে নিম্নলিখিতটি ব্রাউজারে কাজ করে:

if(typeof process === 'object' && process + '' === '[object process]'){
    // is node
}
else{
    // not node
}

বাম।


4
var প্রক্রিয়া = {toString: ফাংশন () {ফেরত '[অবজেক্ট প্রক্রিয়া]'; }};
নিক দেশালিউনার্স

1
আপনি process+''পরিবর্তে ব্যবহার করার কিছু কারণ আছে process.toString()?
ক্ষতিকারক

3
প্রায়। পরিবর্তে এটি ব্যবহার করুন:Object.prototype.toString.call(process)
সসপেডরা

2
এটি এই প্রশ্নের সেরা উত্তর।
loretoparisi

3
@ হারমিক: var process = null;দ্বিতীয় কেসটি ব্যর্থ করে দেবে। জাভাস্ক্রিপ্ট এবং জাভা উভয় ক্ষেত্রেই ভাবটি '' + xএকই রকম উৎপন্ন করে , x.toString()যখন xবাদামী তখন, প্রাক্তন উত্পাদন করে "null"বা "undefined"যেখানে পরবর্তীটি কোনও ত্রুটি ছুঁড়ে দেয় except
জোয়েটউইডল

17

এটি করার একটি দুর্দান্ত উপায়:

const isBrowser = this.window === this;

এটি কাজ করে কারণ ব্রাউজারগুলিতে বিশ্বব্যাপী 'এই' ভেরিয়েবলটির 'উইন্ডো' নামে একটি স্বতঃপ্রকাশ আছে। নোডে এই স্ব-রেফারেন্সটি বিদ্যমান নেই।

  • ব্রাউজারে 'এটি' হ'ল গ্লোবাল অবজেক্টের একটি উল্লেখ, 'উইন্ডো' বলে।
  • নোডে 'এটি' হ'ল মডিউল.এক্সপোর্টস অবজেক্টের একটি রেফারেন্স।
    • 'এটি' নয় কোনও নোড গ্লোবাল অবজেক্টের রেফারেন্স , একে 'গ্লোবাল' বলে called
    • 'এটি' মডিউল ভেরিয়েবল ঘোষণার জায়গার কোনও রেফারেন্স নয়

উপরের প্রস্তাবিত ব্রাউজারের চেকটি ভাঙতে আপনাকে নীচের মতো কিছু করতে হবে

this.window = this;

চেক কার্যকর করার আগে।


কেন সহজভাবে নয় const isBrowser = this.window !== undefined? এবং নোডে তত্ত্বের মধ্যে আমি this.window = thisসমাধানটিকে বোকা বানানোর জন্য করতে পারি ।
টাইলার দীর্ঘ

11

অন্য একটি পরিবেশ সনাক্তকরণ :

(অর্থ: এখানে বেশিরভাগ উত্তর ঠিক আছে)

function isNode() {
    return typeof global === 'object'
        && String(global) === '[object global]'
        && typeof process === 'object'
        && String(process) === '[object process]'
        && global === global.GLOBAL // circular ref
        // process.release.name cannot be altered, unlike process.title
        && /node|io\.js/.test(process.release.name)
        && typeof setImmediate === 'function'
        && setImmediate.length === 4
        && typeof __dirname === 'string'
        && Should I go on ?..
}

একটু ভৌতিক? আপনি আরও গ্লোবাল পরীক্ষা করে আরও ভার্জোজ তৈরি করতে পারেন ।

কিন্তু না!

উপরের এই সমস্তগুলি যেভাবেই নকল / সিমুলেটেড করা যায়।

উদাহরণস্বরূপ globalবস্তুটি নকল করা :

global = {
    toString: function () {
        return '[object global]';
    },
    GLOBAL: global,
    setImmediate: function (a, b, c, d) {}
 };
 setImmediate = function (a, b, c, d) {};
 ...

এটি নোডের আসল গ্লোবাল অবজেক্টের সাথে সংযুক্ত হবে না তবে এটি এর সাথে সংযুক্ত হবে window কোনও ব্রাউজারে বস্তুর । সুতরাং এটি বোঝাবে যে আপনি কোনও ব্রাউজারের ভিতরে নোড এনভিতে রয়েছেন।

জীবন সংক্ষিপ্ত!

আমাদের পরিবেশ নকল হলে আমাদের কি যত্ন নেই? এটি ঘটবে যখন কোনও বোকা বিকাশকারী নামক একটি বিশ্বব্যাপী পরিবর্তনশীল ঘোষণা করেglobal বিশ্বব্যাপী স্কোপ করে। বা কিছু শয়তান দেব কোনওভাবে আমাদের এনভায় কোড ইনজেক্ট করে।

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

তাতে কি?

যদি 2 পরিবেশকে লক্ষ্য করে করা হয়: ব্রাউজার এবং নোড;
"use strict"; এবং হয় কেবল windowবা জন্য অনুসন্ধান করুন global; এবং স্পষ্টভাবে ইঙ্গিত করে যে দস্তাবেজে আপনার কোডটি কেবল এই পরিবেশকে সমর্থন করে। এটাই!

var isBrowser = typeof window !== 'undefined'
    && ({}).toString.call(window) === '[object Window]';

var isNode = typeof global !== "undefined" 
    && ({}).toString.call(global) === '[object global]';

আপনার ব্যবহারের ক্ষেত্রে যদি সম্ভব হয়; পরিবর্তে পরিবেশ সনাক্তকরণ; চেষ্টা / ক্যাচ ব্লকের মধ্যে সিঙ্ক্রোনাস বৈশিষ্ট্য সনাক্তকরণ করুন। (এগুলি কার্যকর করতে কয়েক মিলিসেকেন্ড লাগবে)।

যেমন

function isPromiseSupported() {
    var supported = false;
    try {
        var p = new Promise(function (res, rej) {});
        supported = true;
    } catch (e) {}
    return supported;
}

9

প্রস্তাবিত বেশিরভাগ সমাধানগুলি আসলে নকল হতে পারে। একটি শক্তিশালী উপায় হ'ল Classএটি ব্যবহার করে গ্লোবাল অবজেক্টের অভ্যন্তরীণ সম্পত্তি পরীক্ষা করা Object.prototype.toString। অভ্যন্তরীণ শ্রেণীটি জাভাস্ক্রিপ্টে নকল করা যাবে না:

var isNode = 
    typeof global !== "undefined" && 
    {}.toString.call(global) == '[object global]';

2
এটি ব্রাউজারে সত্যে ফিরে আসবে।
Alt

1
তুমি কি পরীক্ষা করেছ? আমি দেখতে পাচ্ছি না যে কীভাবে কোনও ব্রাউজারফ্রাই কোনও বস্তুর অভ্যন্তরীণ শ্রেণী পরিবর্তন করতে পারে। এটির জন্য জাভাস্ক্রিপ্ট ভিএম বা ওভাররাইটিংয়ে কোড পরিবর্তন করা দরকার Object.prototype.toStringযা সত্যই খারাপ অভ্যাস।
ফ্যাবিয়ান জ্যাকবস

আমি এটি পরীক্ষা করেছি। var global=typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {};
ব্রাউজারিফাই

আপনি দেখুন, ক্রোমে ({}.toString.call(window))সমান "[object global]"
ভানুয়ান 30'14

2
এটি আশ্চর্যজনক, কারণ window.toString()উত্পাদিত হয়"[object Window]"
ভানুয়ান

5

কি প্রক্রিয়া বস্তুর ব্যবহার করে এবং চেক করার বিষয়েও execPath জন্য node?

process.execPath

প্রক্রিয়াটি শুরু হওয়া নির্বাহযোগ্যের এটিই পরম পথের নাম।

উদাহরণ:

, / Usr / local / bin / নোড


2
কি হবে window.process = {execPath: "/usr/local/bin/node"};?
Константин Ван

4

কোনও স্ক্রিপ্ট কীভাবে বলতে পারে যে এটি একটি কমনজ মডিউল হিসাবে প্রয়োজন হয়েছে কিনা?

সম্পর্কিত: সরাসরি নোডে রান মডিউল বনাম হিসাবে এটি প্রয়োজন হয়েছে কিনা তা পরীক্ষা করতে, আপনি পরীক্ষা করতে পারেন require.main !== modulehttp://nodejs.org/docs/latest/api/modules.html#accessing_the_main_module


4

উপরের বিষয়গুলি সম্পর্কে আমার বৈচিত্র এখানে:

(function(publish) {
    "use strict";

    function House(no) {
        this.no = no;
    };

    House.prototype.toString = function() {
        return "House #"+this.no;
    };

    publish(House);

})((typeof module == 'undefined' || (typeof window != 'undefined' && this == window))
    ? function(a) {this["House"] = a;}
    : function(a) {module.exports = a;});

এটি ব্যবহার করতে, আপনি দ্বিতীয় শেষ লাইনে "হাউস" পরিবর্তন করে মডিউলের নামটি ব্রাউজারে থাকা এবং মডিউলের মানটি যা চান তা প্রকাশ করতে চান (সাধারণত কোনও নির্মাণকারী বা কোনও বস্তু আক্ষরিক) )।

ব্রাউজারগুলিতে গ্লোবাল অবজেক্টটি উইন্ডো, এবং এটির নিজের একটি উল্লেখ রয়েছে (উইন্ডোটি রয়েছে ind উইন্ডো যা == উইন্ডো)। আমার কাছে মনে হয় আপনি ব্রাউজারে বা এমন একটি পরিবেশে না ঘটে যা সম্ভবত আপনি বিশ্বাস করতে চান যে আপনি একটি ব্রাউজারে রয়েছেন এটির সম্ভাবনা নেই। অন্যান্য সমস্ত ক্ষেত্রে, যদি কোনও গ্লোবাল 'মডিউল' ভেরিয়েবল ঘোষিত হয়, এটি অন্যথায় এটি বিশ্বব্যাপী অবজেক্টটি ব্যবহার করে uses


4

আমি processনোড.জেএস এর মতো পরীক্ষা করার জন্য ব্যবহার করছি

if (typeof(process) !== 'undefined' && process.version === 'v0.9.9') {
  console.log('You are running Node.js');
} else {
  // check for browser
}

অথবা

if (typeof(process) !== 'undefined' && process.title === 'node') {
  console.log('You are running Node.js');
} else {
  // check for browser
}

এখানে ডকুমেন্টেড


2
process.titleপরিবর্তন করা যেতে পারে
বেন বারকে

তারপরে আপনি শিরোনামটি এতে পরিবর্তন করেছেন। অথবা প্রক্রিয়া ব্যবহার করুন vers রূপান্তর
ক্রিস

আপনি যদি কোনও লাইব্রেরির জন্য লেখেন (যেমনটি আপনার করা উচিত), আপনি শিরোনামটি কী তা আশা করতে পারবেন না
বেন বারকায়

3

এই লেখার হিসাবে, এই উত্তরটি "শীঘ্রই আসবে" বিকল্পের আরও বেশি, কারণ এটি জাভাস্ক্রিপ্টের খুব নতুন বৈশিষ্ট্যগুলিকে উপস্থাপন করে।

const runtime = globalThis.process?.release?.name || 'not node'
console.log(runtime)

runtimeমান হতে হবে পারেন nodeবা not node

উল্লিখিত হিসাবে, এটি কয়েকটি নতুন জাভাস্ক্রিপ্ট বৈশিষ্ট্যগুলির উপর নির্ভর করে। globalThisইসমাস্ক্রিপ্ট 2020 স্পেসে একটি চূড়ান্ত বৈশিষ্ট্য। ভি 8 ইঞ্জিনে ptionচ্ছিক শৃঙ্খলা / নালিশ কোয়েলসিং ( ?অংশ globalThis.process?.release?.name) সমর্থিত, যা ক্রোম 80 দিয়ে জাহাজে আসে 4 ভি 8 7.9.xxx। আমি বিশ্বাস করি নোড 14 (4/21/2020-এ মুক্তির জন্য) V8 8.x + ব্যবহার করার কথা।

এই পদ্ধতির বর্তমান বিধিনিষেধের একটি স্বাস্থ্যকর ডোজ সঙ্গে আসে। যাহোক; যে গতিতে ব্রাউজার / নোড প্রকাশিত হয়, এটি শেষ পর্যন্ত একটি নির্ভরযোগ্য ওয়ান-লাইনার হয়ে থাকবে।


1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত! এবং প্রত্যেকের নোড 14
বিটিডব্লিউ

2

নোড.জেএস এর processঅবজেক্ট রয়েছে, সুতরাং যতক্ষণ না আপনার কাছে তৈরি হওয়া অন্য কোনও স্ক্রিপ্ট না থাকে processআপনি নোডে কোড চালাচ্ছেন কিনা তা নির্ধারণের জন্য এটি ব্যবহার করতে পারবেন।

var isOnNodeJs = false;
if(typeof process != "undefined") {
  isOnNodeJs = true;
}

if(isOnNodeJs){
  console.log("you are running under node.js");
}
else {
  console.log("you are NOT running under node.js");
}

2

এটি সার্ভার-সাইড এবং ক্লায়েন্ট-সাইড জাভাস্ক্রিপ্টের মধ্যে সামঞ্জস্যতা নিশ্চিত করার একটি দুর্দান্ত নিরাপদ এবং সোজা-সামনের উপায়, এটি ব্রাউজারিফাইয়ের সাথেও কাজ করবে, প্রয়োজনীয় জেএস বা কমনজেএস অন্তর্ভুক্ত ক্লায়েন্ট-সাইড:

(function(){

  // `this` now refers to `global` if we're in NodeJS
  // or `window` if we're in the browser.

}).call(function(){
  return (typeof module !== "undefined" &&
    module.exports &&
    typeof window === 'undefined') ?
    global : window;
}())

1

সম্পাদনা : আপনার আপডেট হওয়া প্রশ্ন সম্পর্কিত: "একটি স্ক্রিপ্ট কীভাবে বলতে পারে যে এটি একটি জেনারেল মডিউল হিসাবে প্রয়োজন হয়েছে কিনা?" আমি এটা করতে পারি না। আপনি exportsকোনও বস্তু ( if (typeof exports === "object")) কিনা তা যাচাই করতে পারেন , যেহেতু অনুমানের জন্য এটি মডিউলগুলিতে সরবরাহ করা প্রয়োজন, তবে যা আপনাকে জানায় তা হ'ল ... exportsএকটি বস্তু। :-)


আসল উত্তর:

আমি নিশ্চিত যে কিছু নোডজেএস-নির্দিষ্ট চিহ্ন রয়েছে ( EventEmitterসম্ভবত না, আপনাকে requireইভেন্টগুলি মডিউল পেতে ব্যবহার করতে হবে; নীচে দেখুন ) যা আপনি যাচাই করতে পারেন, তবে ডেভিড যেমন বলেছিলেন, আদর্শভাবে আপনি বৈশিষ্ট্যটি সনাক্তকরণের চেয়ে আরও ভাল (বরং পরিবর্তে) পরিবেশের তুলনায়) যদি এটি করার কোনও ধারণা থাকে।

আপডেট : সম্ভবত এর মতো কিছু:

if (typeof require === "function"
    && typeof Buffer === "function"
    && typeof Buffer.byteLength === "function"
    && typeof Buffer.prototype !== "undefined"
    && typeof Buffer.prototype.write === "function") {

তবে এটি আপনাকে কেবল বলে দেয় যে আপনি এমন একটি পরিবেশের সাথে requireএবং খুব কিছু খুব খুব নোডজেএস-এর মতো Buffer। :-)


আমি এখনও ওয়েবসাইটে এমন সমস্ত জিনিস সেট আপ করে তা ভেঙে ফেলতে পারি ... যা কেবলমাত্র ওভারকিল;) নোড পরিবেশ পরিষ্কার হওয়ার কারণে ব্রাউজারে থাকার জন্য চেক করা সহজ।
আইভো ওয়েটজেল

1
@ আইভো: হ্যাঁ, আমার শেষ বাক্যটি দেখুন। windowএকটি নোডজেএস অ্যাপ্লিকেশনের মধ্যে একটি ভেরিয়েবল সংজ্ঞায়নের মাধ্যমে আমি ঠিক তত সহজেই আপনার চেকটি ভেঙে ফেলতে পারি । :-)
টিজে ক্রাউডার

1
@Ivo: আমি না এ হবে সব বিস্মিত যদি কেউ সংজ্ঞায়িত windowএকটি NodeJS মডিউলে, তাই তারা যে কোডটি ওপরেই নির্ভরশীল অন্তর্ভুক্ত হতে পারে windowবিশ্বব্যাপী বস্তু হচ্ছে এবং যে কোড পরিবর্তন করতে চান করেনি। আমি এটা করব না, আপনি করবেন না, তবে আমি বাজি রাখি কারও কাছে আছে। :-) অথবা তারা windowপুরোপুরি অন্য কিছু বোঝাতে ব্যবহৃত হয়েছে।
টিজে ক্রাউডার

1
@ আইভো: yuiblog.com/blog/2010/04/09/… উইন্ডো অবজেক্টটি
নোড.জেজে

1
@ typeof process !== "undefined" && process.title === "node"
টিজে

0
const isNode =
  typeof process !== 'undefined' &&
  process.versions != null &&
  process.versions.node != null;


-1

নোড.জেএস এর উত্স নিন এবং একটি পরিবর্তনশীল লাইক সংজ্ঞায়িত করতে এটি পরিবর্তন করুন runningOnNodeJS। আপনার কোডে সেই পরিবর্তনশীল পরীক্ষা করুন।

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


1
এটি আবার তার (মূলত অবিশ্বাস্য) সমস্যার সমাধান করে না, আমি আবার ব্রাউজারে এ জাতীয় একটি পরিবর্তনশীল তৈরি করতে পারি। স্ক্রিপ্টগুলি windowবিশ্বব্যাপী তৈরি করা থেকে রোধ করা ভাল উপায় , অনুমান করুন যে আমি এটিতে একটি বৈশিষ্ট্য অনুরোধ ফাইল করব।
আইভো ওয়েটজেল

@ আইভো: এটি একটি খারাপ ধারণা যা YUI এবং jQuery এর মতো পরিচিত লাইব্রেরি ব্যবহার করে সার্ভার সাইড ডোম ম্যানিপুলেশন করতে jsdom ( github.com/tmpvar/jsdom ) ব্যবহার করে এমন কোডটি ভাঙ্গবে । এবং বর্তমানে উত্পাদনে কোড রয়েছে যা এটি করে।
slebetman

@ স্লেবেটম্যান না এটি জাসডম ভাঙবে না। আমি কথা বলছি বৈশ্বিক মত, কোন Var বিবৃতি বিশ্বব্যাপী , উদাহরণস্বরূপ কোড সেখানে ব্যবহার varবিবৃতি মানুষ শুধু বিশ্বব্যাপী নামস্থান সেটিকে লিক যারা ভাল তারা স্বয়ংসম্পূর্ণ মডিউল ধারণা তারপর পেতে পারি
ইভো Wetzel

@ আইভো এ ধরণের হিংসাত্মক, এটি বলার মতো যে আমাদের পিঠা খাওয়ার দক্ষতা নেওয়া উচিত কারণ লোকেরা তাদের অত্যধিক পরিশ্রম করে fat আন্তঃ-মডিউল কাজ করবে এমন একটি লাইব্রেরি অর্জন করতে আপনাকে অবশ্যই বিশ্বব্যাপী নেমস্পেসকে বিশৃঙ্খলা করতে হবে। বা আপনি এটি একটি একক মডিউল মধ্যে সমস্ত আপ মোড়ানো করতে পারেন, কিন্তু তারপরে কী?
বেন বারকে

-1

খুব পুরানো পোস্ট, তবে আমি চেষ্টা - ধরাতে প্রয়োজনীয় বিবৃতিগুলি মোড়ানো দ্বারা এটি সমাধান করেছি

try {
     var fs = require('fs')
} catch(e) {
     alert('you are not in node !!!')
}

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