@import
সিএসএস-এর মতো জাভাস্ক্রিপ্টের মতো কিছু আছে যা আপনাকে অন্য জাভাস্ক্রিপ্ট ফাইলের মধ্যে একটি জাভাস্ক্রিপ্ট ফাইল অন্তর্ভুক্ত করতে দেয়?
script
ট্যাগ ব্যবহার করে প্রয়োজনীয় ফাইলের প্রয়োজনীয়তার আগে কেন আমদানি করা ফাইলটিকে ঘোষণা করা হচ্ছে না ?
@import
সিএসএস-এর মতো জাভাস্ক্রিপ্টের মতো কিছু আছে যা আপনাকে অন্য জাভাস্ক্রিপ্ট ফাইলের মধ্যে একটি জাভাস্ক্রিপ্ট ফাইল অন্তর্ভুক্ত করতে দেয়?
script
ট্যাগ ব্যবহার করে প্রয়োজনীয় ফাইলের প্রয়োজনীয়তার আগে কেন আমদানি করা ফাইলটিকে ঘোষণা করা হচ্ছে না ?
উত্তর:
জাভাস্ক্রিপ্টের পুরানো সংস্করণগুলির কোনও আমদানি, অন্তর্ভুক্ত বা প্রয়োজনীয়তা ছিল না, তাই এই সমস্যাটির জন্য অনেকগুলি ভিন্ন পদ্ধতির বিকাশ করা হয়েছে।
তবে ২০১৫ (ইএস)) এর পরে, জাভাস্ক্রিপ্টের নোড.জেএসে মডিউলগুলি আমদানির জন্য ES6 মডিউলগুলির স্ট্যান্ডার্ড রয়েছে, যা বেশিরভাগ আধুনিক ব্রাউজারগুলি দ্বারা সমর্থিত ।
পুরোনো ব্রাউজারে সাথে সামঞ্জস্যের জন্য, মত বিল্ড সরঞ্জাম Webpack এবং রোলআপ এবং / অথবা মত transpilation সরঞ্জাম হট্টগোল ব্যবহার করা যাবে।
এর নাম 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 মডিউল সরাসরি লোড করার (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 এর গ্রন্থাগার লোড কার্যকারিতা উপলব্ধ এক লাইনে :
$.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;
। সাধারণভাবে জাভাস্ক্রিপ্ট লোড করার বিষয়ে একটি দুর্দান্ত নিবন্ধ রয়েছে যা এটি নিয়ে আলোচনা করে।
এই উত্তরের উপরে উল্লিখিত হিসাবে, অনেক বিকাশকারী তাদের প্রকল্পগুলিতে পার্সেল, ওয়েবপ্যাক, বা ব্যাবেলের মতো বিল্ড / ট্রান্সপিলেশন সরঞ্জাম (গুলি) ব্যবহার করে তাদের আসন্ন জাভাস্ক্রিপ্ট সিনট্যাক্স ব্যবহার করতে, পুরানো ব্রাউজারগুলির জন্য পশ্চাদপদ সামঞ্জস্য সরবরাহ করে, ফাইলগুলি একত্রিত করে, মিনিফাইজ করে, কোড বিভাজন ইত্যাদি সম্পাদন করুন
onreadystatechange
ইভেন্ট এবং readyState
সম্পত্তি) এর জন্য কিছু সংশোধন প্রয়োজন । এছাড়াও, গতিশীল স্ক্রিপ্ট লোড করা ব্রোসওয়ারের প্রিললোড স্ক্যানারগুলির দ্বারা উপকৃত হয় না। এই এইচটিএমএল 5 রকস নিবন্ধটি সুপারিশ করুন: html5rocks.com/en/tutorials/speed/script-loading
যদি কেউ আরও উন্নত কিছু খুঁজছেন, প্রয়োজন জেএসএস ব্যবহার করে দেখুন । আপনি নির্ভরশীলতা পরিচালনা, আরও ভাল সম্মতি, এবং সদৃশতা এড়ানো (যেমন, একাধিকবার স্ক্রিপ্ট পুনরুদ্ধার করা) এর মতো অতিরিক্ত সুবিধা পাবেন।
আপনি আপনার জাভাস্ক্রিপ্ট ফাইলগুলি "মডিউলগুলিতে" লিখতে পারেন এবং তারপরে এগুলি অন্যান্য স্ক্রিপ্টগুলির নির্ভরতা হিসাবে উল্লেখ করতে পারেন। অথবা আপনি প্রয়োজনীয় "সহজ এই স্ক্রিপ্টটি পাবেন" সমাধান হিসাবে প্রয়োজনীয় জেএস ব্যবহার করতে পারেন।
উদাহরণ:
মডিউল হিসাবে নির্ভরতা নির্ধারণ করুন:
কিছু-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
});
গিটহাব পুনরায় পড়া থেকে উদ্ধৃত অংশ:
প্রয়োজনীয় জেএস সহজতর জাভাস্ক্রিপ্ট ফাইলের পাশাপাশি আরও সংজ্ঞায়িত মডিউলগুলি লোড করে। এটি কোনও ওয়েব কর্মী সহ ব্রাউজার ব্যবহারের জন্য অনুকূলিত হয়েছে, তবে এটি জাভা স্ক্রিপ্টের পরিবেশে যেমন রাইনো এবং নোডে ব্যবহার করা যেতে পারে। এটি অ্যাসিনক্রোনাস মডিউল এপিআই প্রয়োগ করে।
মডিউল / ফাইলগুলি লোড করতে প্রয়োজনীয় জেএস সরল স্ক্রিপ্ট ট্যাগগুলি ব্যবহার করে, তাই এটি সহজে ডিবাগিংয়ের জন্য অনুমতি দেওয়া উচিত। এটি বিদ্যমান জাভাস্ক্রিপ্ট ফাইলগুলি লোড করার জন্য সহজভাবে ব্যবহার করা যেতে পারে, সুতরাং আপনি আপনার জাভাস্ক্রিপ্ট ফাইলগুলি আবার না লিখে এটি আপনার বিদ্যমান প্রকল্পে যুক্ত করতে পারেন।
...
একটি জাভাস্ক্রিপ্ট ফাইল লোড করার প্রকৃতপক্ষে একটি উপায় রয়েছে তাত্পর্যপূর্ণ নয় , সুতরাং আপনি নিজের সদ্য লোড হওয়া ফাইলটি অন্তর্ভুক্ত ফাংশনগুলি এটি লোড করার পরেই ব্যবহার করতে পারেন এবং আমি মনে করি এটি সমস্ত ব্রাউজারে কাজ করে।
আপনার পৃষ্ঠার উপাদানটিতে আপনাকে ব্যবহার 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()
ফাংশনটি বলা হয় এবং আপনি সতর্কতা পান।
(এই উত্তরটি ই-সন্তুষ্ট মন্তব্যের জবাবে))
jQuery.getScript
, এইভাবে আপনাকে প্লাগইন লেখার বিষয়ে চিন্তা করতে হবে না ...
"
কোডটি ভেঙে যাবে
আর একটি উপায়, যা আমার মতে অনেক পরিষ্কার, তা হল <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();
async: false
হ্রাস করা হয়েছে। এইটা না! আপনার উদ্ধৃতি হিসাবে বলা হয়েছে, কেবল jqXHR সম্পর্কিত স্টাফ।
আপনার জন্য একটি সুসংবাদ রয়েছে। খুব শীঘ্রই আপনি জাভাস্ক্রিপ্ট কোড সহজেই লোড করতে সক্ষম হবেন। এটি জাভাস্ক্রিপ্ট কোডের মডিউলগুলি আমদানির মানক উপায় হয়ে উঠবে এবং এটি নিজেই মূল জাভাস্ক্রিপ্টের অংশ হবে।
আপনাকে কেবল ফাইল থেকে import cond from 'cond.js';
নামী ম্যাক্রো লোড করতে লিখতে cond
হবে cond.js
।
সুতরাং আপনাকে কোনও জাভাস্ক্রিপ্ট ফ্রেমওয়ার্কের উপর নির্ভর করতে হবে না বা আপনাকে স্পষ্টভাবে অ্যাজাক্স কল করতে হবে না ।
নির্দেশ করে:
গতিশীলভাবে একটি জাভাস্ক্রিপ্ট ট্যাগ তৈরি করা এবং এটি অন্যান্য জাভাস্ক্রিপ্ট কোডের ভিতরে থেকে এইচটিএমএল ডকুমেন্টে যুক্ত করা সম্ভব। এটি লক্ষ্যযুক্ত জাভাস্ক্রিপ্ট ফাইলটি লোড করবে।
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");
js.onload = callback;
বিবৃতি import
ECMAScript 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;
সম্ভবত আপনি এই ফাংশনটি ব্যবহার করতে পারেন যা আমি এই পৃষ্ঠায় পেয়েছি আমি কীভাবে একটি জাভাস্ক্রিপ্ট ফাইলটিতে একটি জাভাস্ক্রিপ্ট ফাইল অন্তর্ভুক্ত করব? :
function include(filename)
{
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.src = filename;
script.type = 'text/javascript';
head.appendChild(script)
}
script.onload = callback;
var
তবে পরিবর্তনশীলটি বিশ্বব্যাপী হবে?
এখানে 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
তার প্রতিক্রিয়াতে শিরোনাম সেট করতে হবে ।
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)
<script>
ট্যাগের মাধ্যমে স্ক্রিপ্ট লোড করতে পারবেন, এটির মাধ্যমে নয় XMLHttpRequest
।
const XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1");
আমি কেবল এই জাভাস্ক্রিপ্ট কোডটি লিখেছি ( ডিওএম ম্যানিপুলেশনের জন্য প্রোটোটাইপ ব্যবহার করে ):
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 ।
ফেসবুক কীভাবে তাদের সর্বব্যাপী লাইক বোতামটির জন্য এটি করে তার সাধারণ সংস্করণ এখানে রয়েছে:
<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/ এ আরও পড়ুন ।
আপনি যদি খাঁটি জাভাস্ক্রিপ্ট চান, আপনি ব্যবহার করতে পারেন document.write
।
document.write('<script src="myscript.js" type="text/javascript"></script>');
আপনি যদি jQuery লাইব্রেরি ব্যবহার করেন তবে আপনি $.getScript
পদ্ধতিটি ব্যবহার করতে পারেন ।
$.getScript("another_script.js");
আপনি পিএইচপি ব্যবহার করে আপনার স্ক্রিপ্টগুলি একত্রিত করতে পারেন :
ফাইল 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
এখানে প্রদর্শিত বেশিরভাগ সমাধান গতিশীল লোড বোঝায়। পরিবর্তে আমি এমন একটি সংকলকটি অনুসন্ধান করছিলাম যা সমস্ত নির্ভরশীল ফাইলগুলিকে একক আউটপুট ফাইলে একত্রিত করে। কম / সাস প্রিপ্রোসেসরগুলির সমান হ'ল সিএসএস @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(){}
}
};
যদি আপনার জাভাস্ক্রিপ্ট ফাইলটি লোড করার অভিপ্রায়টি আমদানিকৃত / অন্তর্ভুক্ত ফাইল থেকে ফাংশনগুলি ব্যবহার করে তবে আপনি একটি বিশ্বব্যাপী অবজেক্টকে সংজ্ঞায়িত করতে পারেন এবং ফাংশনগুলি অবজেক্ট আইটেম হিসাবে সেট করতে পারেন। এই ক্ষেত্রে:
A = {};
A.func1 = function() {
console.log("func1");
}
A.func2 = function() {
console.log("func2");
}
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>
এটি করা উচিত:
xhr = new XMLHttpRequest();
xhr.open("GET", "/soap/ajax/11.0/connection.js", false);
xhr.send();
eval(xhr.responseText);
eval
কি এটা ভুল নয়। থেকে Crockford , " eval
মন্দ। eval
ফাংশন জাভাস্ক্রিপ্ট অধিকাংশ অপব্যয়িত বৈশিষ্ট্য। এটা এড়িয়ে চলুন। eval
উপনাম আছে। ব্যবহার করবেন না Function
কন্সট্রাকটর। স্ট্রিং পাস না setTimeout
বা setInterval
।" আপনি যদি তার "জাভাস্ক্রিপ্ট: দ্য গুড পার্টস" না পড়ে থাকেন তবে বাইরে যান এবং এখনই এটি করুন। আপনি আফসোস করবেন না।
http://web.archive.org/web/20140905044059/http://www.howtocreate.co.uk/operaStuff/userjs/aagmfunctions.js
)
বা রান টাইমে অন্তর্ভুক্ত করার পরিবর্তে, আপলোড করার পূর্বে এক স্ক্রিপ্ট ব্যবহার করুন aten
আমি স্প্রোকেট ব্যবহার করি (অন্য কেউ আছে কিনা তা আমি জানি না)। আপনি নিজের জাভাস্ক্রিপ্ট কোডটি পৃথক ফাইলে তৈরি করেন এবং মন্তব্যগুলি অন্তর্ভুক্ত করে যেমন স্প্রোককেট ইঞ্জিন দ্বারা প্রক্রিয়া করা হয়। বিকাশের জন্য আপনি ক্রমানুসারে ফাইলগুলি অন্তর্ভুক্ত করতে পারেন, তারপরে উত্পাদনের জন্য তাদের মার্জ করতে ...
আরো দেখুন:
আমার একটি সাধারণ সমস্যা ছিল, তবে আমি এই প্রশ্নের প্রতিক্রিয়া দেখে হতবাক হয়েছি।
আমাকে একটি জাভাস্ক্রিপ্ট ফাইল (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 ফাইল দরকার।
<script>
ট্যাগ রয়েছে। এটি সংগঠনের সাথে সহায়তা করতে পারে। এই উত্তরটি প্রশ্নটি যা চেয়েছিল তা নয়, এবং এই প্রসঙ্গে আদর্শ নয়।
আপনি যদি ওয়েব ওয়ার্কার্স ব্যবহার করছেন এবং অতিরিক্ত স্ক্রিপ্টগুলি শ্রমিকের সুযোগে অন্তর্ভুক্ত করতে চান তবে head
ট্যাগে স্ক্রিপ্ট যুক্ত করার বিষয়ে প্রদত্ত অন্যান্য উত্তরগুলি আপনার পক্ষে কাজ করবে না।
সৌভাগ্যক্রমে, ওয়েব ওয়ার্কারদের নিজস্ব importScripts
ফাংশন রয়েছে যা ওয়েব ওয়ার্কারের ক্ষেত্রের একটি বিশ্বব্যাপী ফাংশন, এটি ব্রাউজারের নিজস্ব কারণ এটি নির্দিষ্টকরণের অংশ ।
বিকল্পভাবে, আপনার প্রশ্নের হাইলাইটের দ্বিতীয় সর্বোচ্চ ভোট দেওয়া উত্তর হিসাবে , প্রয়োজনীয় জেএস কোনও ওয়েব কর্মীর ভিতরে স্ক্রিপ্টগুলি সহ হ্যান্ডেল করতে পারে (সম্ভবত importScripts
নিজেকে ডাকা হবে তবে কয়েকটি অন্যান্য দরকারী বৈশিষ্ট্য সহ)।
চেক সহ আধুনিক ভাষায় স্ক্রিপ্টটি ইতিমধ্যে লোড করা হয়েছে কিনা তা হ'ল:
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 => {})
var pi = 3.14
। লোডজেএস () ফাংশনটির মাধ্যমে কল করুনloadJs("pi.js").then(function(){ console.log(pi); });
@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
জাভাস্ক্রিপ্ট ফাইলটি কার্যকর অবস্থায় দেখলাম (মিশ্রণ বয়লারপ্লেটের একটিতে) দেখে এবং এটির দ্বারা কিছুটা বিভ্রান্ত হয়ে পড়েছি ("আপনি এটি করতে পারেন?" আমি নিজেকে ভেবেছিলাম)। তখন আমি বুঝতে পারি যে এটি একটি অ্যাপ্লিকেশন-নির্দিষ্ট ফাইল টাইপ (কিছুটা হতাশার সাথে সম্মত)। তবুও, অঙ্কিত জ্ঞান অন্যদের জন্য সহায়ক হতে পারে।
আপডেট : মিশ্রণ এখন ফ্রি (অফলাইন)।
আপডেট : মিশ্রণ এখন বন্ধ আছে। পুরানো মিশ্রণ প্রকাশগুলি এখনও উপলব্ধ
var js = document.createElement("script");
js.type = "text/javascript";
js.src = jsFilePath;
document.body.appendChild(js);
body
অজানা ক্ষেত্রে ব্যর্থ হবে যখন এখনও বিদ্যমান নেই বা সংশোধন করা যাবে না। এছাড়াও, এটি উত্তরগুলি ব্যাখ্যা করতে সহায়তা করে।
আমার স্বাভাবিক পদ্ধতিটি হ'ল:
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 এর একটি নতুন স্ক্রিপ্ট ট্যাগ তৈরি করে (প্রথমটির পরে)। এটি এটিকে অ্যাসিক্রোনাস মোডে সেট করে তাই এটি বাকী কোডটি ব্লক করে না, তবে রেডিস্টেট (সামগ্রীটির লোড হওয়ার মতো অবস্থা) 'লোড'-এ পরিবর্তিত হলে কলব্যাক দেয়।
যদিও এই উত্তরগুলি দুর্দান্ত, তবে একটি সাধারণ "সমাধান" রয়েছে যা স্ক্রিপ্ট লোড হওয়ার অস্তিত্ব থেকেই রয়েছে এবং এটি বেশিরভাগ লোকের ব্যবহারের 99.999% কে কভার করবে। আপনার যে স্ক্রিপ্টের প্রয়োজন এটি স্ক্রিপ্টের আগে কেবল অন্তর্ভুক্ত করুন। বেশিরভাগ প্রকল্পের জন্য কোন স্ক্রিপ্টগুলি প্রয়োজন এবং কোন ক্রমে এটি নির্ধারণ করতে বেশি সময় লাগে না।
<!DOCTYPE HTML>
<html>
<head>
<script src="script1.js"></script>
<script src="script2.js"></script>
</head>
<body></body>
</html>
যদি স্ক্রিপ্ট 2 এর জন্য স্ক্রিপ্ট 1 প্রয়োজন হয় তবে এটি এর মতো কিছু করার জন্য এটিই সর্বমোট সহজ উপায়। আমি খুব আশ্চর্য হয়েছি যে কেউ এটিকে সামনে এনেছে না, কারণ এটি সর্বাধিক সুস্পষ্ট এবং সহজ উত্তর যা প্রায় প্রতিটি ক্ষেত্রে প্রয়োগ হবে।
আমি একটি সাধারণ মডিউল লিখেছিলাম যা জাভাস্ক্রিপ্টে মডিউল স্ক্রিপ্টগুলি আমদানি / সহ স্বয়ংক্রিয়ভাবে কাজ করে। কোডটির বিশদ ব্যাখ্যার জন্য, জাভাস্ক্রিপ্টের ব্লগ পোস্টটি দেখুন / মডিউলগুলি অন্তর্ভুক্ত / আমদানি / অন্তর্ভুক্ত করুন ।
// ----- 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);
};
এই স্ক্রিপ্টটি অন্য কোনও <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);
})();
রয়েছে 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
পদ্ধতির মতো সুবিধাজনক । এটিতে কিছু উন্নত বৈশিষ্ট্য যেমন শর্তযুক্ত লোডিং, বৈশিষ্ট্য সনাক্তকরণ এবং আরও অনেক কিছু রয়েছে ।
এই প্রশ্নের জন্য অনেক সম্ভাব্য উত্তর আছে। আমার উত্তর অবশ্যই তাদের বেশিরভাগের উপর ভিত্তি করে। সমস্ত উত্তরগুলি পড়ার পরে এটিই আমি শেষ করেছি।
$.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"
});
জাভাস্ক্রিপ্টে মডিউলগুলি প্রয়োগ করার বিভিন্ন উপায় রয়েছে, এখানে দুটি সর্বাধিক জনপ্রিয়:
ব্রাউজারগুলি এখনও এই সংশোধনকারী সিস্টেমটিকে সমর্থন করে না তাই আপনার এই সিনট্যাক্সটি ব্যবহার করার জন্য আপনাকে অবশ্যই ওয়েবপ্যাকের মতো বান্ডিলার ব্যবহার করতে হবে। কোনও বান্ডলার ব্যবহার করা যাই হোক না কেন আরও ভাল কারণ এটি আপনার বিভিন্ন ফাইলগুলিকে একক (বা দম্পতি সম্পর্কিত) ফাইলে একত্রিত করতে পারে। এটি সার্ভার থেকে ক্লায়েন্টের কাছে ফাইলগুলি দ্রুত সরবরাহ করবে কারণ প্রতিটি এইচটিটিপি অনুরোধের সাথে এর সাথে কিছু যুক্ত ওভারহেড রয়েছে। সুতরাং ওভারাল এইচটিটিপি অনুরোধ হ্রাস করে আমরা কর্মক্ষমতা উন্নত করি। এখানে 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
আমি এই প্রশ্নে এসেছি কারণ আমি দরকারী জাভাস্ক্রিপ্ট প্লাগইনগুলির সংগ্রহ বজায় রাখার সহজ উপায় খুঁজছিলাম। এখানে কয়েকটি সমাধান দেখার পরে আমি এটি নিয়ে এসেছি:
"Plugins.js" (বা এক্সটেনশন.জেএস বা আপনি যা চান) নামে একটি ফাইল সেট আপ করুন। আপনার প্লাগইন ফাইলগুলিকে সেই এক মাস্টার ফাইলের সাথে একত্রে রাখুন।
প্লাগইনস.জেএসসের একটি অ্যারে থাকবে 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>');
});
<script src="js/plugins/plugins.js"></script>
কিন্তু:
সমস্ত প্লাগইনগুলি যেমনভাবে হেড ট্যাগের মধ্যে ফেলে দেওয়া হয় ততক্ষণ আপনি পৃষ্ঠায় ক্লিক করলে বা রিফ্রেশ করার সময় ব্রাউজারটি সর্বদা চালিত হয় না।
আমি খুঁজে পেয়েছি এটি আরও নির্ভরযোগ্য একটি পিএইচপি অন্তর্ভুক্ত স্ক্রিপ্ট ট্যাগ লিখুন। আপনাকে কেবল এটি একবার লিখতে হবে এবং এটি জাভাস্ক্রিপ্ট ব্যবহার করে প্লাগইন কল করার মতো কাজ।