Перейти к содержимому


Пользователь месяца
Ixman Ixman 1-й за Октябрь
Очков активности: 693 0 тем, 33 сообщения, 14 баллов репутации
Сайт: o5cat.ru
ТОП самых активных за этот месяц
  • Фотография ShowPrint
    #1

    ShowPrint (ShowPrint.ru)
    Очков активности: 96 Вне конкурса за определение пользователя месяца

  • Фотография yuran
    #2

    yuran (yurbol.ru)
    Очков активности: 82.5 0 тем, 55 сообщений, 1 балл репутации

  • Фотография Ixman
    #3

    Ixman (o5cat.ru)
    Очков активности: 72 Вне конкурса за определение пользователя месяца

  • Фотография BLIK
    #4

    BLIK
    Очков активности: 51 Вне конкурса за определение пользователя месяца

  • Фотография Mandarin
    #5

    Mandarin
    Очков активности: 42 0 тем, 28 сообщений, 1 балл репутации

  • Фотография WGN
    #6

    WGN (worldgamenews.com)
    Очков активности: 39 Вне конкурса за определение пользователя месяца

  • Фотография pozitron123
    #7

    pozitron123
    Очков активности: 31.5 2 темы, 15 сообщений, 1 балл репутации

  • Фотография алексс
    #8

    алексс
    Очков активности: 27 2 темы, 12 сообщений, 1 балл репутации

  • Фотография Scool
    #9

    Scool (stostory.ru)
    Очков активности: 18 3 темы, 3 сообщения, 1 балл репутации

  • Фотография Mariko
    #10

    Mariko
    Очков активности: 16.5 1 тема, 8 сообщений, 1 балл репутации

  • Показать весь ТОП 10
Поддержите форум! =)
Апдейты
  • Яндекс ИКС: 31.10.2018
  • Яндекс выдача: 15.11.2018
Топ 5 участников по репутации


Область видимости функций JS

#1 ShowPrint

ShowPrint
  • Пользователь PRO
  • 3072 сообщений
  • Репутация: 844
0

Отправлено 05 December 2017 - 17:54

Hi, all!

 

Продолжая изобретения велосипедов знакомлюсь всё с новыми и новыми особенностями JS и ему подобных.

Столкнулся с проблемами связанными с областью видимости функций внутри скриптов.

 

У меня для каждой страницы получается два файла скриптов: первый - общий для всех, второй - индивидуальный для страницы.

Собственно чтоб не грузить лишнего и не раздувать в размере "общий".

Получается что "общий" при переходе со страницы на страницу грузится из кеша и догружает небольшой "индивидуальный".

"Общий", дабы быстрее выдать страницу посетителю, отрабатывают по событию document.ready

 

Условно "общий" скрипт следующего вида:

$(document).ready(function(){ // ждём окончания загрузки страницы
  var ... // переменные
  function myFunc(){...} // ряд пользовательских функций и операций
  $.ajax({
    url:'/script/local.js', // загрузка "индивидуального" скрипта
    cache:true,
    dataType:'script',
    success:function(){
      // после загрузки производим всякие манипуляции
    }
  });
});

Ну и "индивидуальные" скрипты совершенно обычные - какие-то манипуляции, навешивание и обработка событий и прочая лабуда.

 

Гимор заключается в следующем:

Периодически в "индивидуальных" скриптах приходится использовать пользовательские функции, созданные в "общем" скрипте (myFunc из примера), а эти функции получаются невидимыми в подгружаемых скриптах. То есть в них 

alert(typeof(myFunc));

 выдает результат undefined

 

Методом тыка и экспериментов нашел два варианта решения проблемы:

  1. из "основного" скрипта убрать первую строку ( $(document).ready(function(){...}); ), но это откладывает отсрочку события окончания загрузки страницы, что не очень-то греет душу (
  2. в "индивидуальном" скрипте продублировать функцию, что и увеличивает размер скрипта, и как-то неправильно.

В общем, оба найденных варианта получаются как-то не по феншую  :(

 

Собственно вопрос: есть-ли какие-то варианты более изящного решения?

Логически предполагаю, что должно быть какое-то решение, либо в виде сделать "функцию myFunc глобальной" - видимой во всех подгружаемых (индивидуальных) скриптах, либо возможность передачи функции подгружаемым скриптам в виде объекта.

 

Прошу содействия в виде подсказки или ссылки где поискать и что почитать (желательно с примерами). Может хоть правильное название какого-нибудь правильного слова которое можно загуглить... Кто-чем может, плз...

Оффтопик


 

 

  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#2 Ixman

Ixman
  • Пользователь PRO
  • 2939 сообщений
  • Репутация: 766

Отправлено 05 December 2017 - 19:41

Михаил, не знаю в тему или нет, но может стоит потыкать так. Так как у меня ощущение такое, что индивидуальный загружается раньше общего и из-за этого не видит общих функций. Нэ?


  • 0


#3 fedornabilkin

fedornabilkin
  • Модератор
  • 1132 сообщений
  • Репутация: 193

Отправлено 05 December 2017 - 20:06

Правильное название правильного слова - LexicalEnvironment или лексическое окружение.
Если ты используешь document.ready, то аргументом передаешь в него анонимную функцию.

$(document).ready(function(){var foo; myFunc(){}});

Тоже самое, только по полочкам:

var other = readyFunc(){
    var foo;
    myFunc(){};
};
$.document.ready(other);

Так вот у myFunc() свое лексическое окружение, которое не выходит за рамки readyFunc().

Тоже самое происходит, когда ты грузишь свои скрипты аяксом (если честно, странноватое решение). Я не думаю, что у тебя гигантский проект и возникает необходимость догружать апосля. При чем обычно скриптовые файлы кэшируются браузерами и запрос на сервер не отправляется. Как правило, скрипты подключаются в конце страницы, чтобы не мешать отрисовке.

 

Так вот $.ajax() принимает объект, в котором success присваиваем анонимную функцию для получения ответа от сервера. Следовательно все твои индивидуальные видны внутри анонимной функции.

 

Один из вариантов решения (сам не пробовал).

В общем файле создаешь объект с необходимыми функциями и потом верти ими как хочешь, главное правильно начать. Запустишь, посмотри логи.

var myGlobalFunctions = function(){
    var cache = {}; // для каждого экземпляра своя переменная (замыкания - это отсюда начинаются)
    return {
        first: function(arg, varg){
            return arg + varg;
        },
        second: function(iname, fname){
            return 'Привет, ' +iname+ ' ' +fname;
        },
        setCache: function(key, val){
            cache[key] = val;
        },
        getCache: function(key){
            if(!key){
                return cache;
            }
            return typeof cache['key'] !== "undefined" ? cache['key']: null;
        }
    };
};
$(document).ready(function(){
    var myLocalFunc = myGlobalFunctions(); // получаем в переменную список функций
    var res_second_func = myLocalFunc.second('Имя', 'Фамилия'); // вызываем необходимую функцию
    console.log('second', res_second_func); // зырим, что получилось
    // сохраним значение в кэш
    myLocalFunc.setCache('name', 'Имя');
    // позырим, что в кэше
    console.log('myLocalFunc', myLocalFunc.getCache());
    // можно создать второй комплект (он совершенно новый и с чистым кэшем)
    // с таким же набором функций и передать его куда угодно или использовать по своему усмотрению
    var yourLocalFunc = myGlobalFunctions();
    // кэш пустой
    console.log('yourLocalFunc', yourLocalFunc.getCache());
    // шлем аякс и внутрях видим переменную myLocalFunc,
    // потому что она глобальна в пределах анонимной функции document ready
    // $.ajax({
    //     url:'/script/local.js', // загрузка "индивидуального" скрипта
    //     cache:true,
    //     dataType:'script',
    //     success:function(){
    //         // после загрузки производим всякие манипуляции
    //         // myLocalFunc тут доступна
    //     }
    // });
});

Самое главное стараться не писать таких функций, которые вызывают себе подобных, чтобы память не утекала. На обычных страница это не особо критично, но к плохому быстро привыкаешь.


  • 1

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#4 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3072 сообщений
  • Репутация: 844

Отправлено 05 December 2017 - 21:04

у меня ощущение такое, что индивидуальный загружается раньше общего

Иван, я так не думаю...  :( (учебник по ссылке: "настольная книга" - всегда открыт в отдельной вкладке браузера, также как форум  :D )

 

 

Из "эйчтиэмэля" общий скрипт гружу также аяксом в асинхроне:

<script>
  $.ajax({url:'/script/main.js',cache:true,dataType:'script'});
</script>

"Локальный", в случае необходимости, грузит основной также асинхроном (насколько я понимаю - образно говоря параллельным потоком), но уже после объявления пользовательской функции, которая является уже созданным объектом.

Пробовал переделать объявление функции через var - не помогло, результат тот же...

 

"Не думаю", т.к. не понимаю следующей логики - когда скрипт выполняется без ожидания окончания загрузки дерева DOM, то он работает... Здесь что-то с "видимостью" не так...

 

О... Аха... Вот и Федор написал умных слов!!!...

 

 

Правильное название правильного слова - LexicalEnvironment или лексическое окружение.

Значит правильные слова я нашёл верно, про лексическое окружение и читал... Не до конца сложилось в голове понимание, но с твоим примером буду пробовать колдовать и сложить аккуратный стог в голове, чтоб не торчало в разные стороны...

 

 

 

у myFunc() свое лексическое окружение, которое не выходит за рамки readyFunc()

То есть содержимое local.js не видит лексического окружения в котором создана myFunc даже не смотря на то, что этот local.js загружен тем самым лексическим окружением? Так?

 

 

Получается, что если я съел конфетку - она еще не стала частью меня самого? В этом ошибка? Если да, то как-то неправильно получается: я же не стырил конфетку, я её достал из своего же кармана...  :(

 

Я вычитал вот это (по ссылке выше)


 

Интерпретатор, при доступе к переменной, сначала пытается найти переменную в текущем LexicalEnvironment, а затем, если её нет – ищет во внешнем объекте переменных. В данном случае им является window.

Такой порядок поиска возможен благодаря тому, что ссылка на внешний объект переменных хранится в специальном внутреннем свойстве функции, которое называется [[Scope]]. Это свойство закрыто от прямого доступа, но знание о нём очень важно для понимания того, как работает JavaScript.

При создании функция получает скрытое свойство [[Scope]], которое ссылается на лексическое окружение, в котором она была создана.

Просто я решил, что если в лексическом окружении local.js не нашлось myFunc, то он найдёт её "во внешнем объекте переменных", то бишь "внешним" я посчитал основной скрипт...

 

Буду пробовать разбираться с предложенным вариантом решения, это вполне понятный пример. Если бы я насерфил такой, то не было бы топика, но увы...

 

Сразу после беглого просмотра и осмысления вопрос: правильно я понимаю, что функции setCache и getCache типа "отладочные" и нужны для проверки работоспособности? (в смысле "после отладки можно удалить безболезненно?")

 

@fedornabilkin, гранд-мерси за пример!!!  :smile-thumb-up:

 

Оффтопик


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#5 fedornabilkin

fedornabilkin
  • Модератор
  • 1132 сообщений
  • Репутация: 193

Отправлено 06 December 2017 - 09:27

Сразу после беглого просмотра и осмысления вопрос: правильно я понимаю, что функции setCache и getCache типа "отладочные" и нужны для проверки работоспособности? (в смысле "после отладки можно удалить безболезненно?")

Да нет, они вполне себе самые обычные функции, которые можно использовать для записи и получения данных. Но, если нет им применения, то можно и удалить.

 

С конфетой все правильно, только сложность в том, что ты ее можешь достать только из одного кармана. Из других карманов конфета будет недоступна. А когда ты ее съел (передал в переменной), то она уже доступна для всего организма.

Просто я решил, что если в лексическом окружении local.js не нашлось myFunc, то он найдёт её "во внешнем объекте переменных", то бишь "внешним" я посчитал основной скрипт...

Так и есть, искать будет во внешнем, но ее там нет, потому что она внутрях другой функции. Пришел в магаз и не нашел конфету на локальном прилавке. Логично, что конфету надо искать во внешнем складе, а не на соседнем локальном прилавке. 


  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#6 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3072 сообщений
  • Репутация: 844

Отправлено 06 December 2017 - 15:22

но ее там нет, потому что она внутрях другой функции
Именно поэтому называется "замыкание"? потому что нет связи "родитель-потомок"? если инициировал загрузку, то это не означает что загружено будет в лексическое окружение инициатора?

Оффтопик

 

Федор, а есть в природе варианты явяскриптом подтянуть внешний скрипт в своё же лексическое окружение? может не через $.ajax и не через $.getScript - на самом деле после того как я основной запускаю по окончанию загрузки DOM и в асинхроне, то пофиг как он будет подтягиваться - всяко получится асинхрон... какой-нить вариант типа пыховой include/require?

 

Я просто рассматривая всякие js скрипты обращал внимание на то, что встречаются вещи типа объявления функций взятые в скобки (инкапсуляция?) или ещё объявление начинающееся с восклицательного знака...

Или это всё уже из совершенно другой оперы и не стоит мне как любителю лезть настолько глубоко?


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#7 fedornabilkin

fedornabilkin
  • Модератор
  • 1132 сообщений
  • Репутация: 193

Отправлено 06 December 2017 - 22:13

Я сейчас не совсем понял. Если хочешь использовать функции из общего файла в индивидуальном, то я написал пример. По идее должно работать. Если хочешь использовать функции из индивидуального файла в общем, то скорее всего что-то тут не так. Хотя есть еще колбэки (функции обратного вызова). Когда индивидуальный загрузится, то в колбэк передаешь функции индивидуального файла и пользуешься ими в общем. Соответственно все использование произойдет после загрузки. Такой вариант очень плохой, потому что быстро запутаешься.

Если я тебя не понял, напиши на пальцах, где какие функции и когда ты их хочешь использовать.


  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#8 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3072 сообщений
  • Репутация: 844

Отправлено 06 December 2017 - 22:33

Я сейчас не совсем понял

Неее... Всё понял правильно и еще раз спасибо за помощь!

Просто я не понимаю логики почему общий скрипт инициируя загрузку индивидуального не подтягивает его в своё лексическое окружение.

Но видимо такова была задумка создателей JS и они руководствовались какими-то соображениями при этом. Соответственно самым правильным ответом на моё "почему" будет "потому что так"  :)

 

Я полез "в дебри" и пытаться разобраться с остальным. Видимо не даёт мне покоя отсутствие понимания принципа работы которое встречаю в виде функций обёрнутых в скобки. Вот и сейчас разглядываю, разбираюсь и пытаюсь понять одну из плюшек по ссылке на блог, которую "подкинул" Иван (тынц), вижу аналогичное обёртывание в коде с частью jQuery и наступает "бамц" (отсутствие понимания)

 

Забей... Буду реализовывать предложенный тобой вариант. Это так просто - не люблю тупо копипастить, предпочитаю понимать что делает код который я ставлю на сайт )))

 

UPD

а есть в природе варианты явяскриптом подтянуть внешний скрипт в своё же лексическое окружение ... какой-нить вариант типа пыховой include/require?

"На пальцах": имел в виду какой-то вариант чтоб интерпретатор начал заполнение лексического окружения, потом загрузил что нужно (в моём случае "индивидуальный" скрипт и потом продолжил формирование лексического окружения уже с этим загруженным скриптом  :D

 

Предвижу ответ "Много хочешь, мы не ищем лёгких путей"  :lol:


Сообщение отредактировал ShowPrint: 06 December 2017 - 23:56

  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#9 fedornabilkin

fedornabilkin
  • Модератор
  • 1132 сообщений
  • Репутация: 193

Отправлено 07 December 2017 - 14:39

$.ajax это самостоятельная функция и у нее есть еще success, тоже самостоятельная функция. Когда грузишь скрипт, он появляется на два уровня ниже твоего общего лексического окружения. Поэтому ты не видишь функции индивидуального скрипта в общем окружении.

Пыховый include/require это вот твоя подгрузка ajax. Если хочешь заполнять лексическое окружение, вероятно, тебе подойдет прототипное наследование. Я такой подход использовал в SAR.


До сих пор сомневаюсь в целесообразности подгрузки скриптов ajax'ом. Не на то тратишь драгоценное время.


  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#10 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3072 сообщений
  • Репутация: 844

Отправлено 07 December 2017 - 14:42

@fedornabilkin, большое спасибо, более-менее осознал, бум дальше разбираться! =)


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#11 Ixman

Ixman
  • Пользователь PRO
  • 2939 сообщений
  • Репутация: 766

Отправлено 08 December 2017 - 14:33

Немножко не в тему, но там же как-то можно скрипты вставлять не аяксом, я делал такое для рекаптчи и модальных окон. Счас гляну

function loadJavaScript(urls) {
    urls.forEach(function(url, i) {
        var script = document.createElement('script');
        script.src = url;
        document.head.appendChild(script);
    });
}

Мне думается так намного быстрее, нежели совершать аякс запрос. Кстати вродь на старых браузерах этот подход не работает.

 

Да я таким методом подгружал нужные скрипты при открытии модальных окон, которые использовались только в модальных окнах. Окон было много и поэтому чтобы не захламлять страницы не всегда нужными скриптами я в сети нашёл такой вариант и использовал его 


  • 1


#12 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3072 сообщений
  • Репутация: 844

Отправлено 08 December 2017 - 15:01

можно скрипты вставлять не аяксом
Иван, есть такой способ. Я им тоже пользуюсь, т.к. гружу все скрипты "на хвосте", перед </html> а в некоторых случаях (например скрипт ВК с использованием document.write) когда вывод нужен в середине страницы использую аналогичный вариант (appendChild в нужный див).

 

Не понимаю до конца в какое из лексических окружений такой скрипт попадёт, поэтому поставил в планы проверить, а вдруг это и окажется тот самый "аналог include/require"  :)


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#13 Ixman

Ixman
  • Пользователь PRO
  • 2939 сообщений
  • Репутация: 766

Отправлено 08 December 2017 - 15:13

@ShowPrint, напишешь о результатах. Такие темы интересны. Бывает сам попадаю в такие ситуации, где не хватает знаний.


  • 0


#14 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3072 сообщений
  • Репутация: 844

Отправлено 08 December 2017 - 15:22

@Ixman, конечно, без проблем (если одолею).

Оффтопик


  • 1
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#15 fedornabilkin

fedornabilkin
  • Модератор
  • 1132 сообщений
  • Репутация: 193

Отправлено 08 December 2017 - 16:27

Может я что-то не понимаю, но какая разница как грузить скрипт? Хоть аяксом, хоть src, все равно ведь браузер делает запрос на сервер, чтобы получить документ. Я глубоко убежден, что один запрос лучше, чем два запроса или больше. Другое дело, если дополнительный скрипт много весит и не везде используется. Обычно любительские сайты вряд ли могут содержать столько скриптов, чтобы была необходимость грузить их по-отдельности. При всем при этом, если скрипт минифицировать и на сервере включено сжатие gzip, то разделять на файлы выглядит сомнительной затеей.

Посмотрел сейчас на этом сайте. jQuery минифицированный файл весит 82кб и грузится за 160 миллисекунд.@ShowPrint, сколько весят твои дополнительные скрипты вместе с общим без минификации?


  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#16 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3072 сообщений
  • Репутация: 844

Отправлено 08 December 2017 - 16:49

сколько весят твои дополнительные скрипты вместе с общим без минификации?

Общий 30к, индивидуальные от 1к до 10к.

 

 

@fedornabilkin, возможно ты и прав, но моё сознание против того чтоб грузить то, что

не везде используется

 

Ну не могу я перебороть свой перфекционизм, также как не могу отказать себе в удовольствии видеть в плагине Alexa картинку

Untitled-1.png

Ну вот не жалко мне тратить на это время - меня это больше вдохновляет, чем просмотр по зомбоящику футбола с пивом и чипсами.

 

Понятно что "в каждой избушке - свои погремушки", и у каждого свои тараканы... Но мои ведь такие безобидные и даже милые  :rolleyes:


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#17 fedornabilkin

fedornabilkin
  • Модератор
  • 1132 сообщений
  • Репутация: 193

Отправлено 08 December 2017 - 17:10

видеть в плагине Alexa картинку

Я полностью согласен с тобой в этом плане. Сам такой и стараюсь досконально во всем разобраться. А теперь скажи мне ответы:

  1. Твой сервер позволяет кэшировать js-файлы?
  2. Включено сжатие файлов?
  3. Пробовал ли ты сжимать файлы jsCompress'ом?

Сравнивал время загрузки одного файла, в котором все скрипты и нескольких файлов? Скажем один файл загружается за 100 мс, А два файла загружаются за 80 мс и 80 мс соответственно. Или может быть Один файл будет грузиться за 100 мс, а два других за 120 мс и 20 мс?

Один файл - это все скрипты в одном месте.


  • 0

Надо обсудить предложение. А тут знакосчиталка считает знаки. Про Yii2 написано.



#18 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3072 сообщений
  • Репутация: 844

Отправлено 08 December 2017 - 17:50

Твой сервер позволяет кэшировать js-файлы?
В серверных делах и настройках я полный ноль, поэтому точно не знаю. Но на хостинге стараюсь не экономить, отдавая предпочтение стабильности, а не цене.

В свете оного не уверен, но думаю что да (сижу не Бегете).

 

Включено сжатие файлов?
Да

 

Пробовал ли ты сжимать файлы jsCompress'ом?
На сервере у меня минимизированные файлы:
  • скрипты сначала минимизирую ручками, потом компрессором, потом ещё поправляю (в случае необходимости) ручками;
  • css я минимизирую ручками лучше любого компрессора (затратно по времени, но... перфекционизм...)

 

Сравнивал время загрузки одного файла, в котором все скрипты и нескольких файлов? Скажем один файл загружается за 100 мс, А два файла загружаются за 80 мс и 80 мс соответственно. Или может быть Один файл будет грузиться за 100 мс, а два других за 120 мс и 20 мс?
Если честно - нет. Когда брался за переделку сайта "на берегу" понял, что на многих страницах надо будет использовать индивидуальные скрипты (и стили) и сразу стал отделять "мух от котлет".

Навскидку (ориентировочно) с вероятностью 90% могу оценить что если я соберу все локальные скрипты в один, то весить он будет не 30, а 250к.

 

Ещё я учитываю тот факт, что я постоянно делаю что-то со страницами, дорабатываю их (в том числе и скрипты), соответственно:

  • мне проще и быстрее лазить по небольшим "индивидуальным", нежели по "простыне"
  • при "локальных" изменениях у постоянных посетителей грузятся только "индивидуальные", а "основной" - из кеша

 

Оффтопик


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#19 ShowPrint

ShowPrint
    Topic Starter
  • Пользователь PRO
  • 3072 сообщений
  • Репутация: 844

Отправлено 12 December 2017 - 20:36

напишешь о результатах. Такие темы интересны
Выкроил немного времени, попробовал приведенный вариант. Результат: скрипт грузится и работает, но в своё лексическое окружение, то есть те переменные и функции которые в другом скрипте, обёрнутом в document.ready в загружаемом скрипте не видны (как и говорил Федор ранее).

 

Если обёртку снимаешь, то видны и переменные и функции, но главный скрипт при этом грузится не дожидаясь document.ready

В принципе ровно такая же ситуация была и когда снимал обёртку и грузил локальный скрипт через $.ajax или $.getScript

То есть в принципе результат идентичен.

 

В принципе так скрипты грузить можно, но только те, которые являются самостоятельными", то есть не используют переменных и функций со своим лексическим окружением.

Хотя вообще не вижу смысла добавления таким образом скриптов именно в head - зачем? Ведь раньше чем он загрузится он работать не начнёт, хоть он грузится в head, хоть в текущее место (при этом не тратятся ресурсы на перенос).

Сам вариант с appendChild использую только догружая вспомогательные css-стили к основным (из-за дисциплины: место для стилей внутри тега style) и для того чтоб в нужное место (не в head) поставить один скрипт, использующий document.write (если не изменяет память, то это вк-виджет какой-то).

 

Раньше в head переносил г-аналитику и я-метрику которую загружаю в хвосте, но придя к пониманию "раньше чем он загрузится он работать не начнёт" - перестал это делать. Тем паче что в переписке с Платонами выяснилось, что метрика - это инструмент для вебмастера, а данные для ранжирования берутся из внутренних источников. Ранжируются же сайты у которых я-метрика вообще не установлена  ;)

 

Вот: доклад окончен  :)


  • 0
MasterWEBS: третий дом - моё хобби и увлечение... Второй дом: работа - не меньше 12 часов в день...
Первый дом - под охраной: "Осторожно - злая жена!" (дрессировалась долго и надёжно) /*ссылку не просите - не дам!*/


#20 Ixman

Ixman
  • Пользователь PRO
  • 2939 сообщений
  • Репутация: 766

Отправлено 12 December 2017 - 21:37

@ShowPrint, благодарю за информацию. Походу я сегодня столкнулся с точно такой же проблемой ((


  • 0


robot

robot
  • Пользователь PRO
  • 2652 сообщений
  • Репутация: 85


Похожие темы

  Название темы Автор Статистика Последнее сообщение

Оформление форума – IPBSkins.ru