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

Tra*_*vis 124 javascript node.js

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

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

例如,我想要有以下目录:

/models

/views

......等

Shr*_*hna 130

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

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

var a = "hello" 这将是

GLOBAL.a="hello" 要不就

a = "hello"

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

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

  • @AndersonGreen:请告诉我这是一个关于范围的非常聪明的笑话;-) (72认同)
  • 当你说"这显然是坏事"时,"这个"指的是什么? (39认同)
  • 如果你没有在路径前加上像`./`这样的东西,它帮助我了解你的npm模块中的`require` (4认同)
  • 作为旁注..我喜欢快递.如果你对MVC没有那么特别的话,你也应该检查一下. (3认同)
  • @AndersonGreen - 他的意思是将变量放在全局范围内。 (2认同)

Iva*_*res 92

您需要了解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;
};
Run Code Online (Sandbox Code Playgroud)

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

// client.js

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

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

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

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


Dav*_*ver 61

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

但是,如果您需要加载已经编写但不知道节点的JavaScript,那么该vm模块就是最佳选择(并且绝对是可取的eval).

例如,这是我的execfile模块,它path在任一context或全局上下文中评估脚本:

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

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


Rox*_*Rox 8

如果您打算加载外部 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. 
Run Code Online (Sandbox Code Playgroud)

  • 经过大量的搜索和摸索,这种技术对我有用。我的文件是为浏览器编写的,可以直接使用并声明一个变量,例如:const aVar = { thing: 'a' } (2认同)

Jon*_*enn 6

扩展@Shripad@Ivan的答案,我建议您使用 Node.js 的标准module.export功能。

在您的常量文件(例如 constants.js)中,您可以像这样编写常量:

const CONST1 = 1;
module.exports.CONST1 = CONST1;

const CONST2 = 2;
module.exports.CONST2 = CONST2;
Run Code Online (Sandbox Code Playgroud)

然后在要使用这些常量的文件中,编写以下代码:

const {CONST1 , CONST2} = require('./constants.js');
Run Code Online (Sandbox Code Playgroud)

如果您以前从未见过const { ... }语法:那就是解构赋值