Global variables in Meteor

前端 未结 4 1330
傲寒
傲寒 2020-11-29 03:28

I have

var Schemas = {};

Meteor.isClient && Template.registerHelper(\"Schemas\", Schemas);

Schemas.Person = new SimpleSchema({
  fullName: {
    ty         


        
4条回答
  •  自闭症患者
    2020-11-29 03:59

    ReferenceError is a Node error. Meteor is a framework on top of Node.

    Node has a global scope (aka Node's global variable). This error is thrown by Node (not Meteor) if you try to access an undefined global variable.

    Browsers also have a global scope called window, and do not throw ReferenceErrors when undefined variables are accessed.

    Here's a pattern I like for adding functionality to a class (it's very Meteor):

    /lib/Helpers.js      <-- Helpers for everyone (node+browser)
    /server/Helpers.js   <-- Server helpers (node)
    /client/Helpers.js   <-- Client helpers (browser)
    

    Consider these implementations:

    // /lib/Helpers.js
    Helpers = {/* functions */};  // Assigned to window.Helpers and global.Helpers
    
    // /server/Helpers.js
    Helpers = _.extend(Helpers, {/*more functions*/}
    
    // /client/Helpers.js
    Helpers = _.extend(Helpers, {/*more functions*/}
    

    This is a trivial example. What if I didn't want to worry about load order? Why not _.extend() in /lib/Helpers.js?

    // /lib/Helpers.js
    // Helpers = {/* functions */};                  // Overwrites...
    Helpers = _.extend(Helpers, {/* functions */});  // ReferenceError
    

    Because you'll get a ReferenceError from Node if Helpers isn't defined - specifically the "Helpers" used as an argument. (Node knows to assign Helpers as global.Helpers).

    Here are two ways to "fix" this:

    1) Assign Helpers to something

    // /lib/Helpers.js
    // Helpers = Helpers || {}    // would be another ReferenceError
    if (typeof Helpers === 'undefined') Helpers = {};
    Helpers = _.extend(Helpers, {/* functions */});
    

    2) Use helpers from the global

    // /lib/Helpers.js
    Helpers = _.extend(global.Helpers, {/* functions */});  // works in node, but...
    

    Both of which suck.

    1)'s syntax is horrible.
    2) works in node, but there is no global in browsers. So it fails it's purpose.

    So I gave up and went back to overwriting it the first time in lib, and looking for runtime errors if anything was overwritten.

    If you have a handy cross-browser syntax for this, do comment :-) var something = something || {} something.blah = foo;

    Here's some other JS shorthand tips.

提交回复
热议问题