В Node.js, как мне «включить» функции из других моих файлов? - PullRequest
839 голосов
/ 27 апреля 2011

Допустим, у меня есть файл с именем 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. </p>

Ответы [ 25 ]

9 голосов
/ 27 апреля 2011

Вы можете поместить свои функции в глобальные переменные, но лучше просто превратить ваш инструментальный скрипт в модуль. Это на самом деле не так уж сложно - просто присоедините ваш публичный API к объекту exports. Взгляните на Понимание модуля экспорта Node.js для более подробной информации.

8 голосов
/ 18 апреля 2018

Я просто хочу добавить, если вам нужны только определенные функции, импортированные из вашего tools.js , тогда вы можете использовать деструктурирующее назначение , которое поддерживается в node.js, так какверсия 6.4 - см. node.green .


Пример : (оба файла находятся в одной папке)

tools.js

module.exports = {
    sum: function(a,b) {
        return a + b;
    },
    isEven: function(a) {
        return a % 2 == 0;
    }
};

main.js

const { isEven } = require('./tools.js');

console.log(isEven(10));

вывод: true


Это также позволяет избежать назначения этих функций в качестве свойств другого объекта, как в случае следующего (общего) назначения:

const tools = require('./tools.js');

, куда нужно позвонить tools.isEven(10).


ПРИМЕЧАНИЕ:

Не делайтене забудьте префикс вашего имени файла с правильным путем - даже если оба файла находятся в одной папке, вам нужно префикс с ./

From Node.js docs :

Без начальных '/', './' или '../' для указанияфайл, модуль должен быть основным модулем или загружаться из папки node_modules.

8 голосов
/ 24 сентября 2018

app.js

let { func_name } = require('path_to_tools.js');
func_name();    //function calling

tools.js

let func_name = function() {
    ...
    //function body
    ...
};

module.exports = { func_name };
7 голосов
/ 16 июня 2016

Это работало со мной, как показано ниже ...

Lib1.js

//Any other private code here 

// Code you want to export
exports.function1 = function(params) {.......};
exports.function2 = function(params) {.......};

// Again any private code

теперь в Main.js файл, который необходимо включить Lib1.js

var mylib = requires('lib1.js');
mylib.function1(params);
mylib.function2(params);

Пожалуйста, не забудьте поместить Lib1.js в папку node_modules .

3 голосов
/ 09 марта 2015

Включить файл и запустить его в заданном (неглобальном) контексте

fileToInclude.js

define({
    "data": "XYZ"
});

main.js

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

function include(path, context) {
    var code = fs.readFileSync(path, 'utf-8');
    vm.runInContext(code, vm.createContext(context));
}


// Include file

var customContext = {
    "define": function (data) {
        console.log(data);
    }
};
include('./fileToInclude.js', customContext);
2 голосов
/ 17 июня 2019

Попробуйте этот полный пример кода.Вам нужно включить этот файл, используя метод require в app.js, где вы хотите включить функции другого файла, например, main.js, и этот файл должен предоставлять указанные функции, как в примере ниже.

app.js

const mainFile= require("./main.js")


var x = mainFile.add(2,4) ;
console.log(x);

var y =  mainFile.multiply(2,5); 
console.log(y);

main.js

const add = function(x, y){
    return x+y;
}
const multiply = function(x,y){
    return x*y;
}

module.exports ={
    add:add,
    multiply:multiply
}

output

6
10
2 голосов
/ 27 июля 2013

Это лучший способ, который я создал до сих пор.

var fs = require('fs'),
    includedFiles_ = {};

global.include = function (fileName) {
  var sys = require('sys');
  sys.puts('Loading file: ' + fileName);
  var ev = require(fileName);
  for (var prop in ev) {
    global[prop] = ev[prop];
  }
  includedFiles_[fileName] = true;
};

global.includeOnce = function (fileName) {
  if (!includedFiles_[fileName]) {
    include(fileName);
  }
};

global.includeFolderOnce = function (folder) {
  var file, fileName,
      sys = require('sys'),
      files = fs.readdirSync(folder);

  var getFileName = function(str) {
        var splited = str.split('.');
        splited.pop();
        return splited.join('.');
      },
      getExtension = function(str) {
        var splited = str.split('.');
        return splited[splited.length - 1];
      };

  for (var i = 0; i < files.length; i++) {
    file = files[i];
    if (getExtension(file) === 'js') {
      fileName = getFileName(file);
      try {
        includeOnce(folder + '/' + file);
      } catch (err) {
        // if (ext.vars) {
        //   console.log(ext.vars.dump(err));
        // } else {
        sys.puts(err);
        // }
      }
    }
  }
};

includeFolderOnce('./extensions');
includeOnce('./bin/Lara.js');

var lara = new Lara();

Вам все еще нужно сообщить, что вы хотите экспортировать

includeOnce('./bin/WebServer.js');

function Lara() {
  this.webServer = new WebServer();
  this.webServer.start();
}

Lara.prototype.webServer = null;

module.exports.Lara = Lara;
2 голосов
/ 22 февраля 2017

Вы можете просто просто require('./filename').

Например.

// file: index.js
var express = require('express');
var app = express();
var child = require('./child');
app.use('/child', child);
app.get('/', function (req, res) {
  res.send('parent');
});
app.listen(process.env.PORT, function () {
  console.log('Example app listening on port '+process.env.PORT+'!');
});
// file: child.js
var express = require('express'),
child = express.Router();
console.log('child');
child.get('/child', function(req, res){
  res.send('Child2');
});
child.get('/', function(req, res){
  res.send('Child');
});

module.exports = child;

Обратите внимание:

  1. вы не можете слушать PORTв дочернем файле только родительский экспресс-модуль имеет прослушиватель PORT
  2. Дочерний объект использует «Маршрутизатор», а не родительский экспресс-запуск.
2 голосов
/ 23 сентября 2016

Как будто у вас есть файл abc.txt и многое другое?

Создать 2 файла: fileread.js и fetchingfile.js, затем в fileread.js написать этот код:

function fileread(filename) {
    var contents= fs.readFileSync(filename);
        return contents;
    }

    var fs = require("fs");  // file system

    //var data = fileread("abc.txt");
    module.exports.fileread = fileread;
    //data.say();
    //console.log(data.toString());
}

В fetchingfile.js написать этот код:

function myerror(){
    console.log("Hey need some help");
    console.log("type file=abc.txt");
}

var ags = require("minimist")(process.argv.slice(2), { string: "file" });
if(ags.help || !ags.file) {
    myerror();
    process.exit(1);
}
var hello = require("./fileread.js");
var data = hello.fileread(ags.file);  // importing module here 
console.log(data.toString());

Теперь в терминале: $ node fetchingfile.js --file = abc.txt

Вы передаете имя файла в качестве аргумента, более того, включайте все файлы в readfile.js вместо его передачи.

Спасибо

1 голос
/ 26 марта 2016

Я также искал возможность включить код без написания модулей, соответственно. используйте те же проверенные автономные источники из другого проекта для службы Node.js - и ответ jmparatte s сделал это для меня.

Преимущество в том, что вы не загрязняете пространство имен, у меня нет проблем с "use strict";, и оно работает хорошо.

Здесь полный образец:

Скрипт для загрузки - /lib/foo.js

"use strict";

(function(){

    var Foo = function(e){
        this.foo = e;
    }

    Foo.prototype.x = 1;

    return Foo;

}())

SampleModule - index.js

"use strict";

const fs = require('fs');
const path = require('path');

var SampleModule = module.exports = {

    instAFoo: function(){
        var Foo = eval.apply(
            this, [fs.readFileSync(path.join(__dirname, '/lib/foo.js')).toString()]
        );
        var instance = new Foo('bar');
        console.log(instance.foo); // 'bar'
        console.log(instance.x); // '1'
    }

}

Надеюсь, это было как-то полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...