2016-01-19 68 views
1

我在同一个目录中的两个文件:RequireJS错误,但不是镀铬/火狐

<html> 
<head> 
    <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.20/require.js"></script> 
    <script type="text/javascript"> 
     require(["fakeTest"], function() {}); 
    </script> 
</head> 
<body> 
</body> 
</html> 

define(["require", "exports"], function (require, exports) { 
    alert('foo'); 
}); 

如果我运行这个在Chrome/FireFox中我得到了我的期望。如果我尝试从CMD与此运行:

phantomjs --remote-debugger-port=9000 testFile.html 

我得到的错误:

Error: Cannot find module 'fakeTest'

phantomjs://bootstrap.js:299 in require
phantomjs://bootstrap.js:263 in require

我已经试过了最新PhantomJS和旧版本,同样具有RequireJS。我已经浏览了谷歌并且一直没能找到任何解决方案。我有其他人在他们的电脑上试过这个,他们也看到了同样的问题。我尽可能地简化了文件,并且不确定此时还有什么要尝试的。

回答

1

如果您直接运行PhantomJS,那么您需要创建一个脚本来加载页面。看下面的例子。也就是说,如果您试图测试您的网页,则有headless testing frameworks设计用于PhantomJS。这些框架在运行测试时负责加载HTML,脚本和其他资源的细节。就个人而言,我使用Karma Test Runnerkarma-requirejs plugin来运行单元测试。

如果您试图直接运行PhatomJS,您需要创建一个脚本来打开HTML页面。在下面的简单示例中,run.js,“testFile.html”页面打开,并打印页面的标题。然后它设置一个100ms的超时时间,再次打印标题并退出。

var page = require('webpage').create(); 

page.open('testFile.html', function(status) { 
    var title = page.evaluate(function() { 
    return document.title; 
    }); 
    console.log('Page title is ' + title); 
    setTimeout(function() { 
    var title = page.evaluate(function() { 
     return document.title; 
    }); 
    console.log('Page title is ' + title); 
    phantom.exit() 
    }, 100); 
}); 

下面是运行命令输出的例子:

phantomjs run.js 
Page title is Original Title 
Page title is Title Updated 

的原因超时的是,AMD模块异步加载,你就需要建立一个办法你run.js脚本考虑到AMD模块的异步特性。我强烈建议使用与RequireJS集成的现有测试运行器之一,而不是重新发明轮子。

要看到这个动作,修改testFile.html是:

<html> 
<head> 
    <title>Original Title</title> 
    <script type="text/javascript" 
    src="http://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.20/require.js">  
    </script> 
    <script type="text/javascript"> 
     require(["fakeTest"], function() {}); 
    </script> 
</head> 
<body> 
</body> 
</html> 

而且fakeTest.js是:

define(["require", "exports"], function (require, exports) { 
    document.title = 'Title Updated'; 
});