Я заметил много ошибок в Sentry со следующей трассировкой стека:
TypeError: undefined is not an object (evaluating 't.__esModule')
at isESModule(./node_modules/vue-router/dist/vue-router.esm.js:1955:3)
at ? (./node_modules/vue-router/dist/vue-router.esm.js:1882:27)
at promiseReactionJob([native code])
У меня много проблем с воспроизведением ошибки и выяснением ее причин. Глядя на источник vue-router, он исходит из этой функции:
function isESModule (obj) {
return obj.__esModule || (hasSymbol && obj[Symbol.toStringTag] === 'Module')
}
Итак, obj
не определено. Если мы поднимемся на один уровень вверх, мы получим эту функцию:
function resolveAsyncComponents (matched) {
return function (to, from, next) {
var hasAsync = false;
var pending = 0;
var error = null;
flatMapComponents(matched, function (def, _, match, key) {
// if it's a function and doesn't have cid attached,
// assume it's an async component resolve function.
// we are not using Vue's default async resolving mechanism because
// we want to halt the navigation until the incoming component has been
// resolved.
if (typeof def === 'function' && def.cid === undefined) {
hasAsync = true;
pending++;
var resolve = once(function (resolvedDef) {
if (isESModule(resolvedDef)) {
resolvedDef = resolvedDef.default;
}
// save resolved on async factory in case it's used elsewhere
def.resolved = typeof resolvedDef === 'function'
? resolvedDef
: _Vue.extend(resolvedDef);
match.components[key] = resolvedDef;
pending--;
if (pending <= 0) {
next();
}
});
...
Так что похоже, что resolvedDef
не определено.
Я предполагаю, что маршрутизатор Vue успешно разрешает асинхронный компонент, но в конечном итоге он оказывается неопределенным, и в коде нет ничего, что могло бы объяснить этот случай.
Я использую vue-router 3.1.3, и эти ошибки всегда возникают только на iOS (Safari или Chrome).
Я попытался погуглить ошибку, и я не могу найти ни одной ссылки на нее где-либо еще. Я также не могу опубликовать проблему на Github vue-router, потому что я не могу предоставить минимальное воспроизведение.
Часто (но не всегда) Sentry также показывает этот журнал консоли, предшествующий ошибке:
console [vue-analytics] An error occured! Please check your connection or disable your AD blocker
logger console
extra {"arguments":["[vue-analytics] An error occured! Please check your connection or disable your AD blocker"]}
Хотя я не уверен, что это связано.
Одно сумасшедшее решение, о котором я думаю, — это развертывание исправленной версии vue-router, где она выдает ошибку с более полезным контекстом в случае, когда resolvedDef
не определено. Мы надеемся, что эта ошибка попадет в наши журналы Sentry.
Что вызывает эту ошибку?