2012-09-28 5 views
1

Pourquoi exiger dans REPL n'utilise pas le cache du contexte principal et nécessite un nouveau fichier?Node.js: require dans REPL?

Exemple: test.js:

var repl = require('repl'); 
global.a = require('./a'); 
repl.start({ 
    prompt: "node via stdin> ", 
    input: process.stdin, 
    output: process.stdout 
}); 

a.js

console.log(1) 

Je commence test.js:

node test.js 

Il "1" Imprimons

lorsque j'imprime " require ('./ a') » dans REPL:

node via stdin> var aInREPL = require('./a') 

et imprime "1", et ainsi, global.a == aInREPL

Mais parfois, je dois entrer en REPL même! objet comme dans le programme principal (par exemple Singletone). Comment puis-je faire ceci?

Répondre

0

Ajouter le code requis (objet, fonction, ..) au contexte de REPL:

var repl = require('repl'); 
repl.start({ 
    prompt: "node via stdin> ", 
    input: process.stdin, 
    output: process.stdout 
}).context.a = require('./a.js'); 

Maintenant, il imprimera 1 une seule fois =) ou ajouter mondiale au contexte REPL

+0

ce n'est pas pratique. Je peux utiliser require.main dans REPL pour obtenir le même contexte – Sirian

+0

Cette approche peut et sera beaucoup plus propre que require.main. Ci-dessus est juste un exemple laconique (pas le plus joli). 1) Il est beaucoup plus explicite 2) Cleaner, définissez l'objet contexte entier une fois et vous n'avez pas besoin d'aller creuser nécessite 3) Plus flexible, vous pouvez ajouter des choses à l'extérieur nécessite (arguments constructeur – Scott

0

Sur la boîte le REPL s'exécute dans un contexte différent (voir la fonction repl.start pour plus de détails).

Fondamentalement, vous avez deux options pour partager votre contexte mondial avec le REPL récemment commencé:

  • Vous pouvez fournir l'option useGlobal: true dans votre appel à start.
  • Vous pouvez attacher des objets externes à la propriété context de REPL.

Quelle est préférée dépend ainsi de ce que vous voulez atteindre: Voulez-vous partager quoi que ce soit , puis aller avec useGlobal. Si vous souhaitez uniquement partager des objets sélectionnés, utilisez la propriété context et affectez uniquement les objets que vous souhaitez partager (voir la publication de Scott pour un exemple).

+0

avec "useGlobal: true" J'ai le même comportement – Sirian