在node.js中加载并执行外部js文件,可以访问局部变量吗?

时间:2010-12-19 00:47:20

标签: javascript node.js

在node.js中执行简单include('./path/to/file')类型的命令是否容易/可行?

我想要做的就是访问局部变量并运行脚本。人们通常如何组织比简单的hello世界更大的node.js项目? (功能齐全的动态网站)

例如,我希望有以下目录:

/models

/views

...等

6 个答案:

答案 0 :(得分:129)

只需做一个require('./yourfile.js');

将您想要外部访问的所有变量声明为全局变量。 而不是

var a = "hello"它将是

GLOBAL.a="hello"或只是

a = "hello"

这显然很糟糕。您不希望污染全球范围。 相反,建议方法是export你的函数/变量。

如果你想要MVC模式,请看看Geddy。

答案 1 :(得分:91)

您需要了解CommonJS,它是一种定义模块的模式。你不应该滥用GLOBAL范围,这总是一件坏事,而是你可以使用'exports'标记,如下所示:

// circle.js

var PI = 3.14; // PI will not be accessible from outside this module

exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};

将使用我们模块的客户端代码:

// client.js

var circle = require('./circle');
console.log( 'The area of a circle of radius 4 is '
           + circle.area(4));

此代码是从node.js文档API中提取的:

http://nodejs.org/docs/v0.3.2/api/modules.html

另外,如果你想使用像Rails或Sinatra这样的东西,我建议使用Express(我无法发布URL,耻辱Stack Overflow!)

答案 2 :(得分:60)

如果您正在为Node编写代码,那么使用Ivan所描述的Node模块无疑是可行的方法。

但是,如果您需要加载已经编写且不了解节点的JavaScript,那么vm模块就是可行的方式(绝对优于eval)。

例如,这是我的execfile模块,它评估pathcontext或全局上下文中的脚本:

var vm = require("vm");
var fs = require("fs");
module.exports = function(path, context) {
  var data = fs.readFileSync(path);
  vm.runInNewContext(data, context, path);
}

另请注意:加载require(…)的模块无法访问全局上下文。

答案 3 :(得分:1)

如果您打算加载外部javascript文件的函数或对象,请使用以下代码在此上下文上加载–注意runInThisContext方法:

var vm = require("vm");
var fs = require("fs");

var data = fs.readFileSync('./externalfile.js');
const script = new vm.Script(data);
script.runInThisContext();

// here you can use externalfile's functions or objects as if they were instantiated here. They have been added to this context. 

答案 4 :(得分:0)

这对我来说是最好的!它保留了范围和所有内容。

const fs = require('fs');
eval(fs.readFileSync('file.js')+'');

答案 5 :(得分:0)

很抱歉复活。您可以使用child_process模块​​在node.js中执行外部js文件

var child_process = require('child_process');

//EXECUTE yourExternalJsFile.js
child_process.exec('node yourExternalJsFile.js', (error, stdout, stderr) => {
    console.log(`${stdout}`);
    console.log(`${stderr}`);
    if (error !== null) {
        console.log(`exec error: ${error}`);
    }
});