如何访问Meteor中lib / constants.js文件中的常量?

时间:2014-11-10 03:45:08

标签: javascript meteor ecmascript-6 constants

我按照文档将常量放在 lib/constants.js 文件中。

问题: 如何在我的客户端 html js 文件中访问这些常量?

2 个答案:

答案 0 :(得分:42)

Meteor中的变量是文件范围的 通常情况下,var myVar会进入全局Node上下文,但是在Meteor中它会保留在文件中(这使得编写更透明的代码非常有用)。发生的事情是Meteor会将所有文件包装在IIFE中,在该函数中确定变量,从而有效地在文件中。

要定义全局变量,只需删除var / let / const关键字,Meteor会小心导出它。您必须通过相同的机制(myFunc = function myFunc() {}myFunc = () => {})创建函数。如果代码位于client目录中,则此导出将是客户端;如果位于server目录中,则导出将位于服务器端,或者如果位于其他某个非常特殊的目录中,则导出将同时导出directories
不要忘记to follow these rules

  1. HTML模板文件总是在其他所有内容之前加载
  2. main.开头的文件最后加载
  3. 下一个<{li}目录中的文件
  4. 接下来加载具有更深路径的文件
  5. 然后按整个路径的字母顺序加载文件
  6. 现在,如果您尝试立即访问此全局变量,可能会遇到服务器端问题,但Meteor尚未实例化它,因为它没有运行定义变量的文件。所以你必须与文件和文件夹名称作斗争,或者尝试欺骗lib/(祝你好运)。这意味着不太可读,易碎的位置相关代码。你的一位同事移动了一个文件,你的申请中断了 或者,您可能只是不想每次添加文件时都返回到文档,以运行五个步骤以了解放置此文件的位置以及如何命名。

    Meteor 1.3中有两个解决此问题的方法:

    1。 ES6模块

    Meteor 1.3(目前处于测试阶段)允许您使用Meteor.startup()包(modulesmeteor add modules)在您的应用中使用modules

    模块有很长的路要走,这是一个直接从上面链接中获取的简单示例:

    文件:api.use('modules')(首先加载传统的加载订单规则):

    a.js

    文件:import {bThing} from './b.js'; // bThing is now usable here (使用传统的加载顺序规则加载第二个):

    b.js

    Meteor 1.3将负责在export const bThing = 'my constant'; 之前加载b.js文件,因为它已被明确告知。

    2。封装

    声明全局变量的最后一个选项是创建一个包。

    a.js

    在没有meteor create --package global_constants 关键字的情况下声明的每个变量都会导出到整个包中。这意味着您可以在自己的文件中创建变量,使用api.addFiles精确地加载加载顺序,控制是否应该转到客户端,服务器或两者。它还允许您在其他包中api.use这些变量 这意味着清晰,可重复使用的代码。你想添加常量吗?可以在已创建的文件中创建一个,也可以创建一个var

    您可以阅读有关包管理in the doc的更多信息。

    以下是"Structuring your application"的引用:

      

    [using packages] 是代码分离,模块化和可重用性的终极选择。如果将每个功能的代码放在一个单独的包中,则一个功能的代码将无法访问除导出之外的其他功能的代码,从而使每个依赖项都显式化。这也允许最简单的功能独立测试。您还可以发布包并使用api.addFiles在多个应用中使用它们。


    将两种方法与Meteor 1.3相结合是令人惊讶的。模块比包更简单,更轻松,因为使用它们只需要meteor addexportimport,而不是整个包创建过程,但不能防止哑错(忘记了)将import行写在文件顶部)作为包。

    一个好的选择是首先使用模块,然后在他们厌倦写入时切换到包,或者因为它而发生错误(错误写入import,...)。<登记/> 如果你做的事情比POC更大,请确保避免依赖传统的加载顺序。

答案 1 :(得分:13)

您需要将它们设为全局变量,以便其他文件可以看到它们。

的JavaScript

/lib/constants.js

THE_ANSWER = 42; // note the lack of var

/client/some-other-file.js

console.log(THE_ANSWER);

的CoffeeScript

/lib/constants.coffee

@THE_ANSWER = 42

/client/some-other-file.coffee

console.log THE_ANSWER