我按照文档将常量放在 lib/constants.js
文件中。
问题: 如何在我的客户端 html 和 js 文件中访问这些常量?
答案 0 :(得分:42)
Meteor中的变量是文件范围的
通常情况下,var myVar
会进入全局Node上下文,但是在Meteor中它会保留在文件中(这使得编写更透明的代码非常有用)。发生的事情是Meteor会将所有文件包装在IIFE中,在该函数中确定变量,从而有效地在文件中。
要定义全局变量,只需删除var
/ let
/ const
关键字,Meteor会小心导出它。您必须通过相同的机制(myFunc = function myFunc() {}
或myFunc = () => {}
)创建函数。如果代码位于client
目录中,则此导出将是客户端;如果位于server
目录中,则导出将位于服务器端,或者如果位于其他某个非常特殊的目录中,则导出将同时导出directories。
不要忘记to follow these rules:
main.
开头的文件最后加载现在,如果您尝试立即访问此全局变量,可能会遇到服务器端问题,但Meteor尚未实例化它,因为它没有运行定义变量的文件。所以你必须与文件和文件夹名称作斗争,或者尝试欺骗lib/
(祝你好运)。这意味着不太可读,易碎的位置相关代码。你的一位同事移动了一个文件,你的申请中断了
或者,您可能只是不想每次添加文件时都返回到文档,以运行五个步骤以了解放置此文件的位置以及如何命名。
Meteor 1.3中有两个解决此问题的方法:
Meteor 1.3(目前处于测试阶段)允许您使用Meteor.startup()
包(modules
或meteor 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
文件,因为它已被明确告知。
声明全局变量的最后一个选项是创建一个包。
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 add
行export
和import
,而不是整个包创建过程,但不能防止哑错(忘记了)将import
行写在文件顶部)作为包。
一个好的选择是首先使用模块,然后在他们厌倦写入时切换到包,或者因为它而发生错误(错误写入import
,...)。<登记/>
如果你做的事情比POC更大,请确保避免依赖传统的加载顺序。
答案 1 :(得分:13)
您需要将它们设为全局变量,以便其他文件可以看到它们。
/lib/constants.js
THE_ANSWER = 42; // note the lack of var
/client/some-other-file.js
console.log(THE_ANSWER);
/lib/constants.coffee
@THE_ANSWER = 42
/client/some-other-file.coffee
console.log THE_ANSWER