ФорумПрограммированиеJavaScript → Слияние скриптов в один файл

Слияние скриптов в один файл

  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Окт. 23, 2014, 5:04 д.п.

    Ситуация: в html прописаны до 8 тегов script с src. Решил объединить их в один файл чтобы уменьшить количество запросов к серверу. Однако, скрипты перестали работать.
    Посмотрел, оказалось, что jquery выполнена в виде самовыполняющейся функции. Если запихать в один js-файл библиотеку jquery и зависящий от неё код - то произойдёт следующее:
    (function(){ /* тут код jQuery */ });

    $(function(){ /* тут мой jQuery-зависящий код */});

    либо
    (function(){ /* тут код jQuery */ });

    eval(function(p,a,c,k,e,r){ /* тут плагин Datepicker */ });

    И валятся ошибки
    $(…) is not a function

    либо
    undefined(…) is not a function


    Вопрос: как корректно объединить все скрипты в один файл?
    не всё полезно, что в swap полезло
  • ssbb

    Сообщения: 86 Репутация: N Группа: Джедаи

    Spritz Окт. 23, 2014, 9:05 д.п., спустя 4 часа 1 минуту 37 секунд

    Вообще я бы советовал использовать AMD. Но если нужно просто склеить, то вышеописанный код в принципе правильный, за исключением, что обертка вокруг jquery и других либ должна выполняться. Получится что-то вроде:

    (function(window){ /* тут код jQuery */ })(window);

    $(function(){ /* тут мой jQuery-зависящий код */});
    ex. adwo/ad3w @ Philippines, Dumaguete
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz Окт. 23, 2014, 9:29 д.п., спустя 23 минуты 55 секунд

    ну и можно использовать сборщики а ля grunt/gulp

  • ssbb

    Сообщения: 86 Репутация: N Группа: Джедаи

    Spritz Окт. 23, 2014, 12:41 п.п., спустя 3 часа 11 минут 45 секунд

    ну и можно использовать сборщики а ля grunt/gulp

    @Sinkler, смотря на чем проект. а кто-то делает руками оО? :D
    ex. adwo/ad3w @ Philippines, Dumaguete
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz Окт. 23, 2014, 12:47 п.п., спустя 5 минут 58 секунд

    ну сборщики обычно оборачивают в нужный контекст) поэтому я и предположил, что в данной теме это руками делалось)

  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Окт. 24, 2014, 12:05 д.п., спустя 11 часов 17 минут 39 секунд

    я бы советовал использовать AMD

    Возможно с ним и удобнее, но у меня легаси-код такого вида
    <script src="jquery.js"></script>
    <script src="jquery.plugin1.js"></script>
    <script src="tinymce.js"></script>
    <script src="mylib1.js"></script>
    <script src="mylib2.js"></script>

    <script>
    tinyMCE.init(…)
    $('#some_div').hide()

    </script>

    Кода написано прилично, переписывать и тестировать не хочу. Думал просто запихаю всё в один файл - и всё заработает. Оказалось, что нет.
    за исключением, что обертка вокруг jquery и других либ должна выполняться

    да, он выполняется, я просто по памяти писал примеры.

    Спустя 157 сек.

    @Sinkler, нет, не руками, просто добавил в скрипте join("\n", array_map(file_get_content(), $scripts))
    не всё полезно, что в swap полезло
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Окт. 24, 2014, 2:55 д.п., спустя 2 часа 50 минут 37 секунд

    Выяснил, почему валится tinyMCE.
    В копилку говнокода.

    В нём есть вот такой участок кода

    		function getBase(n) {
    if (n.src && /tiny_mce(|_dev|_src|_gzip|_jquery|_prototype).js/.test(n.src)) {
    if (/_(src|dev)\.js/g.test(n.src))
    t.suffix = '_src';

    if ((p = n.src.indexOf('?')) != -1)
    t.query = n.src.substring(p + 1);

    t.baseURL = n.src.substring(0, n.src.lastIndexOf('/'));

    // If path to script is relative and a base href was found add that one infront
    if (base && t.baseURL.indexOf('://') == -1)
    t.baseURL = base + t.baseURL;

    return t.baseURL;
    }

    return null;
    };

    // Check document
    nl = d.getElementsByTagName('script');
    for (i=0; i<nl.length; i++) {
    if (getBase(nl))
    return;
    }

    // Check head
    n = d.getElementsByTagName('head')[0];
    if (n) {
    nl = n.getElementsByTagName('script');
    for (i=0; i<nl.length; i++) {
    if (getBase(nl))
    return;
    }
    }

    То есть, он при инициализации проверяет, есть ли среди включенных скриптов файл /tiny_mce(|_dev|_src|_gzip|_jquery|_prototype).js/ и если нет - возвращает nil вместо объекта. В дальнейшем скрипт не находит нужных методов и валится.

    Спустя 170 сек.

    В общем, я наверное откажусь от идеи объединять скрипты, ну его нахуй. Выставлю просто кэширование на месяц.
    не всё полезно, что в swap полезло
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz Окт. 24, 2014, 12:53 п.п., спустя 9 часов 57 минут 46 секунд

    То есть, он при инициализации проверяет, есть ли среди включенных скриптов
    файл /tiny_mce(|_dev|_src|_gzip|_jquery|_prototype).js/ и если нет -
    возвращает nil вместо объекта. В дальнейшем скрипт не находит нужных методов и
    валится.

    @master, мудаки...

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Окт. 24, 2014, 12:58 п.п., спустя 4 минуты 38 секунд

    @adw0rd, учитывая, что я использую варезный платный аплоад-плагин для tinyMCE - мы с ними в расчёте =)
    не всё полезно, что в swap полезло
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Окт. 24, 2014, 1:27 п.п., спустя 28 минут 55 секунд

    @adw0rd, учитывая, что я использую варезный платный аплоад-плагин для tinyMCE - мы с ними в расчёте =)

    @master, ахахахах :D

    Сапожник без сапог
  • chiefinthesky

    Сообщения: 2 Репутация: N Группа: Кто попало

    Spritz Окт. 25, 2014, 12:50 п.п., спустя 23 часа 23 минуты 24 секунды

    @master, чувак, это же джумла, ты весь контент говнокодру можешь посмотреть в исходниках плагинов к ней.
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz Окт. 25, 2014, 12:53 п.п., спустя 2 минуты 56 секунд

    @chiefinthesky, это не джумла
    не всё полезно, что в swap полезло
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz Окт. 25, 2014, 6 п.п., спустя 5 часов 6 минут 48 секунд

    ))))))))))

    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • ssbb

    Сообщения: 86 Репутация: N Группа: Джедаи

    Spritz Окт. 25, 2014, 8:30 п.п., спустя 2 часа 30 минут 32 секунды

    Хотел сумничать, а не вышло =/
    ex. adwo/ad3w @ Philippines, Dumaguete

Пожалуйста, авторизуйтесь, чтобы написать комментарий!