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

Dav*_*kee 14 javascript constants meteor ecmascript-6

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

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

Kyl*_*yll 43

Meteor中的变量是文件范围的.
通常情况下,a var myVar会进入全局Node上下文,但是在Meteor中它会保留在文件中(这使得编写更透明的代码非常有用).会发生什么是Meteor会将所有文件包装在IIFE中,确定该函数中的变量,从而有效地在文件中.

要定义全局变量,只需删除var/ let/ const关键字,Meteor将注意导出它.您必须通过相同的机制(myFunc = function myFunc() {}myFunc = () => {})创建功能.该出口要么是客户端的代码是否在client目录或服务器端,如果它是在server目录中,或两者如果是在其他一些不那么特殊的目录.
不要忘记遵循以下规则:

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

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

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

1. ES6模块

Meteor 1.3(目前处于测试阶段)允许您使用软件包(或)在应用程序中使用模块.modulesmeteor add modulesapi.use('modules')

模块有很长的路要走,这是一个直接从上面链接中获取的简单示例:

文件:( a.js首先加载传统的加载顺序规则):

import {bThing} from './b.js';
// bThing is now usable here
Run Code Online (Sandbox Code Playgroud)

文件:( b.js使用传统的加载顺序规则加载第二个):

export const bThing = 'my constant';
Run Code Online (Sandbox Code Playgroud)

Meteor 1.3将负责加载b.js文件,a.js因为它已被明确告知.

2.包裹

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

meteor create --package global_constants
Run Code Online (Sandbox Code Playgroud)

声明没有var关键字的每个变量都会导出到整个包中.这意味着您可以在自己的文件中创建变量,对加载顺序进行细化api.addFiles,控制是否应该转到客户端,服务器或两者.它还允许您api.use在其他包中使用这些变量.
这意味着清晰,可重复使用的代码.你想添加常量吗?要么在已创建的文件中执行,要么创建一个api.addFiles.

您可以在doc中阅读有关包管理的更多信息.

以下是"构建应用程序"的引用:

[使用包]是代码分离,模块化和可重用性的终极选择.如果将每个功能的代码放在一个单独的包中,则一个功能的代码将无法访问除导出之外的其他功能的代码,从而使每个依赖项都显式化.这也允许最简单的功能独立测试.您还可以发布包并在多个应用中使用它们meteor add.


将这两种方法与Meteor 1.3 结合起来真是太棒了.模块比包更简单,更轻松,因为使用它们只需要export一行和多个imports而不是整个包创建过程,但不能作为防笨错误(忘记import在文件顶部写行)包.

一个好的选择是首先使用模块,然后在他们厌倦写入时切换到包,或者因为它而发生错误(写错了import......).
如果您正在做比POC更大的事情,请确保避免依赖传统的加载顺序.

  • 这也是我首先想到的,但在构建应用程序时出了点问题.即使我将全局变量放在(root)/ lib文件夹中,有或没有`Meteor.startup()`回调,Meteor说应用程序有错误,因为`SOME_GLOBAL_VARIABLE`没有定义......一切都还可以例如,当在一个出版物中访问它时(因为它是由客户端触发的),但是在另一个文件中立即调用它根本不起作用.所以我最后做了一个包! (4认同)

Dav*_*don 13

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

JavaScript的

/lib/constants.js

THE_ANSWER = 42; // note the lack of var
Run Code Online (Sandbox Code Playgroud)

/client/some-other-file.js

console.log(THE_ANSWER);
Run Code Online (Sandbox Code Playgroud)

CoffeeScript的

/lib/constants.coffee

@THE_ANSWER = 42
Run Code Online (Sandbox Code Playgroud)

/client/some-other-file.coffee

console.log THE_ANSWER
Run Code Online (Sandbox Code Playgroud)