নোডজেএস মডিউলগুলিতে আপনি কীভাবে ধ্রুবকগুলি ভাগ করবেন?


239

বর্তমানে আমি এটি করছি:

foo.js

const FOO = 5;

module.exports = {
    FOO: FOO
};

এবং এটি ব্যবহার করে bar.js:

var foo = require('foo');
foo.FOO; // 5

এই কাজ করতে একটি ভাল উপায় আছে কি? রফতানি অবজেক্টে ধ্রুবক ঘোষণা করা অস্বস্তিকর বোধ করে।


6
আপনি যদি এটি রফতানি করতে চান তবে আপনি এটিতে রেখে দিন exports। এ সম্পর্কে কী বিশ্রী?
অ্যালেক্স ওয়েন

5
আমি সি # এবং পিএইচপি ব্যবহার করি। আমি অনুমান করি যে আমাকে কেবল প্রতিটি ধ্রুবক দু'বার সংজ্ঞায়িত করতে হবে। ভবিষ্যতে হয়তো আমাদের হবে export const FOO = 5;
টাওয়ার

1
@ টাওয়ার ভবিষ্যত এখন (ES2015)! 2ality.com/2014/09/…
স্পেন ট্রেন

1
এটি আরও সংক্ষিপ্ত থেকে কার্যকরীভাবে পৃথক module.exports={FOO:5};?
জো ল্যাপ

3
এটি কেবল আকাশচুম্বী অনুভব করে না, এটি আর কোনও ধ্রুবক নয়
Ini

উত্তর:


96

আপনি এটির সাথে বিশ্বব্যাপী স্পষ্টত রফতানি করতে পারেন global.FOO = 5। তারপরে আপনার কেবল ফাইলের প্রয়োজন হবে, এমনকি আপনার রিটার্নের মানও সংরক্ষণ করবেন না।

তবে সত্যই, আপনার এটি করা উচিত নয়। জিনিসগুলিকে সঠিকভাবে আবদ্ধ রাখা একটি ভাল জিনিস। আপনার ইতিমধ্যে সঠিক ধারণা আছে, তাই আপনি যা করছেন তা চালিয়ে যান।


51
আমি এটি করার জন্য দুঃখিত, তবে -1 আরও ভাল জানার জন্য কিন্তু বিকল্প (আরও ভাল) সমাধান সরবরাহ না করার জন্য; (পুনরায়: "।। কিন্তু সত্যিই, আপনি যে কি করা উচিত নয় একটি ভাল জিনিস জিনিষ সঠিকভাবে encapsulated রাখা")
আপনাকে ধন্যবাদ

22
পুরো সফ্টওয়্যার বিকাশ সম্প্রদায় যদি এইভাবে চিন্তা করে, আমরা এখনও পঞ্চার্ড ব্যবহার করতাম। সৌভাগ্যক্রমে সেখানে কয়েকটি বিভ্রান্তি রয়েছে যারা জানে যে আমরা নিজের উপর চাপানো উন্মাদ বিধিগুলি ভেঙে ফেলা কখন ভাল। যদি এনক্যাপসুলেশন কার্যকর হয় তবে এটি ব্যবহার করুন। যদি এটি কোনও নার্ভাস আয়া আপনার কাজটি বন্ধ করে দেয় তবে স্নায়বিক আয়েটিকে কাজ থেকে দূরে সরিয়ে দিন।
unsynchronized

22
@ ননমিক (সুপার লেট রিপ্লাই টাইম) আমি আরও ভাল সমাধান না দেওয়ার আসল কারণটি ওপি ইতিমধ্যে সমাধানটি জানে। জিনিসগুলিকে তাদের নিজস্ব মডিউলে সজ্জিত করে এবং যেখানে প্রয়োজন সেখানে তাদের প্রয়োজন।
অ্যালেক্স ওয়েন

1
তাহলে এটি প্রকৃত উত্তর নয় এবং পরিবর্তে "আপনি যথেষ্ট ভাল করছেন, বিকল্পগুলি খারাপ" বলে মন্তব্য করা উচিত ..
আন্দ্রে পোপভ

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

314

আমার মতে, Object.freezeব্যবহারটি ডিআরওয়ির এবং আরও ঘোষিত স্টাইলের অনুমতি দেয়। আমার পছন্দসই প্যাটার্নটি হ'ল:

./lib/constants.js

module.exports = Object.freeze({
    MY_CONSTANT: 'some value',
    ANOTHER_CONSTANT: 'another value'
});

./lib/some-module.js

var constants = require('./constants');

console.log(constants.MY_CONSTANT); // 'some value'

constants.MY_CONSTANT = 'some other value';

console.log(constants.MY_CONSTANT); // 'some value'

পুরানো পারফরম্যান্স সতর্কতা

নিম্নলিখিত ইস্যুটি জানুয়ারী 2014 এ v8 এ স্থির করা হয়েছিল এবং এখন বেশিরভাগ বিকাশকারীদের সাথে প্রাসঙ্গিক নয়:

সচেতন থাকুন যে মিথ্যাতে লেখার যোগ্য সেটিংস স্থাপন করা এবং অবজেক্ট.ফ্রিজে ব্যবহার করা উভয়েরই v8 - https://bugs.chromium.org/p/v8/issues/detail?id=1858 এবং http://jsperf.com এ বিশাল পারফরম্যান্স জরিমানা রয়েছে / কর্মসম্পাদনভিত্তিক হিমায়িত-বস্তুর


4
অবজেক্ট.ফ্রিজে জন্য ভাল ব্যবহারের কেস!
এস্তাস ফ্লাস্ক

যদি আমার ধ্রুবক এবং ফাংশন উভয়ই রফতানি করতে হয় তবে এটির মতো দেখতে কেমন হবে? আমার কি ফ্রিজে ব্লকে ফাংশন করা উচিত?
টম

3
এই পদ্ধতিটি আরও ভাল কারণ আইডিই স্বতঃসিদ্ধ এটির সাথে কাজ করে।
ডেভিড এ

3
এটি দুর্দান্ত উত্তর, তবে শেষ পর্যন্ত ভি 8 এর কার্যকারিতা সম্পর্কে সেকেলে সতর্কতার কারণে এটি এই দৃষ্টিভঙ্গি থেকে লোককে দূরে সরিয়ে ফেলতে পারে। সতর্কতা অপসারণ বিবেচনা করুন।
সাম্পাথিস্রিস

4
ধন্যবাদ @ ক্রুমিয়া! আমি এটি আপডেট করেছি, তবে কেবলমাত্র historicalতিহাসিক প্রেক্ষাপটের জন্য মূল সতর্কতা পাঠ্যটি রেখেছি (এবং কারণ এই মন্তব্যগুলির কিছু এটি না করে বোঝায় না)।
স্পেন ট্রেন

163

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

এছাড়াও আপনি ভাগ করে নিতে পারেন যে চেক আউট একটি বাস্তব ধ্রুব পেতে Object.create, Object.definePropertyএবং Object.defineProperties। যদি আপনি সেট করেন writable: false, তবে আপনার "ধ্রুবক" এর মানটি পরিবর্তন করা যাবে না। :)

এটি সামান্য ভার্বোস, (তবে এটি সামান্য জেএস দিয়েও পরিবর্তিত হতে পারে) তবে আপনার ধ্রুবকের মডিউলটির জন্য আপনাকে একবার এটি করা দরকার। এই পদ্ধতিগুলি ব্যবহার করে, কোনও বৈশিষ্ট্য যা আপনি ডিফল্টগুলি ছেড়ে যান false। (অ্যাসাইনমেন্টের মাধ্যমে বৈশিষ্ট্যগুলি সংজ্ঞায়িত করার বিপরীতে, যা সমস্ত বৈশিষ্ট্যকে ডিফল্ট করে true)

সুতরাং, অনুমানিকভাবে, আপনি কেবল সেট করতে পেরেছিলেন valueএবং enumerableবাইরে রেখে writableএবং configurableযেহেতু তারা ডিফল্ট হবেন false, আমি কেবল তাদের স্পষ্টতার জন্য অন্তর্ভুক্ত করেছি।

আপডেট - আমি খুব ব্যবহারের ক্ষেত্রে এটির জন্য সহায়ক ফাংশন সহ একটি নতুন মডিউল ( নোড-কনস্ট্যান্টস ) তৈরি করেছি ।

constants.js - ভাল

Object.defineProperty(exports, "PI", {
    value:        3.14,
    enumerable:   true,
    writable:     false,
    configurable: false
});

constants.js - আরও ভাল

function define(name, value) {
    Object.defineProperty(exports, name, {
        value:      value,
        enumerable: true
    });
}

define("PI", 3.14);

script.js

var constants = require("./constants");

console.log(constants.PI); // 3.14
constants.PI = 5;
console.log(constants.PI); // still 3.14

2
অ্যান্টাইনহেজকক এটি প্রয়োজনীয় নয়, ডকুমেন্টেশনটি পরীক্ষা করে দেখুন Object.defineProperty()। নির্দিষ্ট করা সমস্ত বৈশিষ্ট্য falseএই প্রসঙ্গে অনুমান করা হয়।
ডমিনিক বার্নেস

6
এছাড়াও লক্ষণীয়, অবজেক্ট.ফ্রিজে ()
দামিয়ানব

1
এটি এই প্রশ্নের সেরা উত্তর। +1 টি। যদি আমি পারতাম তবে আরও বেশি করে উজ্জীবিত করতাম।
রায়ান

1
আশ্চর্যজনক উত্তর, একটি খুব মার্জিত এবং নিরাপদ সমাধান।
অ্যালেক্স

1
@SpainTrain এই প্রদর্শিত হয় দ্বারা নির্ধারিত হয়েছে বলে codereview.chromium.org/135903014
Grinde

100

ES6 উপায়।

foo.js এ রফতানি করুন

const FOO = 'bar';
module.exports = {
  FOO
}

bar.js এ আমদানি করুন

const {FOO} = require('foo');

40
হ্যাঁ. পুরাতন উত্তরগুলি হ্রাস করার জন্য স্ট্যাক ওভারফ্লোটির একটি উপায় প্রয়োজন।
রিক জলি

7
দ্রষ্টব্য যে এটি এটির constমধ্যে bar.jsনয়, ধ্বংসাত্মক ভেরিয়েবলের অপরিবর্তনীয়তা প্রয়োগ constকরে foo.js। অর্থাৎ একটি ব্যবহার করতে পারেন let {FOO} =মধ্যে bar.jsএবং "ধ্রুবক" পরিবর্তনশীল পরিবর্তন ঘটান। আফাইক, রফতানির অপরিবর্তনীয়তা প্রয়োগ করতে, এখনও একজনের ইএস মডিউল বা প্রয়োজন হয় Object.freeze
স্পেন ট্রেন

একটি FOOভিতরে পরিবর্তন করতে পারেন foo.js
লিমা_ফিল

16

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

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

তবে আমি অনুমান করি যে এটি আমরা পেতে পারি সেরা।

অতিরিক্ত হিসাবে, কনস্ট্যান্স.জেজে, এখানে ডোমিনিকের কার্যকারিতার এক ধরণের উন্নতি রয়েছে:

global.define = function ( name, value, exportsObject )
{
    if ( !exportsObject )
    {
        if ( exports.exportsObject )
            exportsObject = exports.exportsObject;
        else 
            exportsObject = exports;        
    }

    Object.defineProperty( exportsObject, name, {
        'value': value,
        'enumerable': true,
        'writable': false,
    });
}

exports.exportObject = null;

এইভাবে আপনি অন্যান্য মডিউলগুলিতে সংজ্ঞায়িত () ফাংশনটি ব্যবহার করতে পারেন এবং এটি আপনাকে কনস্ট্যান্টস.জেএস মডিউল এবং আপনার মডিউলটির ভিতরে ধ্রুবক উভয়ই সংজ্ঞায়িত করতে দেয় যেখানে আপনি ফাংশনটি বলেছেন। মডিউল ধ্রুবকগুলি ঘোষণা করার পরে দুটি উপায়ে (স্ক্রিপ্ট.জেএস) করা যেতে পারে।

প্রথম:

require( './constants.js' );

define( 'SOME_LOCAL_CONSTANT', "const value 1", this ); // constant in script.js
define( 'SOME_OTHER_LOCAL_CONSTANT', "const value 2", this ); // constant in script.js

define( 'CONSTANT_IN_CONSTANTS_MODULE', "const value x" ); // this is a constant in constants.js module

দ্বিতীয়ত:

constants = require( './constants.js' );

// More convenient for setting a lot of constants inside the module
constants.exportsObject = this;
define( 'SOME_CONSTANT', "const value 1" ); // constant in script.js
define( 'SOME_OTHER_CONSTANT', "const value 2" ); // constant in script.js

এছাড়াও, আপনি যদি কেবল (কনস্ট্যান্ট মডিউল) (গ্লোবাল অবজেক্টটি ফুটিয়ে তোলার জন্য নয়) ডিফাইন () ফাংশনটি কল করতে চান তবে আপনি এটি কনস্ট্যান্টস.জেজে যেমন সংজ্ঞায়িত করেন:

exports.define = function ( name, value, exportsObject )

এবং স্ক্রিপ্ট.জেজে এটির মতো ব্যবহার করুন:

constants.define( 'SOME_CONSTANT', "const value 1" );

11

পূর্ববর্তী প্রকল্পের অভিজ্ঞতা থেকে, এটি একটি ভাল উপায়:

কনস্ট্যান্টস.জেএস এ:

// constants.js

'use strict';

let constants = {
    key1: "value1",
    key2: "value2",
    key3: {
        subkey1: "subvalue1",
        subkey2: "subvalue2"
    }
};

module.exports =
        Object.freeze(constants); // freeze prevents changes by users

মেইন.জেএস (বা অ্যাপ্লিকেশন। জেএস ইত্যাদিতে) এটিকে নীচের মত ব্যবহার করুন:

// main.js

let constants = require('./constants');

console.log(constants.key1);

console.dir(constants.key3);

8

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

src / main.js ফাইল

const constants = require("./consts_folder");

src / consts_folder / index.js

const deal = require("./deal.js")
const note = require("./note.js")


module.exports = {
  deal,
  note
}

পুনশ্চ. এখানে dealএবং notemain.js এ প্রথম স্তর হবে be

src / consts_folder / note.js

exports.obj = {
  type: "object",
  description: "I'm a note object"
}

পুনশ্চ. objমেইন.জেএস-তে দ্বিতীয় স্তর হবে

src / consts_folder / deal.js

exports.str = "I'm a deal string"

পুনশ্চ. strমেইন.জেএস-তে দ্বিতীয় স্তর হবে

মেইন.জেএস ফাইলটিতে চূড়ান্ত ফলাফল:

console.log(constants.deal); Ouput:

{ডিল: {আরআর: 'আই \' মা ডিল স্ট্রিং '},

console.log(constants.note); Ouput:

দ্রষ্টব্য: {اعتراض: {প্রকার: 'অবজেক্ট', বিবরণ: 'আমি \' মা নোট অবজেক্ট '}



4

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

var constants = { FOO: "foo" }

module.exports = function() {
  return Object.assign({}, constants)
}

তারপরে কেউ এফও-কে পুনরায় নিয়োগ দেয় কিনা তাতে কিছু আসে যায় না কারণ এটি কেবল তাদের স্থানীয় অনুলিকেই প্রভাবিত করে।


বা কেবল মডিউল.এক্সপোর্ট = () => ({FOO: "foo", বার: "বার";);
বুজরান গ্র্যাম্বো

3

নোড.জেএস যেহেতু কমনজেএস নিদর্শনগুলি ব্যবহার করছে, আপনি module.exportsব্রাউজারে যেমন চান তেমন বৈশ্বিক ভেরি বা সেট করে কেবল মডিউলগুলির মধ্যে পরিবর্তনগুলি ভাগ করতে পারেন , তবে আপনি যে উইন্ডোটি ব্যবহার করেন তার পরিবর্তে global.your_var = value;


2

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

'use strict';
const DIRECTORY = Symbol('the directory of all sheets');
const SHEET = Symbol('an individual sheet');
const COMPOSER = Symbol('the sheet composer');

module.exports = Object.freeze({
  getDirectory: () => DIRECTORY,
  getSheet: () => SHEET,
  getComposer: () => COMPOSER
});

0

আমি এটি ওয়েবপ্যাক দিয়ে করার পরামর্শ দিই (ধরে নিই যে আপনি ওয়েবপ্যাকটি ব্যবহার করছেন)।

ধ্রুবকগুলির সংজ্ঞা ওয়েবপ্যাক কনফিগারেশন ফাইল সেট করার মতোই সহজ:

var webpack = require('webpack');
module.exports = {
    plugins: [
        new webpack.DefinePlugin({
            'APP_ENV': '"dev"',
            'process.env': {
                'NODE_ENV': '"development"'
            }
        })
    ],    
};

এইভাবে আপনি তাদের উত্সের বাইরে এগুলি সংজ্ঞায়িত করুন এবং এগুলি আপনার সমস্ত ফাইলে উপলব্ধ হবে।


0

আমি মডিউলগুলি থেকে গ্লোবাল স্থান আক্রমণ করা ভাল অভ্যাস বলে মনে করি না, তবে এমন পরিস্থিতিতে যেখানে এটি কার্যকর করার জন্য কঠোরভাবে প্রয়োজন হতে পারে:

Object.defineProperty(global,'MYCONSTANT',{value:'foo',writable:false,configurable:false});

এটি এই সংস্থানটির প্রভাব বিবেচনা করতে হবে। এই ধ্রুবকের যথাযথ নামকরণ না করে OVERWRITTING এর ঝুঁকি ইতিমধ্যে সংজ্ঞায়িত গ্লোবাল ভেরিয়েবলগুলি সত্যই।

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