在 Node.js 中,如何“包含”其他文件中的函数?

2022-08-29 22:06:09

假设我有一个名为 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);

如果我在“工具.js”里面有一个功能怎么办?如何导入它们以在应用程序中使用.js?

或。。。我是否应该将“工具”变成一个模块,然后需要它?<<似乎很难,我宁愿做工具的基本导入.js文件。


答案 1

你可以要求任何js文件,你只需要声明你想要公开的内容。

// tools.js
// ========
module.exports = {
  foo: function () {
    // whatever
  },
  bar: function () {
    // whatever
  }
};

var zemba = function () {
}

在您的应用文件中:

// app.js
// ======
var tools = require('./tools');
console.log(typeof tools.foo); // => 'function'
console.log(typeof tools.bar); // => 'function'
console.log(typeof tools.zemba); // => undefined

答案 2

尽管有所有其他答案,但您仍然希望传统上将文件包含在节点.js源文件中,则可以使用以下方法:

var fs = require('fs');

// file is included here:
eval(fs.readFileSync('tools.js')+'');
  • 空字符串串联对于将文件内容作为字符串而不是对象获取是必要的(如果您愿意,也可以使用)。+''.toString()
  • eval() 不能在函数内部使用,必须在全局范围内调用,否则无法访问任何函数或变量(即,您无法创建实用程序函数或类似的东西)。include()

请注意,在大多数情况下,这是不好的做法,您应该编写一个模块。但是,在极少数情况下,本地上下文/命名空间的污染是您真正想要的。

更新 2015-08-06

另请注意,这不适用于(当您处于“严格模式”时),因为执行导入的代码无法访问“导入”文件中定义的函数和变量。严格模式强制实施由较新版本的语言标准定义的某些规则。这可能是避免此处描述的解决方案的另一个原因。"use strict";