Angular 2 + Zone.js + Common js module: аномалия оператора IF, код выполняется даже в ложном случае

Я попробовал массу чеков. Это определенно аномалия. У меня есть служба 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' } });