Я попробовал массу чеков. Это определенно аномалия. У меня есть служба Angular 2, которая загружает определение @type
(машинописный текст 2), который, в свою очередь, загружает модуль commmon.js ( visionmedia / debug ). Внутри модуля common.js у меня есть простая инструкция if, которая вызывает ошибку, даже если условие является ложным, а код не должен выполняться. Угловое приложение использует system.js
для загрузки модhive.
Обычный код if (false) { console.log('This code is not executed') }
Нормальное поведение, ничего не происходит
Код аномалии: if (false) { exports.humanize = require('ms'); }
if (false) { exports.humanize = require('ms'); }
Он вызывает ошибку: zone.js:101 GET http://localhost:8002/ms.js 404 (Not Found)
Сама ошибка действительна. Действительно, этот сценарий не найден. Глубоко неправильно то, что оно не должно появляться в первую очередь. Он должен быть заблокирован условием false if. Мне кажется, что zone.js
каким-то образом анализирует инструкцию, даже если случай ложный. Что я могу сделать, чтобы этого избежать? Мне нужно проверить, требуется ли для того или иного пути, если тот же скрипт вызывается на сервере или на интерфейсе.
Большее изображение внутри модуля CJS:
// Trying to detect if environment is node.js // In backend (no zones) everything works as expected // In frontend, the require('ms') statement is executed event if condition is false. // I checked manually if process is defined, it's not. // Event the basic `false` condition also fails to block code. if (typeof process === 'undefined') { exports.humanize = require('node_modules/ms/index.js'); console.log('Browser'); } else { exports.humanize = require('ms'); // If I comment this code works as intended console.log('Node'); }
Вы используете systemjs? У меня была аналогичная ситуация с import-statement в многострочных комментариях. SystemJS использует регулярное выражение для обнаружения операторов импорта. Возможно, он использует тот же подход для обнаружения экспортных заявлений.
Это не проблема в zone.js, так как zonejs просто выполняет задачи. Сама задача запускается где-то в другом месте.
EDIT (ответьте на комментарий):
Я не думаю, что вы должны условно выполнять экспортные заявления.
Может быть, это помогает:
var myExport; var myRequired; if (something) { myExport = function() { console.log('exported this'); }; myRequired = require('something'); } else { myExport = function() { console.log('exported something else'); }; myRequired = require('something-else'); } exports.myExport = myExport; exports.someMore = myRequired;
Проблема решена. Похоже, zone.js не имеет ничего общего с этой проблемой. Я получил помощь от сообщества system.js. Проверьте этот ответ .
@guybedford
Это то, как анализ зависимостей в SystemJS работает через статический parsing CommonJS, – это единственный способ заставить асинхронную загрузку CommonJS поддерживать. Попробуйте добавить:
System.config({ map: { ms: '@empty' } });