মিলহীন বেনামে সংজ্ঞায়িত () মডিউল


129

আমি প্রথমবারের জন্য আমার ওয়েব অ্যাপ্লিকেশন ব্রাউজ করার সময় আমি এই ত্রুটিটি পাচ্ছি (সাধারণত অক্ষম ক্যাশেযুক্ত ব্রাউজারে)।

ত্রুটি: মিলিত হয়নি বেনামে সংজ্ঞায়িত () মডিউল: ফাংশন (প্রয়োজনীয়) {

এইচটিএমএল :

<html>
   .
   .
   .
   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
   <script> var require = { urlArgs: "v=0.4.1.32" }; </script>
   <script data-main="assets/js/main" src="assets/js/libs/require.js"></script>
   <script src="assets/js/ace/ace.js?v=0.4.1.32"></script>
   </body>
</html>

জেএস :

$(function () {
    define(function (require) {
        // do something
    });
});

এই ত্রুটিটির অর্থ কী এবং কেন এটি ঘটছে তা যে কেউ জানেন?

উত্স ফাইল , গিথুব ইস্যু পৃষ্ঠায় এটি সম্পর্কে একটি সংক্ষিপ্ত আলোচনা

উত্তর:


142

এলিয়েন ওয়েগগুয়ের মতো বলেছিলেন, ডক্স অনুসারে, প্রযোজনা করা উচিত

  • আপনার নিজস্ব স্ক্রিপ্ট ট্যাগটিতে আপনার একটি বেনামে সংজ্ঞায়িত (" মডিউলগুলি সংজ্ঞা দেয় (কোনও স্ট্রিং আইডি ছাড়াই কল করুন ") রয়েছে (আমি ধারণা করি বাস্তবে তারা বিশ্বব্যাপী যে কোনও জায়গাতেই বোঝায়)
  • আপনার মডিউলগুলির বিরোধী নাম রয়েছে
  • আপনি লোডার প্লাগইন বা বেনামে মডিউল ব্যবহার করেন তবে সেগুলি বান্ডিল করতে প্রয়োজনীয়.js এর অপ্টিমাইজার ব্যবহার করবেন না

প্রয়োজনীয়.js মডিউলগুলির পাশাপাশি ব্রাউজারফাইয়ের সাথে নির্মিত বান্ডিলগুলি সহ আমার এই সমস্যা ছিল। সমাধানটি হ'ল:

উ: প্রয়োজনবোধের আগে অ-আবশ্যক। জ এস স্ট্যান্ডলোন বান্ডিলগুলি স্ক্রিপ্ট ট্যাগগুলিতে লোড করুন, বা লোড হওয়ার আগে , বা

বি। এগুলি লোড করুন.জেএসএস ব্যবহার করে (স্ক্রিপ্ট ট্যাগের পরিবর্তে)


2
বিরোধী নামগুলি একটি সাধারণ
জুলিও মেরিন্স

1
অপর সম্ভাব্য সমাধান, বেনামে মডিউলগুলির সাথে কিছু বিশেষ ক্ষেত্রে প্রয়োজনীয়js.onError ফাংশনটি ওভাররাইট করা প্রয়োজনেjs দ্বারা নিক্ষেপ করা ডিফল্ট ত্রুটি ব্যতিক্রমটি আটকাতে পারে যা সফল মডিউল বা কোড কার্যকর করা বন্ধ করে দেয়।
xtrm

1
সেই সঠিক কেসটি শিথিল করার জন্য কেবল একটি টান অনুরোধ ( github.com/requirejs/requirejs/pull/1763 ) যোগ করেছেন । আমি মনে করি এটি আজকাল খুব সাধারণ সমস্যা।
বব এস

1
আমাকে এগুলি লোড করার আগে বলার জন্য ধন্যবাদ! আমি জানিনা কেন এই টিপটি প্রয়োজনীয় সংস্থাগুলির নিজস্ব ডকুমেন্টেশনে নেই ... এ কারণেই স্ট্যাকটি কার্যকর হয়
টোবিয়াস ফিলি

14

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

ত্রুটি থেকে মুক্তি পেতে আপনার প্রয়োজনীয় সমস্ত জেএস ফাইল যুক্ত করুন।


দেখা গেছে প্রচুর গ্রন্থাগার এ জাতীয় কোনও কাজ করে বা কমপক্ষে এই জাতীয় ফাংশন ব্যবহার / রফতানি করে। আমি প্রত্যেককে পরামর্শ দেব - যদি তারা প্রয়োজন ব্যবহার করে - প্রয়োজনীয় সমস্ত কিছু আমদানি করুন :)
আন্দ্রে পোপভ

12

Reactjs দিয়ে শুরু হচ্ছে আমি বিষয়টি দৌড়ে গিয়ে একটা শিক্ষানবিস হিসাবে ডক্স পাশাপাশি গ্রিক ভাষায় লেখা হয়েছে পারে।

আমি যে সমস্যাটি দেখেছি তা হ'ল আপনি যখন "স্ট্রিং আইডি" ব্যবহার করবেন তখন প্রাথমিক উদাহরণগুলির বেশিরভাগই "বেনামে সংজ্ঞায়িত" ব্যবহার করেন।

বেনামে সংজ্ঞায়িত

define(function() {
        return { helloWorld: function() { console.log('hello world!') } };
 })


define(function() {
        return { helloWorld2: function() { console.log('hello world again!') } };
 })

স্ট্রিং আইডি দিয়ে সংজ্ঞা দিন

define('moduleOne',function() {
    return { helloWorld: function() { console.log('hello world!') } };
})

 define('moduleTwo', function() {
      return { helloWorld2: function() { console.log('hello world again!') } };
})

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

require([ "moduleOne", "moduleTwo" ], function(moduleOne, moduleTwo) {
    moduleOne.helloWorld();
    moduleTwo.helloWorld2();
});

(জাস্ট বংশধরগণ জন্য একটি নোট) কিছু হয় এই পদ্ধতির কিছু মূল্যবান বর্ণনা ডক্সে : "সংজ্ঞায়িত () কল মডিউলের জন্য একটি নাম অন্তর্ভুক্ত করে ... স্বাভাবিকভাবে দ্বারা সর্বোচ্চ করণ সরঞ্জাম ... Nam তৈরি হয় [ing] মডিউল নিজেকে ... তোলে মডিউলগুলি কম পোর্টেবল… মডিউলের জন্য কোনও নাম কোডিং এড়ানো এবং মডিউলের নামগুলিতে কেবল অপ্টিমাইজেশন সরঞ্জামটি জ্বলতে দেওয়া সবচেয়ে ভাল। " … পাশাপাশি এই গিটহাব থ্রেডে । নামের তালিকাটি প্রাথমিক শিক্ষাগুলিতে বাদ দেওয়া হয়নি বলে মনে হয়।
মার্ক জি।

10

প্রতি ডক্স :

আপনি যদি বেনামে সংজ্ঞায়িত সংজ্ঞা () কল সহ কোনও স্ক্রিপ্ট লোড করতে HTML এ কোনও স্ক্রিপ্ট ট্যাগ ম্যানুয়ালি দিয়ে থাকেন তবে এই ত্রুটি ঘটতে পারে।

এছাড়াও দেখা গেছে যে আপনি কয়েকটি HTML নামক মডিউল রয়েছে এমন স্ক্রিপ্ট লোড করার জন্য ম্যানুয়ালি HTML এ কোনও স্ক্রিপ্ট ট্যাগ কোড করেছেন, তবে তারপরে একটি বেনামি মডিউল লোড করার চেষ্টা করুন যা ম্যানুয়ালি লোড হওয়া স্ক্রিপ্টের একটি নামযুক্ত মডিউল হিসাবে একই নামটি শেষ করে দেয় কোডেড স্ক্রিপ্ট ট্যাগ।

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

ত্রুটি এড়াতে:

  • প্রয়োজনীয় জেএস এপিআই এর মাধ্যমে যে সমস্ত স্ক্রিপ্টগুলি সংজ্ঞায়িত () কল করে তা লোড করতে ভুলবেন না। ম্যানুয়ালি স্ক্রিপ্ট ট্যাগগুলিতে HTML এ স্ক্রিপ্টগুলি লোড করতে কোডগুলি দেবেন না যেগুলিতে সেগুলি সংজ্ঞায়িত () কল রয়েছে।

  • আপনি যদি ম্যানুয়ালি একটি এইচটিএমএল স্ক্রিপ্ট ট্যাগ কোড করেন তবে নিশ্চিত হয়ে নিন যে এতে কেবল নামযুক্ত মডিউল রয়েছে এবং সেই ফাইলের মডিউলগুলির একটির মতো একই নাম থাকা একটি বেনাম মডিউলটি লোড করা হয়নি।

  • সমস্যাটি যদি লোডার প্লাগইন বা বেনামে মডিউলগুলির ব্যবহার হয় তবে প্রয়োজনীয়তা জেএস অপটিমাইজারটি ফাইল বান্ডিলিংয়ের জন্য ব্যবহার না করা হয়, তবে প্রয়োজনীয়তা জেএস অপ্টিমাইজারটি ব্যবহার করুন।


3
এটি কি বেনামে সংজ্ঞায়িত মডিউল? github.com/requirejs/example-m মাল্টিপেজ
রাস্তার আলো

5

সচেতন হোন যে কিছু ব্রাউজার এক্সটেনশনগুলি পৃষ্ঠাগুলিতে কোড যুক্ত করতে পারে। আমার ক্ষেত্রে আমার কাছে একটি "সমস্ত টেক্সারিয়াস ইন এমমেট" প্লাগইন ছিল যা আমার প্রয়োজনীয় জেএসগুলিতে গণ্ডগোল করে। আপনার ডকুমেন্টটিতে ব্রাউজারে পরীক্ষা করে কোনও অতিরিক্ত কোড যুক্ত করা হয়নি তা নিশ্চিত করুন।


5

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

    <script>
        window.__define = window.define;
        window.__require = window.require;
        window.define = undefined;
        window.require = undefined;
    </script>
    <script src="your-script-file.js"></script>        
    <script>
        window.define = window.__define;
        window.require = window.__require;
        window.__define = undefined;
        window.__require = undefined;
    </script>

নিকটতম নয় তবে কাজ করছে বলে মনে হচ্ছে এবং প্রচুর পরিমাণে প্রত্যাখ্যানকে সঞ্চয় করেছে।


5
আসলে কখনও এই কাজ করবেন না। আইই তে এটি সঠিকভাবে কাজ করে না।
jcbdrn

2
আই-তে অন্তর্বর্তীভাবে প্রয়োজনীয় জেএসের সাথে অন্তর্ভুক্ত স্ক্রিপ্টগুলি তাদের উইন্ডো স্কোপ থেকে অনুপস্থিত সংজ্ঞায়িত করতে পারে এমনকি যখন সেই পরিবর্তনগুলি পুনরুদ্ধার করার পরে প্রয়োজনীয় কমান্ড এসেছিল। কেন এমনটি ঘটেছিল তা আমরা কখনই বুঝতে পারি নি তাই আমরা এই হ্যাকি সমাধানটি ত্যাগ করেছি।
jcbdrn

2
@jcbdrn এটি কেবল আইই-তে নয়। আমি অন্যান্য প্ল্যাটফর্মে এটি ঘটতে দেখেছি। কারণটি হ'ল এইচটিএমএল স্পেক সিঙ্ক্রোনাস স্ক্রিপ্টগুলি কার্যকর করার ক্রম সম্পর্কিত গ্যারান্টি দেয় তবে কেবল অন্যান্য সিঙ্ক্রোনাস স্ক্রিপ্টগুলির সাথে সম্পর্কিত । এটি সিঙ্ক্রোনাস সংক্রান্ত (বা তদ্বিপরীত) তুলনায় অ্যাসিনক্রোনাস স্ক্রিপ্টগুলির সম্পাদনের গ্যারান্টি দেয় না । সুতরাং এখানে উত্তরের বর্ণিত কোডটিতে, কোনও দুটি scriptউপাদানগুলির মধ্যে একটি অ্যাসিনক্রোনাস স্ক্রিপ্ট কার্যকর করা সম্ভব ।
লুই

আপনি যে বান্ডিলটি আমদানি করছেন সেগুলি সম্পাদনা করার দক্ষতা থাকলে আপনি কেবল পুরো জিনিসটি এইভাবে গুটিয়ে রাখতে পারেন:(function(){ var define = undefined; // the UMD registration code won't find the global 'define' anymore! // generated content goes here })()
পিট থর্ন

2

অথবা আপনি এই পদ্ধতির ব্যবহার করতে পারেন।

  • আপনার কোড বেসে প্রয়োজনীয়.js যুক্ত করুন
  • তারপরে আপনার স্ক্রিপ্টটি সেই কোডের মাধ্যমে লোড করুন

<script data-main="js/app.js" src="js/require.js"></script>

এটি কী করবে এটি আপনার স্ক্রিপ্টটি লোড করার পরে প্রয়োজনীয় জে

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