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

IT技术 javascript meteor ecmascript-6 constants
2021-02-10 11:13:13

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

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

2个回答

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

要定义一个全局变量,只需删除var/ let/const关键字,流星会照顾到导出。您必须通过相同的机制(myFunc = function myFunc() {}myFunc = () => {}创建函数该出口要么是客户端的代码是否在client目录或服务器端,如果它是在server目录中,或者如果双方是在其他一些不那么特殊的目录
不要忘记遵循以下规则

  1. HTML 模板文件总是在其他所有文件之前加载
  2. 开头的文件main.最后加载
  3. lib/接下来加载任何目录中的文件
  4. 接下来加载具有更深路径的文件
  5. 然后按整个路径的字母顺序加载文件

现在,如果您尝试立即访问此全局变量,则可能会在服务器端遇到问题,但 Meteor 尚未实例化它,因为它尚未运行定义该变量的文件。所以你必须与文件和文件夹名称作斗争,或者尝试欺骗Meteor.startup()(祝你好运)。这意味着可读性较差、与位置相关的代码更加脆弱。您的一位同事移动了一个文件,您的应用程序中断了。
或者,您可能只是不想在每次添加文件时都返回文档以运行一个五步过程,以了解该文件的放置位置以及如何命名。

从 Meteor 1.3 开始,这个问题有两种解决方案:

1. ES6 module

Meteor 1.3(目前处于测试阶段)允许您通过使用包(在应用程序中使用modulemodulesmeteor add modulesapi.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因为它已被明确告知。

2. 套餐

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

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 目录中添加一个常量文件将在其他任何事情之前加载它。
2021-03-17 11:13:13
正在努力解决同样的问题,但发现一旦我删除了var关键字,我就会收到未定义的错误,因为我"use strict";在 JavaScript 文件的顶部使用(我认为这是必不可少的)。看看这个线程对我来说清除了很多github.com/meteor/meteor/issues/1380
2021-04-08 11:13:13
这也是我最初的想法,但是在构建应用程序时出了点问题。即使我把我的全局变量放在 (root)/lib 文件夹中,有或没有Meteor.startup()回调,Meteor 说应用程序有错误,因为SOME_GLOBAL_VARIABLE没有定义......例如在出版物中访问它时一切都很好(因为这是由客户端触发的),但是在另一个文件中立即调用它根本不起作用。所以我最后做了一个包!
2021-04-09 11:13:13

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

JavaScript

/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
命名全局变量很有帮助:medium.com/@sirchill3/...
2021-03-15 11:13:13