У нас есть приложение 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, чтобы избежать ошибок.