2012-02-03 8 views
23

dışa aktarmanın herhangi bir yolu, belirli bir dosyada TÜM işlevleri dışa aktarmak için herhangi bir kısayol var mı? Ünite testlerim üretim kodumdan ayrı bir dosyada olduğu için ünite test amaçları için bunu yapmak istiyorum.node.js: node.js dosyasında bir dosyadaki tüm işlevleri (ör., Birim sınamasını etkinleştirmek için) tek tek veya birer birer

exports.myFunction = myFunction; 

Ancak bunu yapmak için daha basit/yağmurluk yol olup olmadığını merak ediyorum:

Ben geçmesi ve olduğu gibi manuel olarak her işlev vermek biliyorum.

(Ve evet, modülerlik nedenlerinden ötürü, tüm işlevleri dışa aktarmanın her zaman iyi bir fikir olmadığını biliyorum, ancak birim sınama amacıyla, tüm küçük işlevleri görmek istiyorsunuz, böylece parçaları parça parça olarak test edebilirsiniz.)

Teşekkürler!

// save this into a variable, so it can be used reliably in other contexts 
var self = this; 

// the scope of the file is the `exports` object, so `this === self === exports` 
self.fnName = function() { ... } 

// call it the same way 
self.fnName(); 

Ya da bu:

// You can declare your exported functions here 
var file = module.exports = { 
    fn1: function() { 
    // do stuff... 
    }, 
    fn2: function() { 
    // do stuff... 
    } 
} 

// and use them like this in the file as well 
file.fn1(); 

Ya da bu:

// each function is declared like this. Have to watch for typeos, as we're typing fnName twice 
fnName = exports.fnName = function() { ... } 

// now you can use them as file-scoped functions, rather than as properties of an object 
fnName(); 

cevap

16

Böyle bir şey yapabilirdi.

Bu lib size yardımcı olabilir: https://github.com/shimondoodkin/nodejs-clone-extend

//file1.js 

var _ = require('cloneextend'); 
_.extend(this, require('file2.js')); 

file1.js şimdi file2.js

+3

Teşekkürler - ama yine de her işlevi açıkça adlara göre listelemek anlamına gelir. Yani sanırım "ihracat *" tipi bir kavram yok mu? – sethpollack

+0

Hayır, böyle bir şey yok. Düzenlenmiş cevabıma bakarsanız, bu sorunu hallederken kullandığım bir yöntem göreceksiniz. Bu, nesnenizdeki tüm işlevlerinizi bildirmenizi ve bunları dosya boyunca kullanabilmenizi sağlar. – benekastah

+1

Clever - teşekkürler. Dolayısıyla, buradaki tradeoff, işlevleri artık doğrudan isimle arama ve bunun yerine file.fn1() sözdizimini kullanmak zorunda kalmıyor. – sethpollack

0

Mixin nesneleri cevaptır

+2

'_.extend''in yükü gerekli değildir. – dman

0

tüm ihracat yapmakta İşte bunu yapmak için basit bir yol. AST'yi ayrıştırın ve üst düzey işlev tanımlarını arayın ve bunları dışa aktarın.

const esprima = require('esprima') 
const program = fs.readFileSync(__filename,'utf8') 
const parsed = esprima.parseScript(program) 
for (let fn of parsed.body) { 
    if (fn.type.endsWith('FunctionDeclaration')) { 
    module.exports[fn.id.name] = eval(fn.id.name) 
    } 
}