1228 votes

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.

1750voto

masylum Points 4819

Vous pouvez exiger n'importe quel fichier js, vous avez juste besoin 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
 

347voto

Udo G Points 2254

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

var fs = require('fs');

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

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

39voto

Hellen Points 196

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 () 
{
 

}

37voto

jmparatte Points 51

Je cherchais aussi un NodeJS « include » fonction et j’ai vérifié la solution proposée par Udo G - Voir message http://stackoverflow.com/a/8744519/2979590. Son code ne fonctionne pas avec mes fichiers JS inclus. Enfin, j’ai résolu le problème comme ça :

Bien sûr, cela aide.

25voto

Chad Austin Points 180

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

Notez que, à compter d'aujourd'hui, il y a un bug dans la machine virtuelle module prevenst runInThisContext de faire le droit lorsqu'il est appelé à partir d'un nouveau contexte. Cette seulement si votre programme principal exécute le code dans un nouveau contexte, et alors que les appels de code runInThisContext. Voir https://github.com/joyent/node/issues/898

Malheureusement, l'(globale) de l'approche que Fernando a suggéré de ne pas travailler pour des fonctions nommées comme "la fonction foo() {}"

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X