Angular 2 + Zone.js + Common js模块:IF语句异常,即使在false情况下也执行代码

时间:2016-09-24 09:06:24

标签: javascript node.js angular commonjs

我试了很多支票。这绝对是一个异常现象。我有一个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');
}

2 个答案:

答案 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'
    }
});