2016-08-08 3 views
0

accounts-facebook이 Meteor에서 accounts-base을 사용하는 것과 같은 "핵심"패키지와 "모듈/플러그인"패키지를 만들고 싶습니다. 여기 Meteor 패키지 라이브러리 생성 중?

내가 현재 가지고 무엇 그러나 그것은 작동하지 않습니다 :

패키지/프로젝트 :

Package.describe({ 
    name: 'project:modules-core', 
    summary: 'Core package for Modules.', 
    version: '1.0.0' 
}); 

Package.onUse(function (api) { 
    api.versionsFrom('[email protected]'); 

    api.addFiles('lib/core.js', ['client', 'server']); 

    if (api.export) { 
     api.export('HBModule'); 
    } 
}); 

패키지/프로젝트 : 모듈 코어/lib 디렉토리/모듈 - 코어/ package.js core.js :

HBModule = (function() { 
    var moduleName = ""; 

    var getShareCount = (function (url) { 

    }); 

    var register = (function (name) { 
    HBModule[name] = name; 
    }); 
}()); 

패키지/프로젝트 : 페이스 북/package.j 의 :

Package.describe({ 
    name: 'project:facebook', 
    summary: 'Facebook Module.', 
    version: '1.0.0' 
}); 

Package.onUse(function(api) { 
    api.versionsFrom('[email protected]'); 

    api.use('project:modules-core', ['client', 'server']); 

    api.imply('project:modules-core', ['client', 'server']); 

    api.addFiles('lib/facebook.js', ['client', 'server']); 
}); 

패키지/프로젝트 : 페이스 북/lib 디렉토리/facebook.js :

Facebook = (function() { 
    var moduleName = "Facebook"; 

    var getShareCount = (function (url) { 
    return 22; 
    }); 
}()); 

HBModule.register('facebook'); 

그리고이와 나는 TypeError: Cannot read property 'register' of undefined 오류를 받고 있어요

.

내가 뭘 잘못하고 있니?

감사합니다.

답변

1

IIFE (Immediately-Invoked Function Expressions)는 아무 것도 반환하지 않으므로 HBModuleFacebook은 모두 정의되지 않습니다. HBModule을 만들 때 register 속성을 가진 객체를 register 함수로 반환해야합니다. 유성 어쨌든 각 파일을 포장, 만 (예 : HBModule로) 선언하지 않고 사용하는 변수를 노출하므로

HBModule = (function() { 
    var moduleName = ""; 

    var getShareCount = (function (url) { 

    }); 

    var register = (function (name) { 
    HBModule[name] = name; 
    }); 

    // return an object that will be assigned to HBModule 
    return { register: register }; 
}()); 

는 또한 인생의 여기 필요하지 않습니다; var으로 선언 된 모든 변수는 해당 파일로 범위가 지정됩니다.

패키지/프로젝트 : 모듈 코어/lib 디렉토리/core.js :

HBModule = {}; 
var moduleName = ''; 

// assuming you want to expose the getShareCount method as well? 
HBModule.getShareCount = function (url) { 

}; 

HBModule.register = function (name) { 
    HBModule[name] = name; 
}; 

패키지/프로젝트 : 페이스 북은/lib 디렉토리/facebook.js :

Facebook = {}; 
var moduleName = 'Facebook'; 

Facebook.getShareCount = function (url) { 
    return 22; 
}; 

HBModule.register('facebook'); 
+0

이 굉장 ! 고맙습니다! 한가지 더 질문합니다. 모듈이 설정되지 않은 경우 모듈이 기본 기능을 사용하게하려면 어떻게해야합니까? 예를 들어, "Facebook.getShareCount"함수를 만들지 않았다면 첫 번째 함수를 호출 할 때 대신 "HBModule.getShareCount"함수를 사용하게됩니까? –

+0

감사합니다. 이를 수행하는 다양한 방법이 있습니다. 가독성을 높이기 위해 "클래스"(프로토 타입 상속)를 사용하는 것이 좋습니다. 현재 사용중인 Meteor의 버전을 알 수 없으므로 Meteor 1.3+에 대한 예제를 작성하겠습니다. (이전 버전의 Meteor에서는 이와 동등한 작업을 수행 할 수 있지만 다소 다르게 작성됩니다). https://gist.github.com/nathantreid/8ef9e734d52b179bee12123ef81b3065 –

+0

오,이 사람은 완벽합니다. 정말 고맙습니다! –

관련 문제