【发布时间】:2015-01-06 07:39:57
【问题描述】:
我按照文档将常量放入 lib/constants.js 文件中。
问题: 如何在我的客户端 html 和 js 文件中访问这些常量?
【问题讨论】:
标签: javascript meteor ecmascript-6 constants
我按照文档将常量放入 lib/constants.js 文件中。
问题: 如何在我的客户端 html 和 js 文件中访问这些常量?
【问题讨论】:
标签: javascript meteor ecmascript-6 constants
您需要将它们设为全局变量,以便其他文件可以看到它们。
/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
【讨论】:
Meteor 中的变量是文件范围的。
通常var myVar 会放在全局节点上下文中,但是在 Meteor 中它仍然包含在文件中(这使得编写更透明的代码非常有用)。发生的情况是 Meteor 会将所有文件包装在 IIFE 中,在该函数中限定变量,从而有效地在文件中。
要定义一个全局变量,只需删除var/let/const 关键字,Meteor 会小心导出它。您必须通过相同的机制(myFunc = function myFunc() {} 或myFunc = () => {})创建函数。如果代码在client 目录中,则此导出将是客户端,如果在server 目录中,则将是服务器端,或者如果它在其他一些不那么特别的directories 中,则两者兼而有之。
别忘了to follow these rules:
main. 开头的文件最后加载lib/ 目录中的文件现在,如果您尝试立即访问此全局变量,您可能会遇到服务器端问题,但 Meteor 尚未实例化它,因为它尚未运行定义该变量的文件。因此,您必须与文件和文件夹名称作斗争,或者尝试欺骗Meteor.startup()(祝您好运)。这意味着可读性较差、易受位置依赖的代码。您的一位同事移动了一个文件,您的应用程序中断了。
或者,您可能只是不想每次添加文件时都必须返回文档以运行五步流程来了解该文件的放置位置以及如何命名。
从 Meteor 1.3 开始,这个问题有两种解决方案:
Meteor 1.3(目前处于测试阶段)允许您通过使用modules 包(meteor add modules 或api.use('modules'))在应用程序中使用modules。
模块有很长的路要走,这里是一个简单的例子,直接取自上面的链接:
文件:a.js(按照传统加载顺序规则先加载):
import {bThing} from './b.js';
// bThing is now usable here
文件:b.js(按传统加载顺序规则加载第二个):
export const bThing = 'my constant';
Meteor 1.3 将负责在 a.js 之前加载 b.js 文件,因为它已被明确告知。
声明全局变量的最后一个选项是创建一个包。
meteor create --package global_constants
没有var 关键字声明的每个变量都被导出到整个包。这意味着您可以在自己的文件中创建变量,使用api.addFiles 细化加载顺序,控制它们是否应该发送到客户端、服务器或两者。它还允许您在其他包中api.use 这些变量。
这意味着清晰、可重用的代码。你想添加一个常量吗?要么在已创建的文件之一中执行此操作,要么创建一个并 api.addFiles 它。
您可以阅读更多关于包管理的信息in the doc。
这是来自"Structuring your application"的引述:
这个[使用包]是代码分离、模块化和可重用性的终极选择。如果您将每个功能的代码放在单独的包中,则一个功能的代码将无法访问另一个功能的代码,除非通过导出,从而使每个依赖项都变得明确。这也允许对功能进行最简单的独立测试。您还可以通过
meteor add发布包并在多个应用程序中使用它们。
在 Meteor 1.3 中结合这两种方法真是太棒了。模块比包更容易编写和更轻,因为使用它们是一个export 行和尽可能多的imports,而不是整个包创建过程,但没有愚蠢的错误证明(忘记写@ 987654359@ 文件顶部的行)作为包。
一个不错的选择是先使用模块,然后在它们写累了或者因为它而发生错误时立即切换到一个包(写错了import,...)。
如果您正在执行比POC 更大的操作,请确保避免依赖传统的加载顺序。
【讨论】:
Meteor.startup() 回调,Meteor 都说应用程序有错误,因为SOME_GLOBAL_VARIABLE 没有定义......在里面访问它时一切正常例如发布(因为它是由客户触发的),但是在另一个文件中立即调用它根本不起作用。所以最后我做了一个包!
var 关键字,我会收到未定义的错误,因为我在 JavaScript 文件的顶部使用了 "use strict";(我认为这是必不可少的) )。看看这个帖子让我明白了很多github.com/meteor/meteor/issues/1380