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

IT技术 javascript import header node.js
2021-02-01 19:55:32

假设我有一个名为 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 中使用?

或者……我应该把“工具”变成一个module,然后需要它吗?<< 看起来很难,我宁愿做 tools.js 文件的基本导入。

6个回答

你可以要求任何 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
如果我必须将变量传递给函数会怎么样,bar: function(a, b){ //some code }
2021-03-12 19:55:32
如何调用函数 bar() ,在 foo() 函数中,意味着如何访问一个函数和另一个函数
2021-03-14 19:55:32
+1 做得很好,甚至将导入的代码限制在它自己的命名空间中。我必须记下这一点以备后用。
2021-03-19 19:55:32
由于您要公开属性,我将使用导出而不是 module.exports。对于导出 vs module.exports:stackoverflow.com/questions/5311334/...
2021-04-04 19:55:32
我想知道是否可以导入外部脚本。require("http://javascript-modules.googlecode.com/svn/functionChecker.js")似乎没有正确导入module。还有其他方法可以导入外部脚本吗?
2021-04-08 19:55:32

如果尽管有所有其他答案,您仍然希望传统上在 node.js 源文件中包含一个文件,您可以使用以下命令:

var fs = require('fs');

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

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

更新 2015-08-06

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

@EvanPlaice:您有更好的建议可以实际回答问题吗?如果您需要包含一个不是module的文件,您有比这更好的方法吗?
2021-03-13 19:55:32
请注意,这与use strict不兼容- 因为use strict将通过 eval 等阻止引入新变量来限制 eval 的使用。
2021-03-22 19:55:32
很酷,这对于快速将为客户端设计的 JS 库放入 node.js 应用程序非常有用,而无需维护 Node 风格的分支。
2021-03-30 19:55:32
我刚刚回答了最初的问题,即包含代码,而不是编写module。前者可以在某些情况下具有优势。此外,您对 require 的假设是错误的:代码肯定是 eval 的,但它保留在自己的命名空间中,无法“污染”调用上下文的命名空间,因此您需要自己 eval() 它。在大多数情况下,使用我的回答中描述的方法是不好的做法,但不是我应该决定它是否适用于 TIMEX。
2021-03-30 19:55:32
有时需要包含,有时需要,它们在大多数编程语言中是两个根本不同的概念,Node JS 也是如此。老实说,包含 js 的能力应该是 Node 的一部分,但对其进行评估本质上是一个不错的解决方案。赞成。
2021-04-02 19:55:32

您不需要新功能或新module。如果您不想使用命名空间,您只需要执行您正在调用的module。

在 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);

就我而言,我有一个带有控制器ctrls.js的文件

module.exports = function() {
    this.Categories = require('categories.js');
}

之后我可以Categories在任何情况下作为公共课程使用require('ctrls.js')()

请注意,您不能在导入的module中“使用 'strict” 模式。
2021-03-12 19:55:32
这只是改变了我的生活,不是开玩笑——有一个 1000 多行的文件我无法分解,因为不同方法的变量都是相互关联的,并且需要所有要求都在同一范围内......require('blah.js')();应该允许我将它们全部导入到同一个范围内!!!谢谢!!!
2021-03-12 19:55:32
这怎么没有更多的+1?这是对问题提出的真正解决方案(尽管不是“官方”解决方案)。调试也比 eval() 容易一百万倍,因为 node 可以提供有用的调用堆栈,而不是指向实际文件,而不仅仅是 undefined。
2021-03-21 19:55:32
@尼克帕诺夫:太棒了!值得注意的是,这是有效的,因为this函数中是直接调用函数时的全局范围(不以任何方式绑定)。
2021-03-23 19:55:32
这是一个很好的提示!警告:如果您使用 () => {} 快捷语法而不是标准的 function() {} 声明来声明 module.exports 函数,则会失败。我花了一个小时才弄清楚问题出在哪里!(箭头函数没有自己的“this”属性:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-29 19:55:32

创建两个js文件

// File cal.js
module.exports = {
    sum: function(a,b) {
        return a+b
    },
    multiply: function(a,b) {
        return a*b
    }
};

主js文件

// File app.js
var tools = require("./cal.js");
var value = tools.sum(10,20);
console.log("Value: "+value);

控制台输出

Value: 30
在其他文件中声明的函数有什么方法可以识别类型,我的意思是在编码时按 。任何ide都可以理解它是哪种类型的对象吗
2021-03-17 19:55:32

创建两个文件,例如app.jstools.js

应用程序.js

const tools= require("./tools.js")


var x = tools.add(4,2) ;

var y = tools.subtract(4,2);


console.log(x);
console.log(y);

工具.js

 const add = function(x, y){
        return x+y;
    }
 const subtract = function(x, y){
            return x-y;
    }
    
    module.exports ={
        add,subtract
    }

输出

6
2