Question Dans Node.js, comment "inclure" des fonctions de mes autres fichiers?


Disons que j'ai un fichier appelé app.js. Assez simple:

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

Que faire si j'ai une fonction dans "tools.js". Comment les importer pour les utiliser dans apps.js?

Ou ... suis-je censé transformer des "outils" en un module, puis l'exiger? << semble dur, je préfère faire l'importation de base du fichier tools.js.


718
2018-04-26 23:56


origine


Réponses:


Vous pouvez exiger n'importe quel fichier js, il vous suffit de déclarer ce que vous voulez exposer.

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

var zemba = function () {
}

Et dans votre fichier d'application:

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

1082
2018-04-27 09:30



Si, malgré toutes les autres réponses, vous voulez toujours traditionnellement comprendre un fichier dans un fichier source node.js, vous pouvez utiliser ceci:

var fs = require('fs');

// file is included here:
eval(fs.readFileSync('tools.js')+'');
  • La concaténation de chaîne vide +'' est nécessaire pour obtenir le contenu du fichier sous la forme d'une chaîne et non d'un objet (vous pouvez également utiliser .toString() si tu préfères).
  • L'eval () ne peut pas être utilisé dans une fonction et doit être appelé à l'intérieur de la portée globale, sinon aucune fonction ou variable ne sera accessible (c'est-à-dire que vous ne pouvez pas créer de include() fonction d'utilité ou quelque chose comme ça).

S'il vous plaît noter que dans la plupart des cas, c'est mauvaise pratique et vous devriez plutôt écrire un module. Cependant, il existe des situations rares, où la pollution de votre contexte local / espace de noms est ce que vous voulez vraiment.

Mise à jour 2015-08-06

S'il vous plaît noter également que cela ne fonctionnera pas avec "use strict"; (quand vous êtes dans "mode strict") parce que les fonctions et les variables défini dans le fichier "importé" ne peut pas être accédé par le code qui fait l'importation. Le mode strict applique certaines règles définies par les nouvelles versions de la norme linguistique. Cela peut être une autre raison de éviter la solution décrite ici.


253
2018-04-27 20:13



Vous n'avez pas besoin de nouvelles fonctions ni de nouveaux modules. Vous devez simplement exécuter le module que vous appelez si vous ne voulez pas utiliser l'espace de noms.

dans tools.js

module.exports = function() { 
    this.sum = function(a,b) { return a+b };
    this.multiply = function(a,b) { return a*b };
    //etc
}

dans app.js

ou dans tout autre .js comme myController.js:

au lieu de

var tools = require('tools.js') ce qui nous oblige à utiliser un espace de noms et d'appeler des outils comme tools.sum(1,2);

on peut simplement appeler

require('tools.js')();

et alors

sum(1,2);

dans mon cas, j'ai un fichier avec les contrôleurs ctrls.js

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

et je peux utiliser Categories dans tous les contextes en tant que classe publique après require('ctrls.js')()


139
2018-01-21 11:51



Créer deux fichiers js

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

Fichier principal js

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

Sortie

value: 30

61
2018-04-11 09:00



Voici une explication simple et simple:

Contenu de Server.js:

// Include the public functions from 'helpers.js'
var helpers = require('./helpers');

// Let's assume this is the data which comes from the database or somewhere else
var databaseName = 'Walter';
var databaseSurname = 'Heisenberg';

// Use the function from 'helpers.js' in the main file, which is server.js
var fullname = helpers.concatenateNames(databaseName, databaseSurname);

Contenu de Helpers.js:

// 'module.exports' is a node.JS specific feature, it does not work with regular JavaScript
module.exports = 
{
  // This is the function which will be called in the main file, which is server.js
  // The parameters 'name' and 'surname' will be provided inside the function
  // when the function is called in the main file.
  // Example: concatenameNames('John,'Doe');
  concatenateNames: function (name, surname) 
  {
     var wholeName = name + " " + surname;

     return wholeName;
  },

  sampleFunctionTwo: function () 
  {

  }
};

// Private variables and functions which will not be accessible outside this file
var privateFunction = function () 
{
};

36
2017-10-23 11:47



Je cherchais aussi une fonction 'include' de NodeJS et j'ai vérifié la solution proposée par Udo G - voir le message https://stackoverflow.com/a/8744519/2979590. Son code ne fonctionne pas avec mes fichiers JS inclus. Finalement, j'ai résolu le problème comme ça:

var fs = require("fs");

function read(f) {
  return fs.readFileSync(f).toString();
}
function include(f) {
  eval.apply(global, [read(f)]);
}

include('somefile_with_some_declarations.js');

Bien sûr, cela aide.


28
2017-12-09 14:57



Le module vm dans Node.js permet d'exécuter du code JavaScript dans le contexte actuel (y compris l'objet global). Voir http://nodejs.org/docs/latest/api/vm.html#vm_vm_runinthiscontext_code_filename

Notez qu'à partir d'aujourd'hui, il existe un bogue dans le module vm qui empêchait runInThisContext de faire le bien lorsqu'il est invoqué depuis un nouveau contexte. Cela n'a d'importance que si votre programme principal exécute du code dans un nouveau contexte et que ce code appelle ensuite runInThisContext. Voir https://github.com/joyent/node/issues/898

Malheureusement, l'approche (globale) proposée par Fernando ne fonctionne pas pour les fonctions nommées comme "function foo () {}"

En bref, voici une fonction include () qui fonctionne pour moi:

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

23
2018-06-26 20:00