是否可以安装通过npm安装的节点模块,然后从casperjs脚本安装require
?
(我看到很多帖子和工具用于从node.js内部运行casper或phantom,但这不是我想要做的。)
casperjs文档似乎表示这是可能的,但只能用手写的玩具模块来表示,它们并没有真正做任何事情。我尝试安装的真实模块是imap
,但此时我无法使用任何模块,即使是net
等内置模块也是如此。简单的例子:
npm install imap
echo "var test = require('imap');" > test.js
casperjs test.js
给我:
CasperError: Can't find module imap
/usr/local/src/casperjs/bin/bootstrap.js:263 in patchedRequire
test.js:1
(我可以看到来自npm ls
的imap模块,我可以在node.js脚本中使用它。)
或者使用内置模块:
echo "var test = require('net');" > test.js
casperjs test.js
投诉"无法找到模块网"
我的npm --version
为1.4.14,nodejs --version
为v0.10.29。我想知道那些太旧了吗? (Casper是1.1.0-beta,Phantom是1.9.7,两者都是最新版本。)
答案 0 :(得分:13)
PhantomJS和SlimerJS(用于CasperJS的引擎)不是Node.js模块。为方便起见,它们可以通过npm安装。它们具有不同于Node.js的基本模块基础结构。
您将无法使用imap
或任何依赖于net
模块的模块。正如Fanch所指出的那样,有些模块可以在phantomjs运行时内工作。
如果模块仅使用某些本机node.js模块的某些功能,您可以尝试更改实现以使用phantomjs提供的API。我不认为这很容易。大多数时候你会碰到一堵墙。
在imap
的情况下,它是相当绝望的。您甚至无法重新实现require("net").Socket
,因为phantomjs不支持WebSockets(至少在1.9.7中)。
答案 1 :(得分:5)
这是一个带有colors模块的例子:
var colors = require('colors');
casper.test.begin('\n*Colors module*\n', function suite(test) {
casper.start()
.thenOpen('https://www.google.fr/', function() {
console.log("test require\n".zebra);
console.log("test require\n".rainbow);
console.log("test require\n".red.underline.bold);
})
.run(function() {
test.done();
});
});
casperjs test testnode.js
输出:
当所需模块具有依赖关系时,似乎并不那么简单。
答案 2 :(得分:3)
在我的情况下,我想加载underscorejs。 Underscore是一系列功能,并且没有与javascript对象进行复杂的交互,因此只需要javascript文件然后访问其功能就没有问题。
我首先找到了我的nodejs安装的根目录(来自CLI):
node --help
这让我找到了我的节点路径:
echo $NODE_PATH
以下是:
/usr/local/lib/node_modules/
Underscore在
/usr/local/lib/node_modules/underscore/underscore.js
所以我在CasperJS脚本中的最终需求声明是。
var _ = require('/usr/local/lib/node_modules/underscore/underscore.js');
现在在我的脚本中,我测试是否加载了underscorejs:
this.echo(_.now());
我看到了当前的时间。
CAVEAT:由于这是异步运行的,如果你把__now()语句放在require之后,它会给你一个未定义的对象错误。作为一个注释,我使用Casper 1.1,它使用PhantomJS的原生require()函数。如果你正在使用< Casper 1.1,我认为要求不会起作用。
更新: 既然如此,我使用CasperJS then()函数同步加载我的实用程序,确保在全局范围内声明我的变量。这是看起来的样子:
//at the top of the file-ish, declare variables that will hold loaded libraries.
var utils, _;
var casper = require('casper').create(); //create casper
casper.start('http://example.com'); //start casper at URL.
casper.then(function loadRequires(){ //load the requirements
utils = require('utils', function(){this.echo('utils loded')});
_ = require('/usr/local/lib/node_modules/underscore/underscore.js');
});
casper.then(function myAwesomeStuff() {
this.echo(_.now()); //now, access the loaded requirements
utils.dump('this stuff is soooo awesome!!!!!!!!!!!!!!!!!!!!');
//do stuff on the page you opened in the start function here.
);
});
您可以在API文档中详细了解Casper原型和then()方法:http://casperjs.readthedocs.org/en/latest/modules/casper.html#casper-prototype