অন্য জাভাস্ক্রিপ্ট ফাইলে আমি কীভাবে একটি জাভাস্ক্রিপ্ট ফাইল অন্তর্ভুক্ত করব?


5191

@importসিএসএস-এর মতো জাভাস্ক্রিপ্টের মতো কিছু আছে যা আপনাকে অন্য জাভাস্ক্রিপ্ট ফাইলের মধ্যে একটি জাভাস্ক্রিপ্ট ফাইল অন্তর্ভুক্ত করতে দেয়?



82
@ ড্যানিয়েল, আমি একটি এজেএক্স কলটি ব্যবহার করতে চাই না।
অ্যালেক স্মার্ট

13
কেবল অর্ডার করা scriptট্যাগ ব্যবহার করে প্রয়োজনীয় ফাইলের প্রয়োজনীয়তার আগে কেন আমদানি করা ফাইলটিকে ঘোষণা করা হচ্ছে না ?
falsarella

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

1
এটি করার ব্যবহারিক সুবিধা কী? উভয় উপায়ে জাভাস্ক্রিপ্ট ফাইলের উপর নির্ভর করে কোড বেস লোড হতে চলেছে না এবং কোনও অবস্থাতেই এটি লোড হয় না কাজ শুরু করে!
সিয়াসটো পাইকার্জ

উত্তর:


4468

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

তবে ২০১৫ (ইএস)) এর পরে, জাভাস্ক্রিপ্টের নোড.জেএসে মডিউলগুলি আমদানির জন্য ES6 মডিউলগুলির স্ট্যান্ডার্ড রয়েছে, যা বেশিরভাগ আধুনিক ব্রাউজারগুলি দ্বারা সমর্থিত ।

পুরোনো ব্রাউজারে সাথে সামঞ্জস্যের জন্য, মত বিল্ড সরঞ্জাম Webpack এবং রোলআপ এবং / অথবা মত transpilation সরঞ্জাম হট্টগোল ব্যবহার করা যাবে।

ES6 মডিউল

এর নাম ECMAScript (ES6) মডিউল হয়েছে Node.js সমর্থিত সঙ্গে v8.5 সাল থেকে --experimental-modulesপতাকা, এবং যেহেতু পতাকা ছাড়া অন্তত Node.js v13.8.0। "ESM" সক্ষম করতে (বনাম নোড.জেএস এর পূর্ববর্তী কমনজেএস-স্টাইলের মডিউল সিস্টেম ["সিজেএস"]) আপনি ফাইলগুলিতে ব্যবহার "type": "module"করেন package.jsonবা এক্সটেনশান দেন .mjs। (একইভাবে, নোড.জেএস এর পূর্ববর্তী সিজেএস মডিউলগুলির সাথে লিখিত মডিউলগুলির নাম দেওয়া যেতে পারে .cjsযদি আপনার ডিফল্ট ইএসএম হয়))

ব্যবহার package.json:

{
    "type": "module"
}

তারপরে module.js:

export function hello() {
  return "Hello";
}

তারপরে main.js:

import { hello } from './module.js';
let val = hello();  // val is "Hello";

ব্যবহার করে .mjs, আপনার থাকতে হবে module.mjs:

export function hello() {
  return "Hello";
}

তারপরে main.mjs:

import { hello } from './module.mjs';
let val = hello();  // val is "Hello";

ব্রাউজারগুলিতে ECMAScript মডিউল

ব্রাউজার এর নাম ECMAScript মডিউল সরাসরি লোড করার (Webpack মত আর টুলস প্রয়োজন) জন্য সমর্থন ছিল যেহেতু সাফারি 10.1, ক্রোম 61, ফায়ারফক্স 60 এবং এজ 16. বর্তমান সমর্থন চেক করুন caniuse । নোড.জেএস এর .mjsএক্সটেনশন ব্যবহার করার দরকার নেই ; ব্রাউজারগুলি মডিউল / স্ক্রিপ্টগুলিতে ফাইল এক্সটেনশনগুলি সম্পূর্ণ উপেক্ষা করে।

<script type="module">
  import { hello } from './hello.mjs'; // Or it could be simply `hello.js`
  hello('world');
</script>
// hello.mjs -- or it could be simply `hello.js`
export function hello(text) {
  const div = document.createElement('div');
  div.textContent = `Hello ${text}`;
  document.body.appendChild(div);
}

Https://jakearchibald.com/2017/es-modules-in-browsers/ এ আরও পড়ুন

ব্রাউজারগুলিতে গতিশীল আমদানি

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

<script type="module">
  import('hello.mjs').then(module => {
      module.hello('world');
    });
</script>

Https://developers.google.com/web/updates/2017/11/dynamic-import এ আরও পড়ুন

নোড.জেএস প্রয়োজন

পুরানো সিজেএস মডিউল শৈলী, যা এখনও নোড.জেজে ব্যাপকভাবে ব্যবহৃত হয়, সেটি হল module.exports/require সিস্টেম।

// mymodule.js
module.exports = {
   hello: function() {
      return "Hello";
   }
}
// server.js
const myModule = require('./mymodule');
let val = myModule.hello(); // val is "Hello"   

জাভাস্ক্রিপ্টের ব্রাউজারগুলিতে বাহ্যিক জাভাস্ক্রিপ্ট সামগ্রী অন্তর্ভুক্ত করার জন্য অন্যান্য উপায় রয়েছে যা প্রিপ্রসেসিংয়ের প্রয়োজন হয় না।

এজেএক্স লোড হচ্ছে

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

আনুন লোড হচ্ছে

ডায়নামিক আমদানির মতো আপনি fetchআনতে ইনজেক্ট লাইব্রেরি ব্যবহার করে স্ক্রিপ্ট নির্ভরতার জন্য সম্পাদনের ক্রম নিয়ন্ত্রণের প্রতিশ্রুতি ব্যবহার করে একটি কল দিয়ে এক বা একাধিক স্ক্রিপ্ট লোড করতে পারেন :

fetchInject([
  'https://cdn.jsdelivr.net/momentjs/2.17.1/moment.min.js'
]).then(() => {
  console.log(`Finish in less than ${moment().endOf('year').fromNow(true)}`)
})

jQuery লোড হচ্ছে

JQuery এর গ্রন্থাগার লোড কার্যকারিতা উপলব্ধ এক লাইনে :

$.getScript("my_lovely_script.js", function() {
   alert("Script loaded but not necessarily executed.");
});

ডায়নামিক স্ক্রিপ্ট লোড হচ্ছে

আপনি HTML এ স্ক্রিপ্ট URL সহ একটি স্ক্রিপ্ট ট্যাগ যুক্ত করতে পারেন। JQuery এর ওভারহেড এড়ানোর জন্য, এটি একটি আদর্শ সমাধান।

স্ক্রিপ্ট এমনকি অন্য একটি সার্ভারে থাকতে পারে। তদ্ব্যতীত, ব্রাউজার কোডটি মূল্যায়ন করে। <script>ট্যাগ পারেন ওয়েবপৃষ্ঠাটি মধ্যে ইনজেকশনের করা যেতে পারে <head>, বা শুধু বন্ধ করার আগে সন্নিবেশিত </body>ট্যাগ।

এটি কীভাবে কাজ করতে পারে তার একটি উদাহরণ এখানে দেওয়া হয়েছে:

function dynamicallyLoadScript(url) {
    var script = document.createElement("script");  // create a script DOM node
    script.src = url;  // set its src to the provided URL

    document.head.appendChild(script);  // add it to the end of the head section of the page (could change 'head' to 'body' to add it to the end of the body section instead)
}

এই ফাংশনটি <script>পৃষ্ঠার প্রধান বিভাগের শেষে একটি নতুন ট্যাগ যুক্ত করবে , যেখানে srcবৈশিষ্ট্যটি ইউআরএলটিতে সেট করা আছে যা প্রথম পরামিতি হিসাবে ফাংশনটিতে দেওয়া হয়।

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

স্ক্রিপ্টটি কার্যকর করা হয়েছে তা সনাক্ত করা হচ্ছে

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

এর অর্থ হ'ল আপনি যদি এই কৌশলগুলি সরাসরি ব্যবহার করেন তবে আপনি আপনার নতুন বোঝা কোডটি পরবর্তী পংক্তিটি বোঝাতে বলার পরে ব্যবহার করতে পারবেন না , কারণ এটি এখনও লোড হবে।

উদাহরণস্বরূপ: my_lovely_script.jsরয়েছে MySuperObject:

var js = document.createElement("script");

js.type = "text/javascript";
js.src = jsFilePath;

document.body.appendChild(js);

var s = new MySuperObject();

Error : MySuperObject is undefined

তারপরে আপনি পৃষ্ঠাটি হিট করে পুনরায় লোড করুন F5। এবং এটি কাজ করে! বিভ্রান্তিকর ...

তাই এটা সম্পর্কে কি করতে হবে ?

ঠিক আছে, আপনি যে লিঙ্কটি দিয়েছেন তাতে লেখকের পরামর্শ মতো হ্যাক আপনি ব্যবহার করতে পারেন। সংক্ষেপে, তাড়াতাড়ি লোকদের জন্য, স্ক্রিপ্টটি লোড হওয়ার পরে কলব্যাক ফাংশনটি চালানোর জন্য তিনি একটি ইভেন্ট ব্যবহার করেন uses সুতরাং আপনি কলব্যাক ফাংশনে রিমোট লাইব্রেরি ব্যবহার করে সমস্ত কোড রাখতে পারেন। উদাহরণ স্বরূপ:

function loadScript(url, callback)
{
    // Adding the script tag to the head as suggested before
    var head = document.head;
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;

    // Then bind the event to the callback function.
    // There are several events for cross browser compatibility.
    script.onreadystatechange = callback;
    script.onload = callback;

    // Fire the loading
    head.appendChild(script);
}

তারপরে আপনি যে কোডটি ব্যবহার করতে চান তার পরে স্ক্রিপ্টটি লম্বা ফাংশনে লোড হওয়ার পরে লিখতে পারেন :

var myPrettyCode = function() {
   // Here, do whatever you want
};

তারপরে আপনি এই সমস্ত চালান:

loadScript("my_lovely_script.js", myPrettyCode);

নোট করুন যে স্ক্রিপ্টটি ডিওএম লোড হওয়ার পরে বা তার আগে ব্রাউজারের উপর নির্ভর করে এবং আপনি লাইনটি অন্তর্ভুক্ত করেছেন কিনা তা নির্বাহ করতে পারে script.async = false;সাধারণভাবে জাভাস্ক্রিপ্ট লোড করার বিষয়ে একটি দুর্দান্ত নিবন্ধ রয়েছে যা এটি নিয়ে আলোচনা করে।

উত্স কোড মার্জ / প্রাকপ্রসেসিং

এই উত্তরের উপরে উল্লিখিত হিসাবে, অনেক বিকাশকারী তাদের প্রকল্পগুলিতে পার্সেল, ওয়েবপ্যাক, বা ব্যাবেলের মতো বিল্ড / ট্রান্সপিলেশন সরঞ্জাম (গুলি) ব্যবহার করে তাদের আসন্ন জাভাস্ক্রিপ্ট সিনট্যাক্স ব্যবহার করতে, পুরানো ব্রাউজারগুলির জন্য পশ্চাদপদ সামঞ্জস্য সরবরাহ করে, ফাইলগুলি একত্রিত করে, মিনিফাইজ করে, কোড বিভাজন ইত্যাদি সম্পাদন করুন


130
নাহ, তবে কেউ গন্ডার মতো উন্নত কিছু ব্যবহার করেন বা অন্য কেউ এই প্রশ্নটি জিজ্ঞাসা করবেন না।
ই সন্তুষ্ট

192
কেবলমাত্র সম্পূর্ণ হওয়ার জন্য, একটি তৃতীয় উপায় রয়েছে: নির্দিষ্ট সমাধানে যখন আপনি উভয় জাভাস্ক্রিপ্ট ফাইল নিয়ন্ত্রণ করেন, আপনি কেবলমাত্র 1 টি বৃহত জাভাস্ক্রিপ্ট ফাইল তৈরি করতে পারেন যা উভয় ফাইলের সামগ্রীর সংমিশ্রণ করে।
তুষারপাত

20
"ডকুমেন্ট.ক্রেটএলিমেন্ট (" আমার_লভ্যালি_স্ক্রিপ্ট.জেএস ") হওয়া উচিত নয়;" উদাহরণে "ডকুমেন্ট.ক্রেটএলিমেন্ট (" স্ক্রিপ্ট ")" হতে হবে?
রাসেল সিলভা

14
যদি আপনার কোডটি কার্যকর করা হয় তবে হ্যাকের দরজা কীভাবে খোলা যায়?
ভিন্স পানুসিও

6
আপনার উত্তরের জন্য আইই ( onreadystatechangeইভেন্ট এবং readyStateসম্পত্তি) এর জন্য কিছু সংশোধন প্রয়োজন । এছাড়াও, গতিশীল স্ক্রিপ্ট লোড করা ব্রোসওয়ারের প্রিললোড স্ক্যানারগুলির দ্বারা উপকৃত হয় না। এই এইচটিএমএল 5 রকস নিবন্ধটি সুপারিশ করুন: html5rocks.com/en/tutorials/speed/script-loading
রুহং

570

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

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

উদাহরণ:

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

কিছু-dependency.js

define(['lib/dependency1', 'lib/dependency2'], function (d1, d2) {

     //Your actual script goes here.   
     //The dependent scripts will be fetched if necessary.

     return libraryObject;  //For example, jQuery object
});

implementation.js আপনার "প্রধান" জাভাস্ক্রিপ্ট যে ফাইলটি উপর নির্ভর করে কিছু-dependency.js

require(['some-dependency'], function(dependency) {

    //Your script goes here
    //some-dependency.js is fetched.   
    //Then your script is executed
});

গিটহাব পুনরায় পড়া থেকে উদ্ধৃত অংশ:

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

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

...


1
@ এএইডান: ম্যাটডমোর কারণ প্লাস এটি একটি বাহ্যিক গ্রন্থাগারের উপর নির্ভর করে যা বিনিময়ে স্বীকৃত উত্তরের উপর নির্ভর করে।
ডেভিড মুলদার

1
প্রয়োজনীয়.জেএসকে কাটিয়ে উঠতে সর্বাধিক সর্বশেষতমটি হবে কৌণিক জেএস যা আরও স্থিতিশীল এবং অন্যান্য বাঁধাই এবং সমৃদ্ধ এইচটিএমএল বৈশিষ্ট্যগুলির সাথে ব্যবহার করা সহজ।
zeeshan

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

1
স্বয়ংক্রিয় সংশোধনের সাথে এমভিসি এবং স্ক্রিপ্ট বান্ডিলিংয়ের সাথে ভাল কাজ করে না
ট্রায়ঙ্কো

1
'অ্যাড .. ডাব্লু / ও আপনার জাভাস্ক্রিপ্ট ফাইলগুলি আবার লিখতে হবে'; শান্ত, তবে ঠিক কীভাবে? কেন। উত্তরটি মূল স্ক্রিপ্টে এই জাতীয় একটি 'প্রয়োজনীয়' ('প্রয়োজনীয়জএস' নয়?) যুক্ত করার পরামর্শ দেয় + প্রতিটি নির্ভরশীল ফাইলের জন্য এই জাতীয় সংজ্ঞা দেওয়া আছে, হ্যাঁ? কিন্তু যে আবার লিখতে হয় তাই কি আবার লিখুন না? কোডের লড়াই-এর পরে যেহেতু এএ ফাইলটিকে গ্লোবাল ডিফগুলি স্বাভাবিক হিসাবে তৈরি করতে দেয়? -এটা কি পারে? আমি ঠিক যে চেষ্টা + (ভুলে গেলেন?) <স্ক্রিপ্ট src = " requirejs.org/docs/release/2.2.0/comments/require.js "> </ স্ক্রিপ্ট>, তারপরে 'requirejs ([' GoogleDrive.com/host /..',..উথার, ফাংশন (a, b) {মাইকোড}) ': ফায়ারব্যাগ বলেছেন প্রতিটি নির্ভরশীল লোড করা কিন্তু তাদের ডিএফগুলি মাইকোডে এবং তার পরে সংজ্ঞায়িত করা হয়নি।
গন্তব্য আর্কিটেক্ট

195

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

আপনার পৃষ্ঠার উপাদানটিতে আপনাকে ব্যবহার jQuery.append()করা দরকার <head>, এটি হল:

$("head").append('<script type="text/javascript" src="' + script + '"></script>');

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

তবে যদি এটি আপনার পক্ষে সমস্যা না হয় তবে এই পদ্ধতিটি কার্যকর করা উচিত।

আমি আসলে $ .import_js () নামে একটি jQuery প্লাগইন লিখেছি যা এই পদ্ধতিটি ব্যবহার করে:

(function($)
{
    /*
     * $.import_js() helper (for JavaScript importing within JavaScript code).
     */
    var import_js_imported = [];

    $.extend(true,
    {
        import_js : function(script)
        {
            var found = false;
            for (var i = 0; i < import_js_imported.length; i++)
                if (import_js_imported[i] == script) {
                    found = true;
                    break;
                }

            if (found == false) {
                $("head").append('<script type="text/javascript" src="' + script + '"></script>');
                import_js_imported.push(script);
            }
        }
    });

})(jQuery);

সুতরাং জাভাস্ক্রিপ্ট আমদানি করার জন্য আপনাকে যা করতে হবে তা হ'ল:

$.import_js('/path_to_project/scripts/somefunctions.js');

আমি উদাহরণের জন্য এটির জন্য একটি সাধারণ পরীক্ষাও করেছি ।

এটা একটা অন্তর্ভুক্ত main.jsপ্রধান HTML এ ফাইল এবং তারপর স্ক্রিপ্ট main.jsব্যবহার $.import_js()নামক একটি অতিরিক্ত ফাইল আমদানি করতে included.jsযা এই ফাংশন সংজ্ঞায়িত:

function hello()
{
    alert("Hello world!");
}

এবং ঠিক অন্তর্ভুক্ত করার পরে included.js, hello()ফাংশনটি বলা হয় এবং আপনি সতর্কতা পান।

(এই উত্তরটি ই-সন্তুষ্ট মন্তব্যের জবাবে))


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

16
@ জুয়ানপাস্তাস - ব্যবহার করুন jQuery.getScript, এইভাবে আপনাকে প্লাগইন লেখার বিষয়ে চিন্তা করতে হবে না ...
ম্যাটডিমো

6
হুম, এই নিবন্ধ অনুসারে , কোনও scriptউপাদানকে যুক্ত করার headকারণে এটি অ্যাসিক্রোনিক্যালি চালিত হবে, যদি না asyncনির্দিষ্টভাবে সেট করা থাকে false
Flimm

1
স্ক্রিপ্ট ভেরিয়েবলের এইচটিএমএল সত্তা এনকোড করা উচিত নয়? যদি লিঙ্কটিতে থাকে তবে "কোডটি ভেঙে যাবে
রেডক্লোভার

1
@ ফ্লিম প্রিয় স্যার, আমি এবং আমার টিম আপনার মন্তব্যের জন্য ধন্যবাদ জানাই এবং আমরা যদি ব্যক্তিগতভাবে আমাদের সাথে দেখা করি তবে আমি আপনাকে ব্যক্তিগতভাবে এমনকি এক টাকার বিয়ারও দেব
অ্যালেক্স

155

আর একটি উপায়, যা আমার মতে অনেক পরিষ্কার, তা হল <script>ট্যাগ ব্যবহারের পরিবর্তে একটি সিঙ্ক্রোনাস অ্যাজাক্স অনুরোধ করা । যা নোড.জেএস হ্যান্ডলগুলি অন্তর্ভুক্ত করে তাও ।

এখানে jQuery ব্যবহার করে একটি উদাহরণ দেওয়া হয়েছে:

function require(script) {
    $.ajax({
        url: script,
        dataType: "script",
        async: false,           // <-- This is the key
        success: function () {
            // all good...
        },
        error: function () {
            throw new Error("Could not load script " + script);
        }
    });
}

তারপরে আপনি এটি আপনার কোডটিতে ব্যবহার করতে পারেন যেমন আপনি সাধারণত একটি অন্তর্ভুক্ত ব্যবহার করেন:

require("/scripts/subscript.js");

এবং পরবর্তী লাইনে প্রয়োজনীয় স্ক্রিপ্ট থেকে একটি ফাংশন কল করতে সক্ষম হবেন:

subscript.doSomethingCool(); 

1
ভাল সমাধান, মাথা অন্তর্ভুক্ত async দুর্ভাগ্যক্রমে, এজ্যাক্স সমাধান কাজ করে।
মাত্তেও কন্টা

17
অন্য কেউ উল্লিখিত হিসাবে, প্রয়োজনীয়js.org এটি করে এবং প্রি সংকলকও রয়েছে যা জেএস ফাইলগুলি একসাথে রাখে যাতে তারা দ্রুত লোড হয়। আপনি এটি পরীক্ষা করে দেখতে চাইতে পারেন।
এরিয়েল

2
পাওয়া গেছে আমি Chrome এর জন্য ফাইলের নীচে এই নির্দেশকে যুক্ত করে এটি ডিবাগ করতে পারি: // @ উত্স URL = view_index.js
টড ভ্যানস

11
দুর্ভাগ্যজনকভাবে, অ্যাসিঙ্ক: মিথ্যা এখন jQuery এ অবচয় করা হয়েছে। ভবিষ্যতে হয়তো বিরতি, তাই আমি এড়াতে চাই।
sqram

3
@katsh আমরা এখানে jqXHR অবজেক্ট ব্যবহার করছি না। আপনার উক্তিটি আপনার আগের মন্তব্যের ব্যাক আপ করবে বলে মনে হয় না বলে মনে করা হয় যে async: falseহ্রাস করা হয়েছে। এইটা না! আপনার উদ্ধৃতি হিসাবে বলা হয়েছে, কেবল jqXHR সম্পর্কিত স্টাফ।
জিরো 3

101

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

আপনাকে কেবল ফাইল থেকে import cond from 'cond.js';নামী ম্যাক্রো লোড করতে লিখতে condহবে cond.js

সুতরাং আপনাকে কোনও জাভাস্ক্রিপ্ট ফ্রেমওয়ার্কের উপর নির্ভর করতে হবে না বা আপনাকে স্পষ্টভাবে অ্যাজাক্স কল করতে হবে না ।

নির্দেশ করে:


12
জেসফাইলে প্রয়োজনীয় / আমদানি আসতে অনেক দীর্ঘ হয়েছে। (আইএমও)।
rwheadon

6
@ রডহেডন হ্যাঁ হতবাক বলে মনে হচ্ছে যে এটি ভাষার অংশ নয়! লোকেরা কীভাবে কিছু করতে পারে তা আমার বাইরে! আমি এতে নতুন এবং এটি পাগলের সবচেয়ে খারাপ (অনেকের) বিট বলে মনে হচ্ছে
JonnyRaa

@ জনি-লিডস এমনকি বিল্ট-ইন মডিউল-লোডিং ছাড়াই, ব্রাউজারে জাভাস্ক্রিপ্ট যথেষ্ট নমনীয় যে আমরা আমাদের মডিউল পরিচালনার জন্য প্রয়োজনীয় জেএসের মতো একটি লাইব্রেরি প্রয়োগ করতে পারি।
আগ্রহী

8
২০১৫ সালের মাঝামাঝি- এখনও কোনও ব্রাউজারে প্রয়োগ করা হয়নি, বিকাশকারী.মোজিলা.আর.ইন.ইউএস
ডকস / ওয়েব

হাঁ আপনি ঠিক. এখন আমি এটির জন্য খারাপ লাগতে শুরু করি :( আপনি একবারে সমস্ত ব্রাউজারে প্রয়োগ করা এটি জাভাস্ক্রিপ্টে অন্তর্নির্মিত দুর্দান্ত বৈশিষ্ট্য হবে
ইমদাদ

96

গতিশীলভাবে একটি জাভাস্ক্রিপ্ট ট্যাগ তৈরি করা এবং এটি অন্যান্য জাভাস্ক্রিপ্ট কোডের ভিতরে থেকে এইচটিএমএল ডকুমেন্টে যুক্ত করা সম্ভব। এটি লক্ষ্যযুক্ত জাভাস্ক্রিপ্ট ফাইলটি লোড করবে।

function includeJs(jsFilePath) {
    var js = document.createElement("script");

    js.type = "text/javascript";
    js.src = jsFilePath;

    document.body.appendChild(js);
}

includeJs("/path/to/some/file.js");

8
@ ই-সন্তুষ্ট - আসলে, এটি একটি সুবিধা, একটি সিঙ্ক স্ক্রিপ্ট ব্লক করা হবে ocking কোর্সের জন্য ঘোড়া, তবে 10 বারে 9 বার আপনি নন-ব্লকিং বিকল্পটি চান।
অন্নাকাটা

@ সুইতলানা - স্ক্রিপ্টের উপাদানগুলি এর মতো তৈরি হয়েছে অ্যাসিঙ্ক। বর্তমানে এটি একটি লুফোলের শোষণ হিসাবে দেখা যেতে পারে তাই এটি ভবিষ্যতের প্রমাণ নাও হতে পারে, আমি কোনও স্ট্যান্ডার্ডে এমন কিছুই দেখিনি যা এটি স্পষ্ট করে।
অন্নাকাটা

আসলে আমি এটিকে ফিরিয়ে নিয়েছি, আমি খেয়াল করেছি আপনি মাথার চেয়ে শরীরে সংযোজন করছেন।
অন্নাকাটা

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

7
@ ই-সন্তুষ্ট অ্যাসিঙ্ক্রোনাস ভাল কারণ এটি আপনার পৃষ্ঠা হিমশীতল করবে না। এটি শেষ হয়ে গেলে js.onload = callback;
सूचित

74

বিবৃতি importECMAScript 6 এ রয়েছে।

বাক্য গঠন

import name from "module-name";
import { member } from "module-name";
import { member as alias } from "module-name";
import { member1 , member2 } from "module-name";
import { member1 , member2 as alias2 , [...] } from "module-name";
import name , { member [ , [...] ] } from "module-name";
import "module-name" as name;

... তবে আপনি যে পৃষ্ঠায় লিঙ্ক করেছেন তার সামঞ্জস্যতা সারণী অনুসারে আজ পর্যন্ত কোনও ব্রাউজার সমর্থন করে না।
জিরো 3

6
আপনি এখন ES6 কোডটি লিখতে পারেন এবং এটি আপনার পছন্দসই বর্তমান মডিউল সিস্টেমটি (সাধারণ জেএস / এএমডি / ইউএমডি) বাবেল.জেএস ( babeljs.io ) দিয়ে সংকলন করতে পারেন : babeljs.io/docs/usage/modules
জেরেমি হ্যারিস

@ জিরো 3 দৃশ্যত নতুন আইই (এজ) একমাত্র
জুলিয়ান আভার

2019 এ আইই এখনও কোনও রূপেই এটি সমর্থন করে না। মাইক্রোসফ্ট কেন ব্যবহারের বিরুদ্ধে হতে হবে?
গ্রেজেজ

61

সম্ভবত আপনি এই ফাংশনটি ব্যবহার করতে পারেন যা আমি এই পৃষ্ঠায় পেয়েছি আমি কীভাবে একটি জাভাস্ক্রিপ্ট ফাইলটিতে একটি জাভাস্ক্রিপ্ট ফাইল অন্তর্ভুক্ত করব? :

function include(filename)
{
    var head = document.getElementsByTagName('head')[0];

    var script = document.createElement('script');
    script.src = filename;
    script.type = 'text/javascript';

    head.appendChild(script)
}

5
যোগ করার জন্য দরকারী হওয়া উচিতscript.onload = callback;
ভিটিম.ইস

@ সুইতলানা ম্যাক্সেমচুক তাই, যদি আমি ব্যবহার না করি varতবে পরিবর্তনশীলটি বিশ্বব্যাপী হবে?
ফ্রান্সিসকো

@ ফ্রেঞ্চিসকো কররালেস হ্যাঁ
ক্রিস্টোফার চিচে 21'14

এটি বিশ্বব্যাপী শেষ হয় না
ভের সাথে


54

এখানে jQuery ছাড়াই একটি সিঙ্ক্রোনাস সংস্করণ রয়েছে :

function myRequire( url ) {
    var ajax = new XMLHttpRequest();
    ajax.open( 'GET', url, false ); // <-- the 'false' makes it synchronous
    ajax.onreadystatechange = function () {
        var script = ajax.response || ajax.responseText;
        if (ajax.readyState === 4) {
            switch( ajax.status) {
                case 200:
                    eval.apply( window, [script] );
                    console.log("script loaded: ", url);
                    break;
                default:
                    console.log("ERROR: script not loaded: ", url);
            }
        }
    };
    ajax.send(null);
}

নোট করুন যে এই কার্যকারী ক্রস-ডোমেনটি পেতে সার্ভারকে allow-originতার প্রতিক্রিয়াতে শিরোনাম সেট করতে হবে ।


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

3
@ হিনব: ক্রস-ডোমেনের জন্য এটি কাজ করার জন্য আমি কী করতে পারি? (স্ক্রিপ্টটি লোড করা হচ্ছে http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js)
ব্যবহারকারী 2284570

@ ব্যবহারকারী 2284570: আপনি যদি বিদেশী ডোমেনের মালিক হন: সার্ভারের উত্তরে 'অনুমতি-উত্স' শিরোনাম সেট করুন। আপনি যদি মালিক না হন: কিছুই নয়। দুঃখিত! এটি ক্রস-অরিজিন-পলিসি।
হেইনব

2
@ ব্যবহারকারী 2284570: আমি আপনার মন্তব্যটি সেভাবে বুঝতে পারি, আপনি যে ডোমেন থেকে স্ক্রিপ্টটি লোড করতে চান তার মালিক নন। সেক্ষেত্রে আপনি কেবল কোনও scriptোকানো <script>ট্যাগের মাধ্যমে স্ক্রিপ্ট লোড করতে পারবেন, এটির মাধ্যমে নয় XMLHttpRequest
হেইনব

2
যারা ফায়ারফক্সে এটি ব্যবহার করার পরিকল্পনা করছেন তাদের জন্য (আইম্যাক্রোস স্ক্রিপ্টিংয়ের জন্য বলুন), ফাইলটির শীর্ষে এই লাইনটি যুক্ত করুন:const XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1");
কেয়েসেশন

49

আমি কেবল এই জাভাস্ক্রিপ্ট কোডটি লিখেছি ( ডিওএম ম্যানিপুলেশনের জন্য প্রোটোটাইপ ব্যবহার করে ):

var require = (function() {
    var _required = {};
    return (function(url, callback) {
        if (typeof url == 'object') {
            // We've (hopefully) got an array: time to chain!
            if (url.length > 1) {
                // Load the nth file as soon as everything up to the
                // n-1th one is done.
                require(url.slice(0, url.length - 1), function() {
                    require(url[url.length - 1], callback);
                });
            } else if (url.length == 1) {
                require(url[0], callback);
            }
            return;
        }
        if (typeof _required[url] == 'undefined') {
            // Haven't loaded this URL yet; gogogo!
            _required[url] = [];

            var script = new Element('script', {
                src: url,
                type: 'text/javascript'
            });
            script.observe('load', function() {
                console.log("script " + url + " loaded.");
                _required[url].each(function(cb) {
                    cb.call(); // TODO: does this execute in the right context?
                });
                _required[url] = true;
            });

            $$('head')[0].insert(script);
        } else if (typeof _required[url] == 'boolean') {
            // We already loaded the thing, so go ahead.
            if (callback) {
                callback.call();
            }
            return;
        }

        if (callback) {
            _required[url].push(callback);
        }
    });
})();

ব্যবহার:

<script src="prototype.js"></script>
<script src="require.js"></script>
<script>
    require(['foo.js','bar.js'], function () {
        /* Use foo.js and bar.js here */
    });
</script>

সংক্ষেপ: http://gist.github.com/284442


7
jrburke এটিকে RequireJS হিসাবে লিখেছেন। গিথুব
মাইক কারন

এটি কী লোড হওয়া স্ক্রিপ্টটিকে এমন জায়গার বাইরে রাখে না যেখানে প্রয়োজনীয় () বলা হয়? মনে হচ্ছে এভাল () হ'ল এটিই সুযোগের একমাত্র উপায়। অথবা অন্য উপায় আছে কি?
trusktr

44

ফেসবুক কীভাবে তাদের সর্বব্যাপী লাইক বোতামটির জন্য এটি করে তার সাধারণ সংস্করণ এখানে রয়েছে:

<script>
  var firstScript = document.getElementsByTagName('script')[0],
      js = document.createElement('script');
  js.src = 'https://cdnjs.cloudflare.com/ajax/libs/Snowstorm/20131208/snowstorm-min.js';
  js.onload = function () {
    // do stuff with your dynamically loaded script
    snowStorm.snowColor = '#99ccff';
  };
  firstScript.parentNode.insertBefore(js, firstScript);
</script>

এটি যদি ফেসবুকের পক্ষে কাজ করে তবে এটি আপনার পক্ষে কাজ করবে।

এর scriptপরিবর্তে আমরা কেন প্রথম উপাদানটির সন্ধান করি headবা bodyএর কারণ হ'ল কিছু ব্রাউজারগুলি অনুপস্থিত থাকলে একটি তৈরি করে না, তবে আমাদের একটি scriptউপাদান রয়েছে - এটি একটির নিশ্চয়তা রয়েছে । Http://www.jspatterns.com/the-ridiculous-case-of-adding-a-script-element/ এ আরও পড়ুন ।


3
অভিশাপ! কিছু কিছু পদ্ধতি এখানেও কাজ করে তবে একটি গতিশীল সেটিংয়ের আওতায় এটি সবচেয়ে ভাল কাজ করে।
tfont

গণতান্ত্রিক দূরীকরণের জন্য আমি আপনার স্ক্রিপ্টটি প্রসারিত করেছি
কামিল

39

আপনি যদি খাঁটি জাভাস্ক্রিপ্ট চান, আপনি ব্যবহার করতে পারেন document.write

document.write('<script src="myscript.js" type="text/javascript"></script>');

আপনি যদি jQuery লাইব্রেরি ব্যবহার করেন তবে আপনি $.getScriptপদ্ধতিটি ব্যবহার করতে পারেন ।

$.getScript("another_script.js");

8
ডকুমেন্ট.উইট কি আর সব কিছু মুছে ফেলবে না?
আইসা আদিল

30

আপনি পিএইচপি ব্যবহার করে আপনার স্ক্রিপ্টগুলি একত্রিত করতে পারেন :

ফাইল main.js.php:

<?php
    header('Content-type:text/javascript; charset=utf-8');
    include_once("foo.js.php");
    include_once("bar.js.php");
?>

// Main JavaScript code goes here

16
পয়েন্টের মতো শব্দগুলি হ'ল সামনের প্রান্তে জাভাস্ক্রিপ্টে এগুলি রাখা
এরিয়েল

1
এটি মনে করিয়ে দেওয়ার জন্য ধন্যবাদ। আপনার এইচটিএমএল শিরোনামে পিএইচপি লিখিত <script> ট্যাগগুলি থাকতে পারে, যাতে আপনার প্রয়োজনীয় জেএস ফাইলগুলি (এবং কেবলমাত্র সেগুলি) লোড হবে।
রল্ফ

29

এখানে প্রদর্শিত বেশিরভাগ সমাধান গতিশীল লোড বোঝায়। পরিবর্তে আমি এমন একটি সংকলকটি অনুসন্ধান করছিলাম যা সমস্ত নির্ভরশীল ফাইলগুলিকে একক আউটপুট ফাইলে একত্রিত করে। কম / সাস প্রিপ্রোসেসরগুলির সমান হ'ল সিএসএস @import-এ-রুল with যেহেতু আমি এই ধরণের ভাল কিছু খুঁজে পাইনি, তাই সমস্যাটি সমাধান করার জন্য আমি একটি সাধারণ সরঞ্জাম লিখেছি।

সুতরাং এখানে সংকলক, https://github.com/dsheiko/jsic , যা $import("file-path")অনুরোধ করা ফাইলের সামগ্রীটি নিরাপদে প্রতিস্থাপন করে। এখানে সম্পর্কিত গ্রান্ট প্লাগইন রয়েছে: https://github.com/dsheiko/grunt-jsic

JQuery এর মাস্টার ডালে, একটি একক এক মধ্যে তারা কেবল CONCATENATE পারমাণবিক সোর্স ফাইল দিয়ে শুরু intro.jsএবং দিয়ে শেষ outtro.js। এটি সোর্স কোড ডিজাইনে কোনও নমনীয়তা না দেওয়ার কারণে এটি আমার পক্ষে উপযুক্ত নয়। এটি জেসিকের সাথে কীভাবে কাজ করে তা পরীক্ষা করে দেখুন:

src / main.js

var foo = $import("./Form/Input/Tel");

src / ফরম / ইনপুট / Tel.js

function() {
    return {
          prop: "",
          method: function(){}
    }
}

এখন আমরা সংকলকটি চালাতে পারি:

node jsic.js src/main.js build/mail.js

এবং সম্মিলিত ফাইলটি পান

বিল্ড / main.js

var foo = function() {
    return {
          prop: "",
          method: function(){}
    }
};

2
এই পোস্টটি যেহেতু আমি আরও ভাল সমাধান নিয়ে এসেছি - কমনজেএস মডিউল সংকলক - github.com/dsheiko/cjsc সুতরাং আপনি সাধারণ জেনস বা নোডজে মডিউলগুলি লিখতে এবং একে অপরের অ্যাক্সেস করতে পারেন তবে এগুলি বিচ্ছিন্ন স্কোপে রেখে দিতে পারেন। সুবিধাগুলি: একাধিক এইচটিটিপি অনুরোধের প্রয়োজন নেই যা কার্য সম্পাদনকে প্রভাবিত করে আপনার মডিউল কোডটি ম্যানুয়ালি মোড়ানোর দরকার নেই - এটি সংকলকের দায়িত্ব (এত ভাল উত্স কোড পাঠযোগ্যতা) আপনার কোনও বাহ্যিক লাইব্রেরির দরকার নেই এটি ইউএমডি- এর সাথে সামঞ্জস্যপূর্ণ এবং নোডজেস মডিউলগুলি (যেমন আপনি তাদের কোডটি স্পর্শ না করে jQuery, ব্যাকবোনকে মডিউল হিসাবে সম্বোধন করতে পারেন)
দিমিত্রি শেইকো

26

যদি আপনার জাভাস্ক্রিপ্ট ফাইলটি লোড করার অভিপ্রায়টি আমদানিকৃত / অন্তর্ভুক্ত ফাইল থেকে ফাংশনগুলি ব্যবহার করে তবে আপনি একটি বিশ্বব্যাপী অবজেক্টকে সংজ্ঞায়িত করতে পারেন এবং ফাংশনগুলি অবজেক্ট আইটেম হিসাবে সেট করতে পারেন। এই ক্ষেত্রে:

global.js

A = {};

file1.js

A.func1 = function() {
  console.log("func1");
}

file2.js

A.func2 = function() {
  console.log("func2");
}

main.js

A.func1();
A.func2();

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

<head>
  <script type="text/javascript" src="global.js"></script>
  <script type="text/javascript" src="file1.js"></script>
  <script type="text/javascript" src="file2.js"></script>
  <script type="text/javascript" src="main.js"></script>
</head>

22

এটি করা উচিত:

xhr = new XMLHttpRequest();
xhr.open("GET", "/soap/ajax/11.0/connection.js", false);
xhr.send();
eval(xhr.responseText);

5
evalকি এটা ভুল নয়। থেকে Crockford , " evalমন্দ। evalফাংশন জাভাস্ক্রিপ্ট অধিকাংশ অপব্যয়িত বৈশিষ্ট্য। এটা এড়িয়ে চলুন। evalউপনাম আছে। ব্যবহার করবেন না Functionকন্সট্রাকটর। স্ট্রিং পাস না setTimeoutবা setInterval।" আপনি যদি তার "জাভাস্ক্রিপ্ট: দ্য গুড পার্টস" না পড়ে থাকেন তবে বাইরে যান এবং এখনই এটি করুন। আপনি আফসোস করবেন না।
ম্যাটডিমো

13
@ ম্যাটডিএমো "কেউ বলেছে এটি খারাপ" সত্যই কোনও যুক্তি নয়।
কেসি

4
@ এমডেন্ড্রোকেট আমি নিলাম যে ডগলাস ক্রকফোর্ড কে আপনি জানেন না ।
ম্যাটডিমো

13
@ ম্যাটডিমো আমি সে সম্পর্কে পুরোপুরি সচেতন, তবে তিনি একজন মানুষ, দেবতা নন।
কেসি

2
@tggagne: ক্রস-ডোমেনের জন্য এটি কাজ করার জন্য আমি কী করতে পারি? (স্ক্রিপ্টটি লোড করা হচ্ছে http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js)
ব্যবহারকারী 2284570

21

বা রান টাইমে অন্তর্ভুক্ত করার পরিবর্তে, আপলোড করার পূর্বে এক স্ক্রিপ্ট ব্যবহার করুন aten

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

আরো দেখুন:


ব্রাউজারফি স্প্রোকেটসের চেয়ে অনেক বেশি জনপ্রিয়।
ড্যান ড্যাসক্লেস্কু

18

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

আমাকে একটি জাভাস্ক্রিপ্ট ফাইল (myvariables.js) অন্য জাভাস্ক্রিপ্ট ফাইলে (main.js) এ সংজ্ঞায়িত একটি ভেরিয়েবল (myVar1) ব্যবহার করতে হয়েছিল।

এর জন্য আমি নীচের মতো করেছিলাম:

এইচটিএমএল ফাইলে জাভাস্ক্রিপ্ট কোডটি লোড করেছেন, সঠিক ক্রমে, প্রথমে myvariables.js, তারপরে মেইন.জেএস:

<html>
    <body onload="bodyReady();" >

        <script src="myvariables.js" > </script>
        <script src="main.js" > </script>

        <!-- Some other code -->
    </body>
</html>

ফাইল: myvariables.js

var myVar1 = "I am variable from myvariables.js";

ফাইল: main.js

// ...
function bodyReady() {
    // ...
    alert (myVar1);    // This shows "I am variable from myvariables.js", which I needed
    // ...
}
// ...

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

এটি আমার দিনকে বাঁচিয়েছিল। আশা করি এটা কাজে লাগবে.


এই উত্তরটি নিয়ে সমস্যাটি হ'ল এটি এমন কিছু নয় import। এক জেএস ফাইল থেকে অন্য জেএসে ফাইল পেতে আপনার একটি HTML ফাইল দরকার।
Cannસાઈড

খুবই সত্য. সমাধান হিসাবে এটি অন্য কিছু উত্তর এটি পেয়ে যাচ্ছিল। তবে আমার দুটি জেএস ফাইল ছিল, একটিতে অন্য জেএস এর ভেরিয়েবল ব্যবহার করা উচিত। কোনও নোড.জেএস, নেক্সট.জেএস, এক্সপ্রেস.জেএস ইত্যাদি নেই, তাই আমদানি করুন বা প্রয়োজনীয় কাজ করবে না, কেবল সরল .js ফাইল ছিল।
মনোহর রেড্ডি পোরেড্ডি

বোধগম্য, তবে, প্রশ্নটি আসলে একটি HTML ফাইল ব্যবহার করে এর ভেরিয়েবলগুলি অ্যাক্সেস না করেই অন্য একটি ফাইলের মধ্যে জাভাস্ক্রিপ্ট ফাইল আমদানি করতে বলছে asking উদাহরণস্বরূপ, ধরুন আপনি একটি বোতামের জন্য কার্যকারিতা তৈরি করছেন, এবং আপনি তিনটি বিভিন্ন জেএস ফাইল ব্যবহার করেন, একটি ক্লিক হ্যান্ডলিংয়ের জন্য, একটি হোভার হ্যান্ডলিংয়ের জন্য, অন্য দুটিটির কলব্যাকের জন্য একটি। তৃতীয় জেএসে নিজেই অন্য দুটি জেএস আমদানি করা সহায়ক হবে এবং কেবল একটি <script>ট্যাগ রয়েছে। এটি সংগঠনের সাথে সহায়তা করতে পারে। এই উত্তরটি প্রশ্নটি যা চেয়েছিল তা নয়, এবং এই প্রসঙ্গে আদর্শ নয়।
18:53

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

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

16

আপনি যদি ওয়েব ওয়ার্কার্স ব্যবহার করছেন এবং অতিরিক্ত স্ক্রিপ্টগুলি শ্রমিকের সুযোগে অন্তর্ভুক্ত করতে চান তবে headট্যাগে স্ক্রিপ্ট যুক্ত করার বিষয়ে প্রদত্ত অন্যান্য উত্তরগুলি আপনার পক্ষে কাজ করবে না।

সৌভাগ্যক্রমে, ওয়েব ওয়ার্কারদের নিজস্ব importScriptsফাংশন রয়েছে যা ওয়েব ওয়ার্কারের ক্ষেত্রের একটি বিশ্বব্যাপী ফাংশন, এটি ব্রাউজারের নিজস্ব কারণ এটি নির্দিষ্টকরণের অংশ

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


16

চেক সহ আধুনিক ভাষায় স্ক্রিপ্টটি ইতিমধ্যে লোড করা হয়েছে কিনা তা হ'ল:

function loadJs(url){
  return new Promise( (resolve, reject) => {
    if (document.querySelector(`head > script[src="${src}"]`) !== null) return resolve()
    const script = document.createElement("script")
    script.src = url
    script.onload = resolve
    script.onerror = reject
    document.head.appendChild(script)
  });
}

ব্যবহার (async / অপেক্ষা):

try { await loadJs("https://.../script.js") } 
catch(error) {console.log(error)}

অথবা

await loadJs("https://.../script.js").catch(err => {})

ব্যবহার (প্রতিশ্রুতি):

loadJs("https://.../script.js").then(res => {}).catch(err => {})

খুশী হলাম। ভাল সমাধান।
নফতালি ওরফে নীল

সংক্ষিপ্ত এবং শুধুমাত্র ES5 প্রয়োজন, এবং মার্জিতভাবে একটি কল ফিরে আনুষ্ঠানিকভাবে এড়ানো। ধন্যবাদ দিমিত্রি!
ইউরেকা

বাহ, সার্ভার ছাড়াই ব্রাউজারে কাজ করে। pi.js = সহজভাবে var pi = 3.14। লোডজেএস () ফাংশনটির মাধ্যমে কল করুনloadJs("pi.js").then(function(){ console.log(pi); });
4

14

@importজাভাস্ক্রিপ্ট সিএসএস মত আমদানি অর্জনের জন্য সিনট্যাক্স যেমন তাদের বিশেষ মাধ্যমে মিশ্রণ হিসাবে একটি টুল ব্যবহার করে সম্ভব .mixফাইল টাইপ (দেখুন এখানে )। আমি কল্পনা করি অ্যাপ্লিকেশনটি কেবল উল্লিখিত পদ্ধতিগুলির মধ্যে আন্তঃব্যক্তির সাথে কেবল ব্যবহার করে, যদিও আমি জানি না।

.mixফাইলগুলিতে মিশ্রণ ডকুমেন্টেশন থেকে :

মিক্স ফাইলগুলি সহজভাবে .js বা .css ফাইলগুলি .mix সহ। ফাইলের নাম। একটি মিশ্রণ ফাইলটি সাধারণ স্টাইল বা স্ক্রিপ্ট ফাইলের কার্যকারিতা প্রসারিত করে এবং আপনাকে আমদানি এবং একত্রিত করতে দেয়।

এখানে এক উদাহরণ .mixফাইল যা একাধিক .jsফাইল একত্রিত করে :

// scripts-global.mix.js
// Plugins - Global

@import "global-plugins/headroom.js";
@import "global-plugins/retina-1.1.0.js";
@import "global-plugins/isotope.js";
@import "global-plugins/jquery.fitvids.js";

মিশ্রণ scripts-global.jsএটিকে একটি মিনিফাইড সংস্করণ ( scripts-global.min.js) হিসাবেও আউটপুট করে ।

দ্রষ্টব্য: আমি কোনও উপায়ে মিশ্রনের সাথে যুক্ত নই, এটিকে ফ্রন্ট-এন্ড ডেভেলপমেন্ট সরঞ্জাম হিসাবে ব্যবহার করা ছাড়া অন্য। আমি .mixজাভাস্ক্রিপ্ট ফাইলটি কার্যকর অবস্থায় দেখলাম (মিশ্রণ বয়লারপ্লেটের একটিতে) দেখে এবং এটির দ্বারা কিছুটা বিভ্রান্ত হয়ে পড়েছি ("আপনি এটি করতে পারেন?" আমি নিজেকে ভেবেছিলাম)। তখন আমি বুঝতে পারি যে এটি একটি অ্যাপ্লিকেশন-নির্দিষ্ট ফাইল টাইপ (কিছুটা হতাশার সাথে সম্মত)। তবুও, অঙ্কিত জ্ঞান অন্যদের জন্য সহায়ক হতে পারে।

আপডেট : মিশ্রণ এখন ফ্রি (অফলাইন)।

আপডেট : মিশ্রণ এখন বন্ধ আছে। পুরানো মিশ্রণ প্রকাশগুলি এখনও উপলব্ধ


এটি যদি নোড মডিউল হয় তবে এটি দুর্দান্ত।
b01

@ b01 একটি চ্যালেঞ্জের মতো শোনাচ্ছে;) যদি আমার কেবল সময়টি থাকত ... সম্ভবত অন্য কেউ করেন?
আইজাক গ্রেগসন

13
var js = document.createElement("script");

js.type = "text/javascript";
js.src = jsFilePath;

document.body.appendChild(js);

2
এটি সহজতম কোড, তবে কিছু bodyঅজানা ক্ষেত্রে ব্যর্থ হবে যখন এখনও বিদ্যমান নেই বা সংশোধন করা যাবে না। এছাড়াও, এটি উত্তরগুলি ব্যাখ্যা করতে সহায়তা করে।
ড্যান ড্যাসক্লেস্কু

13

আমার স্বাভাবিক পদ্ধতিটি হ'ল:

var require = function (src, cb) {
    cb = cb || function () {};

    var newScriptTag = document.createElement('script'),
        firstScriptTag = document.getElementsByTagName('script')[0];
    newScriptTag.src = src;
    newScriptTag.async = true;
    newScriptTag.onload = newScriptTag.onreadystatechange = function () {
        (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') && (cb());
    };
    firstScriptTag.parentNode.insertBefore(newScriptTag, firstScriptTag);
}

এটি দুর্দান্ত কাজ করে এবং আমার জন্য কোনও পৃষ্ঠা-লোড ব্যবহার করে না। আমি এজেএক্স পদ্ধতিটি ব্যবহার করেছি (অন্য উত্তরগুলির মধ্যে একটি) তবে এটি আমার পক্ষে খুব সুন্দরভাবে কাজ করবে বলে মনে হয় না।

কৌতূহলীদের জন্য কোডটি কীভাবে কাজ করে তার একটি ব্যাখ্যা এখানে: মূলত এটি URL এর একটি নতুন স্ক্রিপ্ট ট্যাগ তৈরি করে (প্রথমটির পরে)। এটি এটিকে অ্যাসিক্রোনাস মোডে সেট করে তাই এটি বাকী কোডটি ব্লক করে না, তবে রেডিস্টেট (সামগ্রীটির লোড হওয়ার মতো অবস্থা) 'লোড'-এ পরিবর্তিত হলে কলব্যাক দেয়।


13

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

<!DOCTYPE HTML>
<html>
    <head>
        <script src="script1.js"></script>
        <script src="script2.js"></script>
    </head>
    <body></body>
</html>

যদি স্ক্রিপ্ট 2 এর জন্য স্ক্রিপ্ট 1 প্রয়োজন হয় তবে এটি এর মতো কিছু করার জন্য এটিই সর্বমোট সহজ উপায়। আমি খুব আশ্চর্য হয়েছি যে কেউ এটিকে সামনে এনেছে না, কারণ এটি সর্বাধিক সুস্পষ্ট এবং সহজ উত্তর যা প্রায় প্রতিটি ক্ষেত্রে প্রয়োগ হবে।


1
আমি নিজেকে সহ অনেক লোকের জন্য অনুমান করছি, আমাদের ডায়নামিক ফাইলের নাম দরকার।
স্টুয়ার্ট ম্যাকআইন্টির

1
এই ক্ষেত্রে @ স্টার্টমসিআইন্টিয়র, রানটাইমের সময় স্ক্রিপ্ট ট্যাগের src বৈশিষ্ট্যটি সেট করুন এবং অনলোড ইভেন্টের জন্য অপেক্ষা করুন (অবশ্যই 2019 এ ক্ষেত্রে আরও ভাল সমাধান রয়েছে)।
KthProg

12

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

// ----- USAGE -----

require('ivar.util.string');
require('ivar.net.*');
require('ivar/util/array.js');
require('http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js');

ready(function(){
    //Do something when required scripts are loaded
});

    //--------------------

var _rmod = _rmod || {}; //Require module namespace
_rmod.LOADED = false;
_rmod.on_ready_fn_stack = [];
_rmod.libpath = '';
_rmod.imported = {};
_rmod.loading = {
    scripts: {},
    length: 0
};

_rmod.findScriptPath = function(script_name) {
    var script_elems = document.getElementsByTagName('script');
    for (var i = 0; i < script_elems.length; i++) {
        if (script_elems[i].src.endsWith(script_name)) {
            var href = window.location.href;
            href = href.substring(0, href.lastIndexOf('/'));
            var url = script_elems[i].src.substring(0, script_elems[i].length - script_name.length);
            return url.substring(href.length+1, url.length);
        }
    }
    return '';
};

_rmod.libpath = _rmod.findScriptPath('script.js'); //Path of your main script used to mark
                                                   //the root directory of your library, any library.


_rmod.injectScript = function(script_name, uri, callback, prepare) {

    if(!prepare)
        prepare(script_name, uri);

    var script_elem = document.createElement('script');
    script_elem.type = 'text/javascript';
    script_elem.title = script_name;
    script_elem.src = uri;
    script_elem.async = true;
    script_elem.defer = false;

    if(!callback)
        script_elem.onload = function() {
            callback(script_name, uri);
        };
    document.getElementsByTagName('head')[0].appendChild(script_elem);
};

_rmod.requirePrepare = function(script_name, uri) {
    _rmod.loading.scripts[script_name] = uri;
    _rmod.loading.length++;
};

_rmod.requireCallback = function(script_name, uri) {
    _rmod.loading.length--;
    delete _rmod.loading.scripts[script_name];
    _rmod.imported[script_name] = uri;

    if(_rmod.loading.length == 0)
        _rmod.onReady();
};

_rmod.onReady = function() {
    if (!_rmod.LOADED) {
        for (var i = 0; i < _rmod.on_ready_fn_stack.length; i++){
            _rmod.on_ready_fn_stack[i]();
        });
        _rmod.LOADED = true;
    }
};

_.rmod = namespaceToUri = function(script_name, url) {
    var np = script_name.split('.');
    if (np.getLast() === '*') {
        np.pop();
        np.push('_all');
    }

    if(!url)
        url = '';

    script_name = np.join('.');
    return  url + np.join('/')+'.js';
};

//You can rename based on your liking. I chose require, but it
//can be called include or anything else that is easy for you
//to remember or write, except "import", because it is reserved
//for future use.
var require = function(script_name) {
    var uri = '';
    if (script_name.indexOf('/') > -1) {
        uri = script_name;
        var lastSlash = uri.lastIndexOf('/');
        script_name = uri.substring(lastSlash+1, uri.length);
    } 
    else {
        uri = _rmod.namespaceToUri(script_name, ivar._private.libpath);
    }

    if (!_rmod.loading.scripts.hasOwnProperty(script_name)
     && !_rmod.imported.hasOwnProperty(script_name)) {
        _rmod.injectScript(script_name, uri,
            _rmod.requireCallback,
                _rmod.requirePrepare);
    }
};

var ready = function(fn) {
    _rmod.on_ready_fn_stack.push(fn);
};

10

এই স্ক্রিপ্টটি অন্য কোনও <script>ট্যাগের শীর্ষে একটি জাভাস্ক্রিপ্ট ফাইল যুক্ত করবে :

(function () {
    var li = document.createElement('script'); 
    li.type = 'text/javascript'; 
    li.src= "http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"; 
    li.async=true; 
    var s = document.getElementsByTagName('script')[0]; 
    s.parentNode.insertBefore(li, s);
})();

10

রয়েছে Head.js । এটি মোকাবেলা করা খুব সহজ:

head.load("js/jquery.min.js",
          "js/jquery.someplugin.js",
          "js/jquery.someplugin.css", function() {
  alert("Everything is ok!");
});

আপনি দেখতে পাচ্ছেন, এটি Require.js এর চেয়ে সহজ এবং jQuery এর $.getScriptপদ্ধতির মতো সুবিধাজনক । এটিতে কিছু উন্নত বৈশিষ্ট্য যেমন শর্তযুক্ত লোডিং, বৈশিষ্ট্য সনাক্তকরণ এবং আরও অনেক কিছু রয়েছে


10

এই প্রশ্নের জন্য অনেক সম্ভাব্য উত্তর আছে। আমার উত্তর অবশ্যই তাদের বেশিরভাগের উপর ভিত্তি করে। সমস্ত উত্তরগুলি পড়ার পরে এটিই আমি শেষ করেছি।

$.getScriptলোডিং সম্পন্ন হওয়ার সাথে সাথে কলব্যাকের প্রয়োজন এবং অন্য যে কোনও সমাধানের সমস্যাটি হ'ল হ'ল যদি আপনার কাছে একাধিক ফাইল থাকে যা এটি ব্যবহার করে এবং একে অপরের উপর নির্ভর করে তবে সমস্ত স্ক্রিপ্টগুলি কখন লোড হয়ে গেছে তা জানতে আপনার আর উপায় থাকবে না (একবারে সেগুলি নেস্ট করা হলে) একাধিক ফাইলে)।

উদাহরণ:

file3.js

var f3obj = "file3";

// Define other stuff

file2.js:

var f2obj = "file2";
$.getScript("file3.js", function(){

    alert(f3obj);

    // Use anything defined in file3.
});

file1.js:

$.getScript("file2.js", function(){
    alert(f3obj); //This will probably fail because file3 is only guaranteed to have loaded inside the callback in file2.
    alert(f2obj);

    // Use anything defined in the loaded script...
});

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

$.whenস্থগিত হওয়া বস্তুর অ্যারে পরীক্ষা করার জন্য আপনি চেষ্টা করতে পারেন , তবে এখন আপনি প্রতিটি ফাইলের মধ্যে এটি করছেন এবং $.whenকলব্যাক কার্যকর না হওয়ার সাথে সাথেই ফাইল 2 লোড হওয়া হিসাবে বিবেচিত হবে, সুতরাং ফাইল 1 ফাইল 3 লোড হওয়ার আগেই মৃত্যুদন্ড কার্যকর করে চলেছে । এটি এখনও একই সমস্যা আছে।

আমি ফরোয়ার্ডের পরিবর্তে পিছনে যাওয়ার সিদ্ধান্ত নিয়েছি। আপনাকে ধন্যবাদ document.writeln। আমি জানি এটি নিষিদ্ধ, তবে যতক্ষণ এটি সঠিকভাবে ব্যবহৃত হয় ততক্ষণ এটি ভালভাবে কাজ করে। আপনি এমন কোড সহ শেষ করেছেন যা সহজেই ডিবাগ করা যায়, সঠিকভাবে ডিওমে প্রদর্শিত হবে এবং নির্ভরতা সঠিকভাবে লোড করা হচ্ছে কিনা তা নিশ্চিত করতে পারেন।

আপনি অবশ্যই $ ("বডি") ব্যবহার করতে পারেন app

দ্রষ্টব্য: পৃষ্ঠাটি লোড হওয়ার সময় আপনার অবশ্যই এটি ব্যবহার করা উচিত, অন্যথায় আপনি একটি ফাঁকা স্ক্রিন পান। অন্য কথায়, সবসময় পূর্বে / document.ready বাইরে এই জায়গা । পৃষ্ঠাটি কোনও ক্লিক ইভেন্টে বা এ জাতীয় কিছুতে লোড হওয়ার পরে আমি এটি ব্যবহার করে পরীক্ষা করেছি না, তবে আমি নিশ্চিত যে এটি ব্যর্থ হবে।

JQuery প্রসারিত করার ধারণাটি আমি পছন্দ করেছি তবে অবশ্যই আপনার প্রয়োজন নেই।

কল করার আগে document.writeln, স্ক্রিপ্টটি ইতিমধ্যে সমস্ত স্ক্রিপ্ট উপাদানগুলির মূল্যায়ন করে স্ক্রিপ্টটি লোড হচ্ছে না তা নিশ্চিত করে তোলে।

আমি ধরে নিয়েছি যে কোনও স্ক্রিপ্ট পুরোপুরি সম্পাদিত হবে না যতক্ষণ না এর document.readyইভেন্টটি কার্যকর করা হয়। (আমি জানি যে ব্যবহারের document.readyপ্রয়োজন নেই, তবে অনেক লোক এটি ব্যবহার করে এবং এটি পরিচালনা করা একটি সুরক্ষার কাজ))

অতিরিক্ত ফাইল লোড হয়ে গেলে document.readyকলব্যাকগুলি ভুল ক্রমে কার্যকর করা হবে। যখন কোনও স্ক্রিপ্টটি আসলে লোড হয় তখন এটিকে সমাধান করতে, যে স্ক্রিপ্টটি এটি আমদানি করে তা নিজেই পুনরায় আমদানি করা হয় এবং সম্পাদন বন্ধ হয়ে যায়। এটি সূচিত ফাইলটির document.readyকলব্যাকটি আমদানি করে যে কোনও স্ক্রিপ্ট থেকে যেকোন পরে তার সম্পাদন করে।

এই পদ্ধতির পরিবর্তে আপনি jQuery সংশোধন করার চেষ্টা করতে পারেন readyList, তবে এটি আরও খারাপ সমাধান বলে মনে হয়েছিল।

সমাধান:

$.extend(true,
{
    import_js : function(scriptpath, reAddLast)
    {
        if (typeof reAddLast === "undefined" || reAddLast === null)
        {
            reAddLast = true; // Default this value to true. It is not used by the end user, only to facilitate recursion correctly.
        }

        var found = false;
        if (reAddLast == true) // If we are re-adding the originating script we do not care if it has already been added.
        {
            found = $('script').filter(function () {
                return ($(this).attr('src') == scriptpath);
            }).length != 0; // jQuery to check if the script already exists. (replace it with straight JavaScript if you don't like jQuery.
        }

        if (found == false) {

            var callingScriptPath = $('script').last().attr("src"); // Get the script that is currently loading. Again this creates a limitation where this should not be used in a button, and only before document.ready.

            document.writeln("<script type='text/javascript' src='" + scriptpath + "'></script>"); // Add the script to the document using writeln

            if (reAddLast)
            {
                $.import_js(callingScriptPath, false); // Call itself with the originating script to fix the order.
                throw 'Readding script to correct order: ' + scriptpath + ' < ' + callingScriptPath; // This halts execution of the originating script since it is getting reloaded. If you put a try / catch around the call to $.import_js you results will vary.
            }
            return true;
        }
        return false;
    }
});

ব্যবহার:

File3:

var f3obj = "file3";

// Define other stuff
$(function(){
    f3obj = "file3docready";
});

File2:

$.import_js('js/file3.js');
var f2obj = "file2";
$(function(){
    f2obj = "file2docready";
});

file1:

$.import_js('js/file2.js');

// Use objects from file2 or file3
alert(f3obj); // "file3"
alert(f2obj); // "file2"

$(function(){
    // Use objects from file2 or file3 some more.
    alert(f3obj); //"file3docready"
    alert(f2obj); //"file2docready"
});

বর্তমানে গৃহীত উত্তর ঠিক ঠিক এটি বলেছে: কেবল যথেষ্ট নয়।
Cannસાઈড

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

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

10

জাভাস্ক্রিপ্টে মডিউলগুলি প্রয়োগ করার বিভিন্ন উপায় রয়েছে, এখানে দুটি সর্বাধিক জনপ্রিয়:

ES6 মডিউল

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

// main.js file

export function add (a, b) {
  return a + b;
}

export default function multiply (a, b) {
  return a * b;
}


// test.js file

import {add}, multiply from './main';   // for named exports between curly braces {export1, export2}
                                        // for default exports without {}

console.log(multiply(2, 2));  // logs 4

console.log(add(1, 2));  // logs 3

কমনজেএস ( নোডজেএসে ব্যবহৃত)

এই মোডুলিং সিস্টেমটি নোডজেএস-এ ব্যবহৃত হয়। আপনি মূলত যে পণ্যটিকে বলা হয় তার মধ্যে আপনার রফতানি যোগ করুন module.exports। তারপরে আপনি এটির মাধ্যমে একটি এর মাধ্যমে অ্যাক্সেস করতে পারবেন require('modulePath')। এখানে গুরুত্বপূর্ণ বুঝতে হবে যে এই মডিউলগুলি ক্যাশে হচ্ছে, সুতরাং আপনি যদি require()কোনও নির্দিষ্ট মডিউল দু'বার করেন তবে এটি ইতিমধ্যে তৈরি মডিউলটি ফিরে আসবে।

// main.js file

function add (a, b) {
  return a + b;
}

module.exports = add;  // here we add our add function to the exports object


// test.js file

const add = require('./main'); 

console.log(add(1,2));  // logs 3

9

আমি এই প্রশ্নে এসেছি কারণ আমি দরকারী জাভাস্ক্রিপ্ট প্লাগইনগুলির সংগ্রহ বজায় রাখার সহজ উপায় খুঁজছিলাম। এখানে কয়েকটি সমাধান দেখার পরে আমি এটি নিয়ে এসেছি:

  1. "Plugins.js" (বা এক্সটেনশন.জেএস বা আপনি যা চান) নামে একটি ফাইল সেট আপ করুন। আপনার প্লাগইন ফাইলগুলিকে সেই এক মাস্টার ফাইলের সাথে একত্রে রাখুন।

  2. প্লাগইনস.জেএসসের একটি অ্যারে থাকবে pluginNames[]যা আমরা পুনরাবৃত্তি করব each(), তারপরে <script>প্রতিটি প্লাগইনের জন্য মাথায় একটি ট্যাগ যুক্ত করব plug

//set array to be updated when we add or remove plugin files
var pluginNames = ["lettering", "fittext", "butterjam", etc.];

//one script tag for each plugin
$.each(pluginNames, function(){
    $('head').append('<script src="js/plugins/' + this + '.js"></script>');
});
  1. আপনার মাথায় কেবল একটি ফাইল ম্যানুয়ালি কল করুন:
    <script src="js/plugins/plugins.js"></script>

কিন্তু:

সমস্ত প্লাগইনগুলি যেমনভাবে হেড ট্যাগের মধ্যে ফেলে দেওয়া হয় ততক্ষণ আপনি পৃষ্ঠায় ক্লিক করলে বা রিফ্রেশ করার সময় ব্রাউজারটি সর্বদা চালিত হয় না।

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


@ উইল, আপনার সমাধানটি আমার চেয়ে অনেক বেশি পরিষ্কার দেখায় এবং আমি উদ্বেগ প্রকাশ করি যদি আমি আমার ব্যবহার করি তবে আমার কিছু ত্রুটি থাকতে পারে, কারণ এটি অ্যাপেন্ড () ব্যবহার করে। সুতরাং এটি ব্যবহার করতে, আপনি অন্তর্ভুক্ত করতে চান প্রতিটি প্লাগইন ফাইলের জন্য একবার কেবল সেই ফাংশনটি কল করতে পারেন?
rgb_Live
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.