কোনও রেডাক্স অ্যাপ্লিকেশনটিতে কোড বিভাজনের জন্য গতিশীলভাবে লোডারগুলি কীভাবে লোড করবেন?


187

আমি রেডাক্সে মাইগ্রেশন করছি

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

এছাড়াও আমি যেমন বুঝতে পেরেছি রেডাক্স অ্যাপ্লিকেশনটির একটি স্টোর থাকা উচিত এবং এটি অ্যাপ্লিকেশন শুরু হওয়ার পরে এটি তৈরি হয়ে যায়। যখন দোকানটি তৈরি করা হচ্ছে তখন আমার উচিত আমার সম্মিলিত রিডুসার pass অ্যাপ্লিকেশনটি খুব বড় না হলে এটি বোঝা যায়।

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

আমি আমার অ্যাপ্লিকেশনটির প্রতিটি অংশের জন্য সম্মিলিত হ্রাসকারক তৈরি করতে পারি এবং replaceReducer()যখন আমি অ্যাপ্লিকেশনের অংশগুলির মধ্যে চলে যাই use

এই একটি ভাল পন্থা?

উত্তর:


245

আপডেট: টুইটার কীভাবে এটি করে তাও দেখুন

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

reducers.js

import { combineReducers } from 'redux';
import users from './reducers/users';
import posts from './reducers/posts';

export default function createReducer(asyncReducers) {
  return combineReducers({
    users,
    posts,
    ...asyncReducers
  });
}

store.js

import { createStore } from 'redux';
import createReducer from './reducers';

export default function configureStore(initialState) {
  const store = createStore(createReducer(), initialState);
  store.asyncReducers = {};
  return store;
}

export function injectAsyncReducer(store, name, asyncReducer) {
  store.asyncReducers[name] = asyncReducer;
  store.replaceReducer(createReducer(store.asyncReducers));
}

routes.js

import { injectAsyncReducer } from './store';

// Assuming React Router here but the principle is the same
// regardless of the library: make sure store is available
// when you want to require.ensure() your reducer so you can call
// injectAsyncReducer(store, name, reducer).

function createRoutes(store) {
  // ...

  const CommentsRoute = {
    // ...

    getComponents(location, callback) {
      require.ensure([
        './pages/Comments',
        './reducers/comments'
      ], function (require) {
        const Comments = require('./pages/Comments').default;
        const commentsReducer = require('./reducers/comments').default;

        injectAsyncReducer(store, 'comments', commentsReducer);
        callback(null, Comments);
      })
    }
  };

  // ...
}

এটি প্রকাশের আরও সুস্পষ্ট উপায় থাকতে পারে — আমি কেবল ধারণাটি দেখিয়ে চলেছি।


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

2
কখনও কখনও, অসম্পূর্ণ কিছুকে 'অনুকূলিতকরণ' করতে এটি একটি বড় অপচয়।
এক্সএমএল

1
আশা করি উপরের মন্তব্যটি বোঝা যায় ... আমি ঘর থেকে দৌড়ে যাওয়ার সাথে সাথে। তবে মূলত আমি যখন আমাদের রাজ্যের গাছের একটি একক শাখায় কমানোরকারীদের একত্রিত করার সহজ উপায় দেখি না যখন তারা গতিশীলভাবে বিভিন্ন রুট থেকে লোড করা হয় /homepageএবং তারপরে সেই শাখার আরও কিছু বোঝা হয়ে যায় যখন ব্যবহারকারী তাদের যায় কিভাবে তার profile.একটি উদাহরণ এটি করতে, দুর্দান্ত হবে। অন্যথায় আমার রাজ্য গাছটি user-permissionsuser-personal
সমতল

1
এবং আমার প্রাথমিক অবস্থা থাকলে আমার কীভাবে অভিনয় করা উচিত?
স্টালসো

3
github.com/mxstbr/react-boilerplate boilerplate হ্রাসকারীদের লোড করতে এখানে উল্লিখিত ঠিক একই কৌশল ব্যবহার করে।
Pouya Sanooei

25

এটি আমি বর্তমান অ্যাপে এভাবে প্রয়োগ করেছি (একটি গিটহাব ইস্যু থেকে ড্যানের কোডের ভিত্তিতে!)

// Based on https://github.com/rackt/redux/issues/37#issue-85098222
class ReducerRegistry {
  constructor(initialReducers = {}) {
    this._reducers = {...initialReducers}
    this._emitChange = null
  }
  register(newReducers) {
    this._reducers = {...this._reducers, ...newReducers}
    if (this._emitChange != null) {
      this._emitChange(this.getReducers())
    }
  }
  getReducers() {
    return {...this._reducers}
  }
  setChangeListener(listener) {
    if (this._emitChange != null) {
      throw new Error('Can only set the listener for a ReducerRegistry once.')
    }
    this._emitChange = listener
  }
}

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

// coreReducers is a {name: function} Object
var coreReducers = require('./reducers/core')
var reducerRegistry = new ReducerRegistry(coreReducers)

তারপরে স্টোর এবং রুটগুলি কনফিগার করার সময় কোনও ফাংশন ব্যবহার করুন যা আপনি হ্রাসকারীর রেজিস্ট্রি দিতে পারেন:

var routes = createRoutes(reducerRegistry)
var store = createStore(reducerRegistry)

যেখানে এই ফাংশনগুলি দেখতে এমন কিছু দেখাচ্ছে:

function createRoutes(reducerRegistry) {
  return <Route path="/" component={App}>
    <Route path="core" component={Core}/>
    <Route path="async" getComponent={(location, cb) => {
      require.ensure([], require => {
        reducerRegistry.register({async: require('./reducers/async')})
        cb(null, require('./screens/Async'))
      })
    }}/>
  </Route>
}

function createStore(reducerRegistry) {
  var rootReducer = createReducer(reducerRegistry.getReducers())
  var store = createStore(rootReducer)

  reducerRegistry.setChangeListener((reducers) => {
    store.replaceReducer(createReducer(reducers))
  })

  return store
}

এখানে একটি বেসিক লাইভ উদাহরণ যা এই সেটআপটি দিয়ে তৈরি করা হয়েছিল এবং এর উত্স:

এটি আপনার সমস্ত হ্রাসকারীদের জন্য গরম পুনরায় লোডিং সক্ষম করার জন্য প্রয়োজনীয় কনফিগারেশনটিও কভার করে।


ধন্যবাদ @ জনি, কেবল মাথা উঁচু করে নিন, উদাহরণটি এখন একটি ত্রুটি ফেলছে।
জেসন জে। নাথান

ক্রিয়েডুসার () ঘোষণাটি আপনার উত্তর থেকে নিখোঁজ হয়েছে (আমি জানি এটি ড্যান আব্রাহামোভের উত্তরে রয়েছে তবে আমি মনে করি এটি সহ বিভ্রান্তি এড়াতে পারে)
প্যাকেট ট্রেসার

6

এখন একটি মডিউল রয়েছে যা রিডেক্স স্টোরটিতে ইনজেকশন হ্রাসকারী যুক্ত করে। একে রেডাক্স ইনজেক্টর বলা হয় ।

এটি কীভাবে ব্যবহার করবেন তা এখানে:

  1. হ্রাসকারীদের একত্রিত করবেন না। পরিবর্তে এগুলি ফাংশনগুলির (নেস্টেড) অবজেক্টে রাখুন যেমন আপনি সাধারণত করেন তবে তাদের সংযুক্ত না করে।

  2. রিডুএক্স থেকে ক্রডস্টোরের পরিবর্তে রিডেক্স-ইনজেক্টর থেকে ক্রিয়েইনজেক্টস্টোর ব্যবহার করুন।

  3. ইনজেকশন রিডিউসার দিয়ে নতুন হ্রাসকারী ইনজেক্ট করুন।

এখানে একটি উদাহরণ:

import { createInjectStore, injectReducer } from 'redux-injector';

const reducersObject = {
   router: routerReducerFunction,
   data: {
     user: userReducerFunction,
     auth: {
       loggedIn: loggedInReducerFunction,
       loggedOut: loggedOutReducerFunction
     },
     info: infoReducerFunction
   }
 };

const initialState = {};

let store = createInjectStore(
  reducersObject,
  initialState
);

// Now you can inject reducers anywhere in the tree.
injectReducer('data.form', formReducerFunction);

সম্পূর্ণ প্রকাশ: আমি মডিউলটির স্রষ্টা।


4

অক্টোবর 2017 হিসাবে:

  • Reedux

    আপনার স্টোর, আপনার প্রকল্প বা আপনার অভ্যাসগুলি স্পর্শ না করে ড্যানের পরামর্শ অনুসারে এবং এর চেয়ে বেশি কিছুই কার্যকর করে

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


2

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

দয়া করে https://github.com/Mic Microsoft/redux-dynamic-modules এ একবার দেখুন

মডিউলগুলি নিম্নলিখিত সুবিধাগুলি সরবরাহ করে:

  • মডিউলগুলি সহজেই অ্যাপ্লিকেশন জুড়ে, বা একাধিক অনুরূপ অ্যাপ্লিকেশনগুলির মধ্যে পুনরায় ব্যবহার করা যেতে পারে।

  • উপাদানগুলি তাদের প্রয়োজনীয় মডিউলগুলি ঘোষণা করে এবং রিডেক্স-ডায়নামিক-মডিউলগুলি নিশ্চিত করে যে মডিউলটি উপাদানটির জন্য লোড হয়েছে।

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

বৈশিষ্ট্য

  • একক, পুনরায় ব্যবহারযোগ্য মডিউলটিতে হ্রাসকারীদের, মিডলওয়্যারগুলি এবং স্টেটকে একসাথে গ্রুপ করুন
  • যে কোনও সময় একটি রেডাক্স স্টোর থেকে মডিউলগুলি যুক্ত এবং সরান।
  • কোনও উপাদান যখন রেন্ডার করা হয় তখন স্বয়ংক্রিয়ভাবে একটি মডিউল যুক্ত করতে অন্তর্ভুক্ত উপাদানটি ব্যবহার করুন
  • এক্সটেনশনগুলি রিডেক্স-সাগা এবং রিডেক্স-পর্যবেক্ষণযোগ্য সহ জনপ্রিয় গ্রন্থাগারগুলির সাথে ইন্টিগ্রেশন সরবরাহ করে

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

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

0

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

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

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