2011-01-23 5 views
4

여러 모듈을 포함 할 JS 라이브러리를 작성하려고합니다. 라이브러리를 Library 라하고 두 개의 모듈을 One과 Two라고합니다. 최종 사용자가 두 가지 방법으로 라이브러리를 호출 할 수 있으려면 내가 좋아하는 것 :자바 스크립트 라이브러리의 네임 스페이스 지정 (선택 사항)

Library.One.somefunction(params) 

또는 기본적으로

somefunction(params) 

, 나는 최종 사용자에게 네임 스페이스를 포함하는 옵션을 제공 할 또는 아니. 이것을 할 수있는 좋은 방법이 있습니까? 또한 라이브러리의 축소 버전을 제공하려는 경우이 작업을 수행하는 좋은 방법이 있습니까? 이 라이브러리는 Node.js에서 끝낼 수있는 것입니다. 당장은 직접 사용 하겠지만, 앞으로는 공유 가능한 프로젝트를 시작하는 것이 그리 어렵지 않도록 디자인하고 싶습니다.

당신이 나를 가리킬 수있는 모든 참조는 훌륭한 것입니다, 감사합니다!

window.somefunction = Library.One.somefunction; 

당신은 다른 언어와 유사한 작동하는 include 함수를 작성할 수 있습니다

답변

1

글쎄, 나는 당신이 "좋은 길"로 무슨 뜻인지 모르겠다.
우선, 네임 스페이스의 전체 목적은 관련된 네임 스페이스의 모든 변수를 수집하는 것입니다. 는 개인적으로 나는 그런 일을 사용하지 것이다, 그러나 당신은 당신의 이름 공간의 오브젝트를 통해 루프 수와 창에 첨부 :

 
for(var i in Namespace) 
    if(Namespace.hasOwnProperty(i)) 
     window[i] = Namespace[i]; 
2

는 "네임 스페이스"를 만들기의 기본 개념은 선택이 window 목적은 전역 범위에 기능을 할당하는 것입니다 : 필요에 따라

var include = function (library, p) { 
    if (!p) { 
     for (var prop in library) { 
      if (library.hasOwnProperty(prop)) { 
       window[prop] = library[prop]; 
      } 
     } 
    } else { 
     window[p] = library[p]; 
    } 
}; 

은 그럼 그냥, 수행

include(Library.One); 

또는 사용하는 특정 기능 만 :

include(Library.One, 'somefunction'); 

경고 : 점 표기법 (One.somefunction)없이 기능을 실행

  1. this 키워드가 window보다는 Library.One을 참조하게됩니다. this을 전혀 사용하지 않으면 문제가되지 않습니다. 이 기능 사이에 공유하는 데이터가있는 경우 당신은 this 대신 폐쇄의 범위를 사용하여 수행 할 수 있습니다 :

    var Library = {}; 
    
    (function() { 
        // I'm a closure, I have local scope 
        var sharedData = "I'm shared but private to this scope"; 
    
        Library.One = {}; 
    
        Library.One.funcOne = function() { 
         alert(sharedData); 
        }; 
    
        Library.One.funcTwo = function() { 
         sharedData += "!"; 
        }; 
    
    })(); 
    
  2. 다른 사람이 당신의 방법은 글로벌 공개하고 싶지 않아 잘 조언합니다. 이는 일단 글로벌이되면 모든 파일에 대해 전역이므로 다른 코드와 충돌 할 가능성이 있기 때문입니다. 당신이 할 수있는 일은 위의 import 함수를 수정하여 새로운 객체를 만들고 그것을 반환하기 전에 모든 것을 그 객체에 할당하는 것입니다.

    (function() { 
        var _ = include(Library.One); // This stays within this scope 
        _.somefunction(); 
    })(); 
    
+0

만 브라우저는 이름'window'을 제공합니다. 대신에'global'을 사용하십시오. – erjiang

+0

@erjiang, 감사합니다. node.js. 그것이 노드라는 것을 알기 때문에, 모듈 시스템으로 인해 이것의 대부분은 부적합합니다. –

+0

'import'는 예약어입니다. http://www.crockford.com/javascript/survey.html – galambalazs

0

당신은 아주 쉽게 할 수 있지만, 당신은 당신이 모든 방법 전역 속성을 만들고 싶어 확신 그런 다음 특정 라이브러리에 대한 바로 가기가 할 수있는 필요한 파일이?

당신은 그것 (매우 간단)과 같이 구현할 수 있습니다 : 당신이 정말이 같은 글로벌 네임 스페이스를 오염 할 궁금 것

(function(window, undefined) { 

    // Your code setting up namespaces 
    var Library = {One:{},Two:{}}; 

     // function for adding library code to both namespaces. 
     // Could be modified to accept an Array of functions/names 
    function addToLibraryOne(id, fn) { 
     window[id] = Library.One[id] = fn; 
    } 

     // add a function 
    addToLibraryOne("somefunction", function(params) { 
      // function code 
    }); 

    window.Library = Library; 

})(window); 

.

최소한 나는 global 속성을 옵션으로 만들고 그 옵션을 선택한 경우에만 해당 기능을 추가하십시오.

0

내가 그래서 이것은을 downvoted 얻을 수 있습니다 (이 잘못 될 수도 있지만 나는이 원하는 평가),하지만 당신은 요구 사항과 모순을 설정하는 것 같아요

1) 나는 네임 스페이스를 사용하고 싶다 2) 네임 스페이스없이 네임 스페이스 기능에 액세스 할 수 있기를 원한다.

기본적으로 2는 "네임 스페이스가 필요 없습니다"입니다.

구현을 위해 네임 스페이스에 경로를 지정하는 전역 기능을 정의 할 수 있지만 네임 스페이스를 시작하는 이유는 무엇입니까?

+0

아이디어는 내 개발 및 일반 라이브러리에서 네임 스페이스를 사용하려고하지만 네임 스페이스를 사용하지 않을 수도 있습니다. Javascript에서 Math.sin (3)을 고려하십시오. 네임 스페이스없이 라이브러리를 가져 오도록 선택한 경우 누군가 Math.sin (3) 대신 sin (3)을 말할 수 있다면 좋을 것입니다. 그것이 그 아이디어입니다. – Geoff

0

글쎄, 둘째는 함수와 개체 및 모듈의 모든 요소가 전역 범위에 있어야한다는 것입니다. 물론 완전히 가능하지만 모범 사례는 다소 혐오 스럽습니다.

var Library = {}; 

를 다음 모듈로 채우기 시작 : 첫 번째 부분에 대한

, 방금 전 세계적으로 당신의 라이브러리 네임 스페이스를 선언

Library.One = {}; 
Library.Two = {}; 

을 다음 해당 모듈의 기능을 추가하여 시작합니다.

(function($) { 
    var $.froobString = function(s) { .... }; 
    ...etc... 
})(Library.One); 

(여기서 나는 $Library.One에 전달하는 자체 실행 익명 함수로 일을했습니다.)

가 전역에 모든 것을 변환하려면이 같은 루틴이 있습니다

var convertToGlobals = function(module) { 
    for (name in module) { 
    window[name] = module[name]; 
    } 
}; 
convertToGlobals(Library.One) 

하지만 다시 나는 그것을 반대 할 것입니다.

5

당신은 당신이 CommonJS 모듈 시스템을 활용할 수Node.js를를 사용하는 경우. (누군가가 그것을 사용 ...)

math.js (라이브러리)

exports.add = function() { 
    for (var i = arguments.length; i--;) { 
     sum += arguments[i]; 
    } 
    return sum; 
}; 

program.js

var MyMath = require('math'); 
console.log(MyMath.add(1, 2)); // 3 

// ... in different ways 

var add = require('math').add; 
console.log(add(1, 2)); // 3 
관련 문제