2017-07-26 1 views
1

J'essaie de partager mon code client et serveur et je veux une manière ordonnée d'exiger mes dépendances.Le remplacement nécessite de démarrer à partir de la racine et de vérifier les modules de nœuds sans changer son nom.

Je suis actuellement en utilisant webpack comme mon outil de construction et je l'ai mis à la résolution de mon dossier actif/js donc mes dépendances pour le look client quelque chose comme ceci:

require('validators/login.js'); 

Je voudrais de partager exactement le même code sur le serveur, mais je ne veux pas mettre si les déclarations pour vérifier si elle est le serveur ou le client qui est de faire le besoin donc je peux faire quelque chose comme

if server 
    rootRequire.. 
else 
    require 

ce que je comme est pour le serveur à utiliser nécessitent comme le client fait et commencer à partir du répertoire racine, mais je ne veux pas non plus le dépouiller de ses fonctionnalités pour chercher dans le dossier node_modules s'il ne renvoie pas de résultat. Je veux aussi cela sans placer tout mon code dans le dossier node_modules.

Est-ce que quelqu'un a de bonnes suggestions sur la façon de contourner les exigences? J'ai lu la plupart des solutions hacky comme l'utilisation de liens symboliques ou de placer des choses dans node_modules et je ne cherche pas ces réponses, je voudrais que quelque chose qui est propre et réellement les remplacements nécessite correctement.

Répondre

0

Je pense que j'ai trouvé une solution dont je suis raisonnablement satisfait, j'ai pensé que je la partagerais avec n'importe qui d'autre qui avait besoin d'une réponse.

var module = require('module'); 
var baseRequire = module.prototype.require; 

module.prototype.require = function() 
{ 
    // Add any extra paths here... 
    var extraPaths = [ 
     __dirname 
    ]; 

    for (var i = 0, len = extraPaths.length; i < len; i++) { 
     if (this.paths.indexOf(extraPaths[i]) == -1) { 
      this.paths.push(extraPaths[i]) 
     } 
    } 

    return baseRequire.apply(this, arguments); 
};