需要来自Node和Browser运行时的Javascript模块

时间:2013-01-22 09:26:18

标签: javascript node.js

我正在使用Nodejs编写一些示例程序,这些程序也应该可以从浏览器中调用。我面临着从Nodejs中调用JavaScript文件的问题,其方式也与浏览器JS语义兼容(因此require是特定于节点的,不会完成工作)。

假设我有三个.js文件:“A.js”,“B.js”和“C.js”。 “A.js”是在Node中编写的。 “B.js”和“C.js”是用纯JavaScript编写的(也就是说,它们应该可以从浏览器中调用)。

我需要调用“A.js”中“B.js”中的函数b()。所以我eval()“B.js”导出方法b()。这工作正常。当我在“B.js”中的函数b()调用“C.js”中的函数c()时会出现问题。

B.js:

function b()
{
    console.log('In function b');
    c();
}

C.js:

function c()
{
    console.log('In function c');
}

如何确保依赖性得到解决?任何帮助,将不胜感激。感谢!!!

2 个答案:

答案 0 :(得分:1)

在node.js中,有require函数,允许您需要一个文件并使用导出的内容。

C.js:

function c() {
    console.log('In function c');
}

// This is the exported object
module.exports = {
    c: c
};

B.js:

function b() {
    var c = require('./c.js');
    // "c" is now the exported object

    console.log('In function b');
    c.c();
}

module.exports = {
    b: b
};

A.js:

var b = require('./b.js');

b.b(); // "In function b" "In function c"

您一定应该阅读如何处理node.js中的模块:http://nodejs.org/api/modules.html

答案 1 :(得分:1)

您可以手动加载普通的vanilla javascript文件并eval加载它。在您的情况下,您可以创建一个加载纯javascript文件的节点模块。像这样:

<强> bc.js

var fs = require('fs');

// load and eval b.js and c.js
eval(fs.readFileSync('./b.js','utf8') + fs.readFileSync('./c.js','utf8'));

// put function b and c in exports
module.exports = {
    b : b,
    c : c
};

因此,无论何时需要bc.js,您都会获得bc函数,b可以使用c函数。

有关详细信息,请参阅以下问题:Load "Vanilla" Javascript Libraries into Node.js