ভাগ করা উপাদান লাইব্রেরি সেরা অনুশীলন


12

আমি একটি শেয়ারযোগ্য প্রতিক্রিয়া উপাদান লাইব্রেরি তৈরি করছি।

লাইব্রেরিতে অনেকগুলি উপাদান রয়েছে তবে শেষ ব্যবহারকারীর কেবল সেগুলির কয়েকটি ব্যবহারের প্রয়োজন হতে পারে।

আপনি যখন ওয়েবপ্যাক (বা পার্সেল বা রোলআপ) দিয়ে কোড বান্ডেল করেন এটি সমস্ত কোড সহ একটি একক ফাইল তৈরি করে ।

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

যদি একই রেপোতে প্রচুর পরিমাণে বিভিন্ন উপাদান থাকে তবে মেইন.জেসে কী থাকতে হবে?


1
যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আপনি এটির মতো একটি পদ্ধতির সন্ধান করছেন তবে তাদের উত্স কোডটি একবার দেখুন এবং আপনি দেখতে পাবেন যে তারা সমস্ত উপাদান পাশাপাশি স্বতন্ত্র উপাদানগুলি রপ্তানি করে এবং যখন কোনও ক্লায়েন্ট অ্যাপ্লিকেশন তাদের উপাদানগুলি ব্যবহার করে (এবং স্বতন্ত্র আমদানি করে) পুরো মডিউলটির পরিবর্তে উপাদানগুলি) ওয়েবপ্যাক কেবল সেই ফাইলগুলিকে টানবে importedযা কোডের মধ্যে ছিল এইভাবে বান্ডেলের আকার হ্রাস পাচ্ছে ।
এডওয়ার্ড চপুরিয়ান

উত্তর:


5

এটি একটি দীর্ঘ দীর্ঘ উত্তর কারণ এই প্রশ্নটি একটি দীর্ঘ দীর্ঘ এবং বিস্তারিত উত্তরের দাবি রাখে কারণ "সেরা অনুশীলন" উপায়টি কয়েকটি লাইন প্রতিক্রিয়া অপেক্ষা আরও জটিল।

আইভি'আর সেই সময়ের 3.5+ বছরের জন্য আমাদের বাড়ির পাঠাগারগুলিতে বজায় রেখেছি I আমার মনে হয় লাইব্রেরিগুলি আপনার গ্রন্থাগারটি কতটা বড় হবে তার উপর নির্ভর করে এবং ব্যক্তিগতভাবে আমরা উভয় উপায়ে উভয় উপসাগরকে সন্তুষ্ট করার জন্য দুটি উপায় সংকলন করি তার উপর নির্ভর করে বাণিজ্য গ্রন্থগুলি বান্ডিল করা উচিত ways ভোক্তাদের।

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

  • পেশাদাররা: প্রকল্প গ্রাহকরা রুট আপেক্ষিক লাইব্রেরি পথ থেকে সবকিছু আমদানি করতে পারবেন বলে গ্রাস করা সহজ import { Foo, Bar } from "library"
  • কনস: এটি কখনই গাছ কাঁপানো যাবে না; এবং লোকেরা ইএসএম দিয়ে এটি করার আগে এটি বৃক্ষরোপণযোগ্য হবে। নেক্সটজেএস এই বর্তমান পর্যায়ে ইএসএম সমর্থন করে না এবং প্রজেক্ট সেটআপগুলিও প্রচুর পরিমাণে করে না এজন্যই এই বিল্ডটি কেবল সিজেএসে সংকলন করার জন্য এটি এখনও ভাল ধারণা। যদি কেউ আপনার 1 টি উপাদান আমদানি করে তবে তারা আপনার সমস্ত উপাদানগুলির জন্য সমস্ত CSS এবং সমস্ত জাভাস্ক্রিপ্ট পাবেন।

পদ্ধতি 2: এটি উন্নত ব্যবহারকারীদের জন্য: প্রতিটি রফতানির জন্য একটি নতুন ফাইল তৈরি করুন এবং "প্রিজারমডিউলস: সত্য" বিকল্পটি সহ রোলআপ-প্লাগইন-মাল্টি-ইনপুট ব্যবহার করুন এটি নিশ্চিত করে আপনার কী সিএসএস সিস্টেম ব্যবহার করছেন তাও নির্ভর করে আপনার সিএসএস একটি একক ফাইলে মার্জ করা হয়নি তবে প্রতিটি সিএসএস ফাইলের ("। সিএসএস") বিবৃতি রোলআপের পরে আউটপুট ফাইলের ভিতরে রেখে দেওয়া হয় এবং সেই সিএসএস ফাইল উপস্থিত থাকে।

  • পেশাদাররা: যখন ব্যবহারকারীরা "লাইব্রেরি / ডিস্ট / ফু" থেকে {Foo import আমদানি করেন তারা কেবল ফু জন্য কোড এবং Foo এর জন্য সিএসএস এবং আরও কিছু পাবেন না।
  • কনস: এই সেটআপটিতে নোড_মডিউলগুলি হ্যান্ডেল করতে হবে জড়িতদের ("। সিএসএস") তাদের বিল্ড কনফিগারেশনে নেক্সটজেএস-এর সাথে এনটিএম next-transpile-modulesপ্যাকেজ দিয়ে করা হয়।
  • ক্যাভিয়েট: আমরা আমাদের নিজস্ব বাবেল প্লাগইন ব্যবহার করতে পারি যা আপনি এখানে পেতে পারেন: https://www.npmjs.com/package/babel-plugin-qubic লোককে যেতে দেয় import { Foo,Bar } from "library"এবং তারপরে বাবেলের সাথে এটি রূপান্তর করতে পারে ...
import { Foo } from "library/dist/export/foo"
import { Bar } from "library/dist/export/bar"

আমাদের একাধিক রোলআপ কনফিগারেশন রয়েছে যেখানে আমরা দুটি পদ্ধতিই ব্যবহার করি; সুতরাং লাইব্রেরি গ্রাহকরা যারা গাছ কাঁপানোর জন্য যত্ন "Foo from "library"নেন না তারা কেবল সিঙ্গল সিএসএস ফাইল আমদানি করতে এবং আমদানি করতে পারেন ; এবং লাইব্রেরি গ্রাহকদের জন্য যারা গাছ কাঁপুন এবং কেবল সমালোচনামূলক সিএসএস ব্যবহারের জন্য যত্ন নেন তারা কেবল আমাদের বাবেল প্লাগইন চালু করতে পারে।

সেরা অনুশীলনের জন্য রোলআপ গাইড:

আপনি টাইপ "rollup-plugin-babel": "5.0.0-alpha.1" স্ক্রিপ্ট ব্যবহার করছেন বা সর্বদা তৈরি না করে তা নিশ্চিত করুন যে আপনার .belrc এর মত দেখাচ্ছে।

{
  "presets": [
    ["@babel/preset-env", {
      "targets": {"chrome": "58", "ie": "11"},
      "useBuiltIns": false
    }],
    "@babel/preset-react",
    "@babel/preset-typescript"
  ],
  "plugins": [
    ["@babel/plugin-transform-runtime", {
      "absoluteRuntime": false,
      "corejs": false,
      "helpers": true,
      "regenerator": true,
      "useESModules": false,
      "version": "^7.8.3"
    }],
    "@babel/plugin-proposal-class-properties",
    "@babel/plugin-transform-classes",
    ["@babel/plugin-proposal-optional-chaining", {
      "loose": true
    }]
  ]
}

এবং রোলআপে ব্যাবেল প্লাগইনটির সাথে এটির মতো দেখাচ্ছে ...

        babel({
            babelHelpers: "runtime",
            extensions,
            include: ["src/**/*"],
            exclude: "node_modules/**",
            babelrc: true
        }),

এবং আপনার প্যাকেজ.জসন এটির মতো নিখরচায় খুঁজছেন:

    "dependencies": {
        "@babel/runtime": "^7.8.3",
        "react": "^16.10.2",
        "react-dom": "^16.10.2",
        "regenerator-runtime": "^0.13.3"
    },
    "peerDependencies": {
        "react": "^16.12.0",
        "react-dom": "^16.12.0",
    }

এবং অবশেষে রোলআপে আপনার বাহ্যিকগুলি এটির মতো সন্ধান করছে।

const makeExternalPredicate = externalArr => {
    if (externalArr.length === 0) return () => false;
    return id => new RegExp(`^(${externalArr.join('|')})($|/)`).test(id);
};

//... rest of rollup config above external.
    external: makeExternalPredicate(Object.keys(pkg.peerDependencies || {}).concat(Object.keys(pkg.dependencies || {}))),
// rest of rollup config below external.

কেন?

  • প্রতিক্রিয়া / প্রতিক্রিয়া-ডোম এবং গ্রাহক প্রকল্প থেকে আপনার অন্যান্য পিয়ার / বাহ্যিক নির্ভরতার উত্তরাধিকারী হওয়ার জন্য এটি আপনার বিষ্ঠাটিকে বান্ডিল করবে যার অর্থ তারা আপনার বান্ডলে নকল হবে না।
  • এটি ES5 এ বান্ডিল হবে
  • এতে অবজেক্টস্প্রেড, ক্লাস ইত্যাদির জন্য সমস্ত ব্যাবেল সহায়ক ফাংশনগুলির জন্য স্বয়ংক্রিয়ভাবে ("..") প্রয়োজন হবে যা আপনার বান্ডিল আকার থেকে আরও 15-25KB মুছবে এবং এর অর্থ হ'ল অবজেক্টস্প্রেডের জন্য সহায়ক ফাংশনগুলি আপনার লাইব্রেরিতে নকল হবে না আউটপুট + গ্রাহক প্রকল্পগুলি আউটপুট বান্ডিল করে।
  • অ্যাসিঙ্ক ফাংশনগুলি এখনও কাজ করবে
  • বাহ্যিকগুলি সেই পিয়ার-নির্ভরতা প্রত্যয় অর্থাত্ ব্যাবেল-সহায়করা বাবেল-সহায়ক / সহায়তাকারী / অবজেক্ট-স্প্রেডের সাথে বাইরের সাথে মিলবে এমন কোনও কিছু মিলবে will

অবশেষে এখানে একক উদাহরণের একক সূচি দেওয়া হয়েছে single একক index.js ফাইল আউটপুট রোলআপ কনফিগার ফাইল। https://gist.github.com/ShanonJackson/deb65ebf5b2094b3eac6141b9c25a0e3 যেখানে লক্ষ্য src / এক্সপোর্ট / সূচক.এর মতো দেখায় ...

export { Button } from "../components/Button/Button";
export * from "../components/Button/Button.styles";

export { Checkbox } from "../components/Checkbox/Checkbox";
export * from "../components/Checkbox/Checkbox.styles";

export { DatePicker } from "../components/DateTimePicker/DatePicker/DatePicker";
export { TimePicker } from "../components/DateTimePicker/TimePicker/TimePicker";
export { DayPicker } from "../components/DayPicker/DayPicker";
// etc etc etc

আপনার যদি বাবেল, রোলআপ, বা বান্ডিলিং / লাইব্রেরি সম্পর্কে কোনও প্রশ্ন থাকে তবে আমাকে জানান।


3

আপনি যখন ওয়েবপ্যাক (বা পার্সেল বা রোলআপ) দিয়ে কোড বান্ডেল করেন এটি সমস্ত কোড সহ একটি একক ফাইল তৈরি করে।

কার্য সম্পাদনের কারণে আমি ব্রাউজারের দ্বারা ডাউনলোড করা সমস্ত কোডটি না চাই যদি না এটি ব্যবহার না করা হয়

প্রতিটি উপাদানগুলির জন্য পৃথক ফাইল উত্পন্ন করা সম্ভব। একাধিক এন্ট্রি এবং আউটপুট সংজ্ঞায়নের মাধ্যমে ওয়েবপ্যাকের এমন ক্ষমতা রয়েছে। ধরা যাক আপনার একটি প্রকল্পের নিম্নলিখিত কাঠামো আছে

- my-cool-react-components
  - src // Folder contains all source code
    - index.js
    - componentA.js
    - componentB.js
    - ...
  - lib // Folder is generated when build
    - index.js // Contains components all together
    - componentA.js
    - componentB.js
    - ...

ওয়েবপ্যাক ফাইলটি এরকম কিছু দেখায়

const path = require('path');

module.exports = {
  entry: {
    index: './src/index.js',
    componentA: './src/componentA.js',
    componentB: './src/componentB.js',
  },
  output: {
    filename: '[name].js',
    path: path.resolve(__dirname, 'lib'),
  },
};

"কোড বিভাজন" সম্পর্কিত আরও তথ্য এখানে রয়েছে ওয়েবপ্যাক ডক্সে

যদি একই রেপোতে প্রচুর পরিমাণে বিভিন্ন উপাদান থাকে তবে মেইন.জেসে কী থাকতে হবে?

package.jsonফাইল নামে একটি একক ক্ষেত্র রয়েছে main, lib/index.jsউপরের প্রকল্প কাঠামো অনুসারে এর মান দেওয়া ভাল good এবং index.jsফাইলে সমস্ত উপাদান রফতানি করা হয়। যদি গ্রাহক একক উপাদানটি ব্যবহার করতে চান তবে তা কেবল সহজলভ্য করেই এটি পৌঁছনীয়

const componentX = require('my-cool-react-components/lib/componentX');

আমি কি এই ভাবনায় ঠিক আছি যে উপাদানগুলি বান্ডিল করা উচিত নয়? বান্ডিলিংগুলি উপাদানগুলির ভোক্তার কাছে রেখে দেওয়া উচিত? আমি উপাদানগুলির ভোক্তার কাছে অন্য কিছু রেখে দেব? আমি কি কেবল জেএসএক্সকে স্থানান্তরিত করেছি এবং এটিই?

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

আশা করি, আপনার সমস্ত প্রশ্নের উত্তর দেওয়া হয়েছে :)


উত্তরের জন্য ধন্যবাদ. আপনার উদাহরণ হিসাবে আমি যখনই কোনও নতুন উপাদান যুক্ত করি ততবার আমার ওয়েবপ্যাক কনফিগারেশনটি আপডেট করতে চাই না। "এটি আপনার উপর নির্ভর করে I've আমি খুঁজে পেয়েছি যে কিছু প্রতিক্রিয়া পাঠাগারগুলি মূল উপায়ে প্রকাশিত হয়, অন্যরা - বান্ডিলযুক্ত পদ্ধতিতে।" এটি ক্ষেত্রে না প্রমাণিত হয়। তৈরি প্রতিক্রিয়া অ্যাপ্লিকেশনটি আমার আনবান্ডেলযুক্ত উপাদানগুলির সাথে ঠিক আছে, তবে নেক্সট জেএস ত্রুটি ফেলছে এবং পরিষ্কারভাবে কেবল বান্ডিলযুক্ত উপাদানগুলির সাথে কাজ করে, সিদ্ধান্তটি আমার হাত থেকে সরিয়ে নিয়েছে।
otw

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

1

আপনি যেমন লোড্যাশ তাদের পদ্ধতির জন্য করছেন তেমনভাবে আপনার উপাদানগুলি বিভক্ত করতে পারেন ।

আপনার কাছে যা আছে সম্ভবত পৃথক উপাদান যা আপনি আলাদাভাবে বা মূল উপাদানটির মাধ্যমে আমদানি করতে পারবেন।

তারপরে গ্রাহক পুরো প্যাকেজটি আমদানি করতে পারবেন

import {MyComponent} from 'my-components';

বা এর পৃথক অংশ

import MyComponent from 'my-components/my-component';

গ্রাহকরা তাদের আমদানি করা উপাদানগুলির ভিত্তিতে নিজস্ব বান্ডিল তৈরি করবেন create এটি আপনার পুরো বান্ডিলটি ডাউনলোড হওয়া আটকাতে হবে।


1

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

এটি সেটআপ করা খুব সহজ। আপনি আপনার বিট লাইব্রেরি বা কেবল একটি উপাদান ইনস্টল করতে পারেন:

npm i @bit/bit.your-library.components.buttons

তারপরে আপনি আপনার অ্যাপ্লিকেশনটির উপাদানটি এর সাথে আমদানি করতে পারেন:

import Button3 from '@bit/bit.your-library.components.buttons';

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


0

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

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