2011-04-17 31 views
33

Node.js ile bir proje üzerinde çalışıyorum ve sunucu tarafı kodu, birden çok dosyaya bölmek istediğim kadar büyük oluyor. Bu yaş için istemci tarafında yapıldığı görünüyor, geliştirme her dosya için bir script etiketi ekleyerek yapılır ve sadece dağıtım için her şeyi bir araya getirmek için kullanılan "Make" gibi bir şey. Tüm sunucu tarafı kodlarını yerine getirmenin bir anlamı olmadığını anlıyorum, bu yüzden bunu nasıl yapacağımı sormuyorum. Kullanılabilecek en yakın şey require()'dur, ancak tarayıcıda script yapacağı gibi davranmaz, dosyaların ortak bir ad alanını paylaşmaması gerekir.Node.js ile sunucu tarafında birden çok JS dosyası nasıl yönetilir?

Bazı eski Node.js projelerine baktığınızda, Shooter gibi, bu bir zamanlar böyle değildi, ya da kodumda gerçekten basit bir şey eksik. Gereksinimlerim, derleme zamanında global çalışma ad alanına veya çalışma saatine erişemez. Bunun etrafında herhangi bir basit yol var mı, yoksa tüm ihtiyaçlarımız JS dosyalarını arama kapsamından tamamen bağımsız hale getirmeye zorlanıyor muyuz?

cevap

47

Genel bir ad alanı istemezsiniz çünkü globals kötülüktür. düğüm biz exports yazarak modülleri

// someThings.js 

(function() { 
    var someThings = ...; 

    ... 

    module.exports.getSomeThings = function() { 
     return someThings(); 
    } 

}()); 

// main.js 

var things = require("someThings"); 
... 
doSomething(things.getSomeThings()); 

Bir modülü tanımlamak ve sonra modül için bir kamu API maruz tanımlar.

Bunu işlemenin en iyi yolu bağımlılık enjeksiyonudur. Modülünüz bir init işlevini ortaya çıkarır ve bir bağımlılık karmaşasını modülünüze geçirirsiniz.

Küresel kapsam erişim konusunda gerçekten ısrar ederseniz, global aracılığıyla buna erişebilirsiniz. Her dosya global nesnesine yazabilir ve okuyabilir. Yine globals kullanmak istemezsiniz. modül dosya bunu içeren dosyanın yanındaki ise modül yayınlanan ve aracılığıyla yüklenen, npm veya açıkça ./node_modules/ klasöre konmuş ise

+0

Bilgi için teşekkürler, doğru olarak işaretleme. Genel olarak globals == kötülük kavramına katılıyorum ama onların yeri var gibi görünüyor. Örneğin, başka bir yere bağlı olan belirli bir "sınıf" için ayarlamak istediğim bir temel özelliğim varsa ne olur? Örn: 'SomeClass.prototype.baseProp = SomeOtherClass.prototype.prop * 2;' Bu durumda, ya bunu yapıcı aracılığıyla nesne örneğinde ayarlamak zorundayım ya da önerdiğiniz gibi 'global' nesnesini kullanın. . Sanırım daha sonra en uygun olabilir. –

+2

@XHR Sonra 'SomeClass'' SomeOtherClass' üzerinde bir bağımlılık var ve 'SomeClass.js içinde '(' SomeOtherClass ')' gerektirir. Kodumda tek bir global değişken var. 'global._ = require (" underscore ")' i kullanıyorum çünkü _every_ single file. Bu, küresel için tek yarar. – Raynos

29

@Raynos answer yeniden, bu

var things = require("./someThings"); 

olmalıdır Daha sonra

doğrudur.

+4

Eğer gerçek bir düğüm modülü (npm ile kurulmuş, PROJECT_ROOT/node_modules altında kurulu) gerekiyorsa, ikinci kod satırı gereklidir. Kendi dosyanızı (örn. ROOT_DIR/models/thing.js) istemeniz gerekiyorsa, kodun ilk satırını yapmanız gerekir (ancak .js uzantısını uzatabilirsiniz). –

+0

Olumlu değilim, ancak bu davranışı [require object] özelliklerinin özelliğini kullanarak değiştirebilirsiniz (http://nodejs.org/api/globals.html#globals_require_extensions). – snapfractalpop

+0

Düzeltme için teşekkürler, güncelledim. – michielbdejong

İlgili konular