У нас есть приложение Rails, в котором мы включаем зависимости приложений в html-заголовке в application.js
:
//= require jquery
//= require analytics
// other stuff...
Затем на отдельных страницах в нижней части страницы есть тег script для analytics
:
<script>
analytics.track('on that awesome page');
</script>
Это нормально работает, но очень редко мы видим ошибку analytics is not defined
, совсем недавно в Chrome 43. Поскольку все должно быть загружено синхронно, похоже, что это должно работать из коробки, но я изменил script to:
<script>
$(document).ready(function () {
analytics.track('on that awesome page');
});
</script>
А теперь вместо этого каждый раз мы видим $ is not defined
. Мы не видим никаких других ошибок от одного и того же IP-адреса, иначе я бы предположил, что что-то пошло не так в application.js
. Любые другие идеи, почему это может сломаться? Вы можете увидеть пример страницы здесь.
Полный application.js
:
// Polyfills
//= require es5-shim/es5-shim
//= require es5-shim/es5-sham
//= require polyfills
//
// Third party plugins
//= require isMobile/isMobile
//= require jquery
//
//= require jquery.ui.autocomplete
//= require jquery.ui.dialog
//= require jquery.ui.draggable
//= require jquery.ui.droppable
//= require jquery.ui.effect-fade
//= require jquery.ui.effect-slide
//= require jquery.ui.resizable
//= require jquery.ui.tooltip
//
//= require jquery_ujs
//= require underscore
//= require backbone
//= require backbone-sortable-collection
//= require bootstrap
//= require load-image
//= require react
//= require react_ujs
//= require classnames
//= require routie
//= require mathjs
//= require moment
//= require stink-bomb
//= require analytics
//
// Our code
//= require_self
//= require extensions
//= require extend
//= require models
//= require collections
//= require constants
//= require templates
//= require mixins
//= require helpers
//= require singletons
//= require actions
//
//= require object
//= require components
//= require form_filler
//= require campaigns
//= require form_requests
//= require group_wizard
//= require step_adder
Chalk = {};
underscore = _;
_.templateSettings = {
evaluate: /\{\{(.+?)\}\}/g,
interpolate: /\{\{=(.+?)\}\}/g,
escape: /\{\{-(.+?)\}\}/g
};
moment.locale('en', {
calendar: {
lastDay: '[Yesterday at] LT',
sameDay: '[Today at] LT',
nextDay: '[Tomorrow at] LT',
lastWeek: 'dddd [at] LT',
nextWeek: '[Next] dddd [at] LT',
sameElse: 'L LT'
}
});
Update:
Мы все еще видим это на производстве изредка. Мы также видели это в случае, когда мы загружаем script до application.js
, а затем ссылаемся на него:
javascript_include_tag 'mathjs'
javascript_include_tag 'application'
Каждый так часто мы видим ошибку math is not defined
. Мне интересно, произошла ли ошибка при загрузке mathjs
или других скриптов, которые не позволяют загружать ее, но тот факт, что это происходит во многих разных библиотеках и поэтому редко, кажется менее вероятным. Мы проверили некоторые отладочные проверки, чтобы узнать, полностью ли загружена наша application.js
, и она часто не кажется, даже если вы получаете доступ к чему-то вроде JQuery позже на странице.
Одна из причин заключалась в том, чтобы избежать уведомления старых браузеров о запущенных сценариях слишком долго, но мы можем просто отказаться от них и потянуть все это на application.js
, чтобы избежать ошибок.