我试了很多支票。这绝对是一个异常现象。我有一个Angular 2服务,它加载@type
定义(typescript 2),然后加载一个commmon.js模块(visionmedia/debug)。在common.js模块中,我有一个简单的if语句,即使条件为false并且不应该执行代码也会触发错误。 Angular应用程序使用system.js
加载模块。
常规代码 if (false) { console.log('This code is not executed') }
正常行为,没有任何反应
异常代码: 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');
}
答案 0 :(得分:1)
你使用systemjs吗?我在多行注释块中的import-statements有类似的情况。 SystemJS使用正则表达式来检测import语句。也许它使用相同的方法来检测导出语句。
这不是zone.js中的问题,因为zonejs只执行任务。任务本身在其他地方被触发。
编辑(回答评论):
我认为你不应该有条件地执行export-statements。
也许这会有所帮助:
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;
答案 1 :(得分:0)
问题已解决。 看起来zone.js与此问题无关。我收到了system.js社区的帮助。检查此answer。
@guybedford
这是SystemJS中的依赖性分析通过CommonJS的静态解析所需的方式 - 这是使CommonJS支持异步加载的唯一方法。尝试添加:
System.config({
map: {
ms: '@empty'
}
});