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

15
我按照文档将常量放入了 lib/constants.js 文件中。 问题: 如何在客户端的htmljs文件中访问这些常量?
2个回答

43
在Meteor中,变量是文件作用域的。
通常情况下,var myVar会进入全局Node上下文,但是在Meteor中它会保持在文件中(这使得编写更透明的代码非常有用)。Meteor将包装所有文件在IIFE中,将变量封装在该函数中,因此有效地封装在文件中。
要定义全局变量,只需删除var/let/const关键字,Meteor会负责导出它。您必须通过相同的机制创建函数(myFunc = function myFunc() {}myFunc = () => {})。如果代码位于client目录中,则此导出将是客户端导出;如果代码位于server目录中,则此导出将是服务器端导出;如果代码位于某些不那么特殊的directories中,则此导出将是客户端和服务器端都有的。
不要忘记遵循这些规则:
  1. HTML模板文件总是在其他所有文件之前加载
  2. main.开头的文件最后加载
  3. 任何lib/目录中的文件会在其它文件之前加载
  4. 路径更深的文件会在其它文件之前加载
  5. 按照整个路径的字母顺序加载文件

如果您试图立即访问此全局变量,但Meteor尚未对定义该变量的文件进行实例化,则可能会遇到服务器端问题。因此,您必须处理文件和文件夹名称,或者尝试欺骗Meteor.startup()(祝您好运)。这意味着代码不易阅读、易受损坏并且依赖位置。如果您的同事移动了一个文件,您的应用程序就会出现错误。
或者,您可能只是不想每次添加一个文件时都要返回文档,然后运行五步流程来确定放置该文件的位置以及如何命名该文件。

从Meteor 1.3开始,有两种解决此问题的方法:

1. ES6模块

"Meteor 1.3(目前处于测试版)允许您使用modules包(meteor add modulesapi.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文件,因为已经明确告知了这一点。
2. 包
声明全局变量的最后一种选项是创建一个包。
meteor create --package global_constants

每个声明变量没有使用var关键字的都会被导出到整个包中。这意味着你可以在它们自己的文件中创建变量,使用api.addFiles精细控制加载顺序,控制它们是否应该在客户端、服务器或两者上运行。它还允许您在其他包中api.use这些变量。
这意味着清晰、可重用的代码。想要添加常量吗?要么在已经创建的文件中进行,要么创建一个新的并将其api.addFiles
您可以在文档中阅读更多有关包管理的信息。
以下是来自"结构化应用程序"的引用:
这种[使用包]的方法是代码分离、模块化和可重用性的极致体现。如果将每个功能的代码放在单独的包中,一个功能的代码就无法直接访问另一个功能的代码,除非通过导出来实现,从而使每个依赖关系都变得明确。这也可以最方便地独立测试各个功能。您还可以发布这些包并使用meteor add在多个应用程序中使用它们。
使用 Meteor 1.3 可以将这两种方法结合起来,真是太棒了。相比于包,模块更易编写、更轻量级,只需一行 export 和任意多行 import,而不需要整个包的创建流程,但是也不像包那样可以完全避免愚蠢的错误(如忘记在文件顶部写 import 行)。如果要写大型项目或因为它出现错误(如误写了 import),最好先使用模块,然后再转到包。
只要确保在做任何大于 POC 的事情时不要依赖传统的加载顺序即可。

很棒的回答!我投了 David 的一票,因为在 /lib 目录中添加一个常量文件会使它比其他文件先加载。 - Will Parker
4
我最初也是这样想的,但在构建应用程序时出了一些问题。即使我将全局变量放在(根)/lib文件夹中,并且有或没有Meteor.startup()回调函数,Meteor也会说应用程序出错,因为未定义SOME_GLOBAL_VARIABLE ... 当在发布中访问它时一切都正常(因为由客户端触发),但在另一个文件中立即调用它则完全不起作用。所以最后我做了一个包! - Kyll
曾经遇到过同样的问题,但是发现一旦我删除了var关键字,由于我在JavaScript文件顶部使用了"use strict";,所以会出现未定义错误(我认为这是必要的)。查看这个线程对我有很大帮助 https://github.com/meteor/meteor/issues/1380 - Precastic

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

1
将全局变量命名空间化是有帮助的:https://medium.com/@sirchill3/meteor-managing-the-global-namespace-5a50080a05ea - rpggio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接