gpt4 book ai didi

requirejs - phantomjs 和 requirejs

转载 作者:行者123 更新时间:2023-12-04 12:35:11 28 4
gpt4 key购买 nike

main.js 文件中的代码如下:

      phantom.injectJs("libs/require-1.0.7.js");
require.config(
{
baseUrl: ""
}
);
require([], function(){});

当我在命令行中运行“phantomjs main.js”时,requirejs 在 main.js 中无法正常工作。我知道如何在浏览器中运行的页面中使用requirejs(包括phantomjs的方式:page.open(url,callback)),但不像上面那样。我尝试使用像 main.js 这样的 requirejs,我认为这是一个流行的问题。谢谢!

最佳答案

我只是挣扎了一段时间。我的解决方案并不干净,但它可以工作,由于 phantomjs 未完成的 api 文档,我对此感到满意。

罗嗦的解释

你需要三个文件。一个是您的 amd phantomjs 测试文件,我将其称为“amd.js”。第二个是要加载的 html 页面,我将其命名为“amd.html”。最后是我称之为“amdTestModule.js”的浏览器测试。

在 amd.html 中,按正常方式声明您的脚本标签:

<script data-main="amdTestModule.js" src="require.js"></script>

在您的 phantomjs 测试文件中,这就是它变得 hacky 的地方。创建您的页面,并加载到“fs”模块中。这允许您打开相对文件路径。
var page = require('webpage').create();
var fs = require('fs');

page.open('file://' + fs.absolute('tests/amd.html'));

现在由于 requirejs 异步加载文件,我们不能只将回调传递给 page.open 并期望事情顺利进行。我们需要一些方法
1) 在浏览器中测试我们的模块并将结果传回给我们的 phantomjs 上下文。或者
2) 告诉我们的 phantomjs 上下文,在加载所有资源后,运行测试。

#1对我来说更简单。我通过以下方式完成了这项工作:
page.onConsoleMessage = function(msg) {
msg = msg.split('=');
if (msg[1] === 'success') {
console.log('amd test successful');
} else {
console.log('amd test failed');
}
phantom.exit();
};

**有关我的 console.log 消息,请参阅下面的完整代码。

现在 phantomjs 显然有一个内置的事件 api,但它没有记录。我还成功地从他们的 page.onResourceReceived 和 page.onResourceRequested 获取请求/响应消息 - 这意味着您可以在加载所有必需模块时进行调试。然而,为了传达我的测试结果,我只使用了 console.log。

现在如果 console.log 消息从未运行会发生什么?我能想到解决这个问题的唯一方法是使用 setTimeout
setTimeout(function() {
console.log('amd test failed - timeout');
phantom.exit();
}, 500);

应该这样做!

完整代码

目录结构
/projectRoot  
/tests
- amd.js
- amdTestModule.js
- amd.html
- require.js (which I symlinked)
- <dependencies> (also symlinked)

amd.js
'use strict';
var page = require('webpage').create();
var fs = require('fs');

/*
page.onResourceRequested = function(req) {
console.log('\n');
console.log('REQUEST');
console.log(JSON.stringify(req, null, 4));
console.log('\n');
};
page.onResourceReceived = function(response) {
console.log('\n');
console.log('RESPONSE');
console.log('Response (#' + response.id + ', stage "' + response.stage + '"): ' + JSON.stringify(response, null, 4));
console.log('\n');
};
*/

page.onConsoleMessage = function(msg) {
msg = msg.split('=');
if (msg[1] === 'success') {
console.log('amd test successful');
} else {
console.log('amd test failed');
}
phantom.exit();
};

page.open('file://' + fs.absolute('tests/amd.html'));

setTimeout(function() {
console.log('amd test failed - timeout');
phantom.exit();
}, 500);

amd.html
<!DOCTYPE html>
<html>

<head>
<meta charset="UTF-8">
</head>

<body>
<script data-main='amdTestModule.js' src='require.js'></script>
</body>

</html>

amdTestModule.js
require([<dependencies>], function(<dependencies>) {
...
console.log(
(<test>) ? "test=success" : "test=failed"
);
});

控制台
$ phantomjs tests/amd.js
amd test successful

关于requirejs - phantomjs 和 requirejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11202029/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com