我按照文档将常量放入lib/constants.js
文件中。
问题:如何在我的客户端html和js文件中访问这些常量?
我按照文档将常量放入lib/constants.js
文件中。
问题:如何在我的客户端html和js文件中访问这些常量?
Meteor 中的变量是文件范围的。
通常 avar myVar
会出现在全局 Node 上下文中,但是在 Meteor 中它保持封闭在文件中(这使得编写更透明的代码非常有用)。发生的事情是 Meteor 将所有文件包装在IIFE 中,限定该函数中的变量范围,从而有效地在文件中。
要定义一个全局变量,只需删除var
/ let
/const
关键字,流星会照顾到导出。您必须通过相同的机制(myFunc = function myFunc() {}
或myFunc = () => {}
)创建函数。该出口要么是客户端的代码是否在client
目录或服务器端,如果它是在server
目录中,或者如果双方是在其他一些不那么特殊的目录。
不要忘记遵循以下规则:
main.
最后加载lib/
接下来加载任何目录中的文件现在,如果您尝试立即访问此全局变量,则可能会在服务器端遇到问题,但 Meteor 尚未实例化它,因为它尚未运行定义该变量的文件。所以你必须与文件和文件夹名称作斗争,或者尝试欺骗Meteor.startup()
(祝你好运)。这意味着可读性较差、与位置相关的代码更加脆弱。您的一位同事移动了一个文件,您的应用程序中断了。
或者,您可能只是不想在每次添加文件时都返回文档以运行一个五步过程,以了解该文件的放置位置以及如何命名。
从 Meteor 1.3 开始,这个问题有两种解决方案:
Meteor 1.3(目前处于测试阶段)允许您通过使用包(或)在应用程序中使用module。modules
meteor add modules
api.use('modules')
module有很长的路要走,这是一个直接取自上面链接的简单示例:
文件:(a.js
首先使用传统的加载顺序规则加载):
import {bThing} from './b.js';
// bThing is now usable here
文件:(b.js
使用传统的加载顺序规则第二次加载):
export const bThing = 'my constant';
Meteor 1.3 将负责加载b.js
文件,a.js
因为它已被明确告知。
声明全局变量的最后一个选项是创建一个包。
meteor create --package global_constants
没有var
关键字声明的每个变量都导出到整个包。这意味着您可以在自己的文件中创建变量,使用 来细化加载顺序api.addFiles
,控制它们是否应该转到客户端、服务器或两者。它还允许您api.use
在其他包中使用这些变量。
这意味着清晰、可重用的代码。你想添加一个常数吗?要么在已创建的文件之一中执行此操作,要么创建一个和api.addFiles
它。
您可以在 doc 中阅读有关包管理的更多信息。
这是“构建您的应用程序”中的引用:
这种[使用包]是代码分离、module化和可重用性的终极目标。如果将每个功能的代码放在单独的包中,则一个功能的代码将无法访问另一个功能的代码,除非通过导出,从而使每个依赖项都显式化。这也允许对功能进行最简单的独立测试。您还可以发布包并在多个应用程序中使用它们
meteor add
。
将这两种方法与 Meteor 1.3结合起来真是太棒了。module比包更容易编写,因为使用它们是export
一行,根据import
需要使用尽可能多的s,而不是整个包创建过程,但不像防错(忘记import
在文件顶部写一行)那样包。
一个好的选择是首先使用module,然后在它们编写累了或者因此发生错误时立即切换到包(误写了import
, ...)。
如果您正在做比POC更大的任何事情,请确保避免依赖传统的加载顺序。
您需要将它们设为全局变量,以便其他文件看到它们。
/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