2013-02-16 5 views
6

Cel: making moduł node.js lub moduł Requirejs AMD od zwykłego starego pliku JavaScript tak:Jak dołączyć plik, który nie jest modułem do Node.js (aby utworzyć jego moduł)?

var foo = function() {}; 

mam żadnej kontroli i nie mogę edytowaćfoo.js.

Dlaczego foo jest pustym obiektem wewnątrz pierwszego if? Jak mogę "dołączyć" zwykły plik JavaScript do mojego modułu? File mymodule.js: moduły

(function(root) { 
    if(typeof exports === 'object') { // Node.js 
     var foo = require('./foo'); 

     console.log(foo); // { } 
    } else if (typeof define === 'function' && define.amd) { // RequireJS AMD 
     define(['foo'], function() { 
      return foo; 
     }); 
    } 
}()); 
+0

Jestem zdezorientowany, co próbujesz zrobić z fragmentem kodu "RequireJS"? – loganfsmyth

Odpowiedz

4

Node załadowane require musi zapełnić obiekt exports ze wszystkim, że moduł chce upublicznienia. W twoim przypadku, gdy potrzebujesz pliku, nic nie jest dodawane do exports, więc wyświetla się jako puste. Tak więc krótka odpowiedź brzmi, że musisz jakoś zmodyfikować zawartość foo.js. Jeśli nie możesz tego zrobić ręcznie, musisz to zrobić programowo. Dlaczego nie masz nad nim kontroli?

Najprostsza rzecz, która programowo zawija zawartość, jeśli foo.js w kodzie potrzebnym do uczynienia go odpowiednim modułem.

// Add an 'exports' line to the end of the module before loading it. 
var originalFoo = fs.readFileSync('./foo.js', 'utf8'); 
fs.writeFileSync('./foo-module.js', originalFoo + "\nexports.foo = foo;"); 
var foo = require('./foo-module.js'); 
+1

Rozwiązałem używając read + eval. Noo musi zapisać plik z powrotem. Nie mogę edytować pliku foo.js, ponieważ jest to zależność (pobierana automatycznie). – gremo

+0

To oszczędzało mi godzin pracy - moim celem było zbadanie określonego testu przy pomocy mokki poprzez załadowanie wszystkich potrzebnych globali, mogę rozwiązać ten problem, wywołując test, który chcę debugować, i karmiąc tablicę potrzebnych ścieżek plików do funkcji który wywołuje eval na nich wszystkich –

0

można spróbować:

var fs = require('fs'); 

var foo = fs.readFileSync('foo.js', 'utf8') // Or request it somehow, just get it as a string 

foo += "module.exports.foo = module.exports = foo;"; 

fs.writeFileSync('fooModule.js',foo); 

var foo = require('./fooModule'); 

// foo() and foo.foo() are both the same 

Uwaga: Wymaga węzła.

Powiązane problemy