假设我有一个叫app。js的文件。很简单:
var express = require('express');
var app = express.createServer();
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.get('/', function(req, res){
res.render('index', {locals: {
title: 'NowJS + Express Example'
}});
});
app.listen(8080);
如果我在“tools.js”中有一个函数。我如何将它们导入到apps.js中使用?
还是……我应该把“工具”变成一个模块,然后需要它吗?<<似乎很难,我宁愿做tools.js文件的基本导入。
您不需要新的函数或新的模块。
如果不想使用命名空间,只需执行正在调用的模块。
在tools.js
module.exports = function() {
this.sum = function(a,b) { return a+b };
this.multiply = function(a,b) { return a*b };
//etc
}
在app.js
或任何其他。js,如myController.js:
而不是
Var tools = require('tools.js'),这迫使我们使用命名空间并调用工具,如tools.sum(1,2);
我们可以简单地调用
require('tools.js')();
然后
sum(1,2);
在我的情况下,我有一个文件与控制器ctrl .js
module.exports = function() {
this.Categories = require('categories.js');
}
和我可以使用类别在每个上下文后的公共类require('ctrls.js')()
Node.js中的vm模块提供了在当前上下文中(包括全局对象)执行JavaScript代码的能力。看到http://nodejs.org/docs/latest/api/vm.html vm_vm_runinthiscontext_code_filename
请注意,到今天为止,vm模块中有一个错误,它阻止runInThisContext在从新上下文调用时执行正确的操作。只有当你的主程序在一个新的上下文中执行代码,然后该代码调用runInThisContext时,这才重要。参见https://github.com/joyent/node/issues/898
遗憾的是,Fernando建议的with(global)方法不适用于“function foo(){}”这样的命名函数。
简而言之,这是一个适用于我的include()函数:
function include(path) {
var code = fs.readFileSync(path, 'utf-8');
vm.runInThisContext(code, path);
}
如果,不管所有其他答案,你仍然想传统地在node.js源文件中包含一个文件,你可以使用这个:
var fs = require('fs');
// file is included here:
eval(fs.readFileSync('tools.js')+'');
为了将文件内容作为字符串而不是对象获取,必须使用空字符串连接+ "(如果您愿意,也可以使用. tostring())。
eval()不能在函数内部使用,必须在全局作用域内调用,否则没有函数或变量可访问(即不能创建include()实用函数或类似的东西)。
请注意,在大多数情况下,这是不好的做法,您应该编写一个模块。然而,在极少数情况下,您真正想要的是对本地上下文/名称空间的污染。
更新2015-08-06
请注意,这对“use strict”无效;(当你处于“严格模式”时),因为在“导入”文件中定义的函数和变量不能被执行导入的代码访问。严格模式强制执行一些由语言标准的新版本定义的规则。这可能是避免此处描述的解决方案的另一个原因。