如何访问Meteor中lib/contents.js文件中的常量
How can I access constants in the lib/constants.js file in Meteor?
我按照文档将常量放入lib/constants.js
文件中。
问题:如何访问客户端html和js文件中的这些常量?
Meteor中的变量是文件范围的
通常,var myVar
会出现在全局Node上下文中,但在Meteor中,它保持在文件中(这使得编写更透明的代码非常有用)。Meteor将把所有文件封装在IIFE中,确定该函数中的变量范围,从而有效地确定文件中的变量。
要定义全局变量,只需删除var
/let
/const
关键字,Meteor就会负责导出它。您必须通过相同的机制(myFunc = function myFunc() {}
或myFunc = () => {}
)创建函数。如果代码在client
目录中,则此导出将是客户端导出;如果代码在server
目录中,此导出将为服务器端导出;或者如果代码在其他一些不太特殊的目录中,将同时导出
不要忘记遵守以下规则:
- HTML模板文件总是先于其他文件加载
- 最后加载以
main.
开头的文件 - 接下来加载任何
lib/
目录中的文件 - 下一步加载路径更深的文件
- 然后按整个路径的字母顺序加载文件
现在,如果您尝试立即访问此全局变量,您可能会在服务器端遇到问题,但Meteor尚未实例化它,因为它尚未运行定义变量的文件。因此,你必须与文件和文件夹名称作斗争,或者可能试图欺骗Meteor.startup()
(祝你好运)。这意味着可读性较差、易损坏的位置相关代码。你的一位同事移动了一个文件,你的应用程序就中断了
或者,你可能不想每次添加文件时都要返回文档,以运行五步流程来了解将该文件放置在何处以及如何命名。
对于这个问题,Meteor 1.3有两种解决方案:
1.ES6模块
Meteor 1.3(目前处于测试版)允许您使用modules
包(meteor add modules
或api.use('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更大的事情,请确保避免依赖传统的装载顺序。
您需要使它们成为全局变量,以便其他文件能够看到它们。
JavaScript
/lib/constants.js
THE_ANSWER = 42; // note the lack of var
/client/其他一些文件.js
console.log(THE_ANSWER);
CoffeeScript
/lib/constants.coffee
@THE_ANSWER = 42
/client/其他文件。咖啡
console.log THE_ANSWER
- 可以't让我的if语句处理js中的html表单输入
- 使用agility.js进行页面布局和合成
- 使用Clipboard.js复制span文本
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 强制模板刷新ember.js
- 如何编写HTML输入的JS内联
- Angular JS IE9 Hashbang url rewriting
- 使用JS将数组转换为json对象
- Node.js v6.2.0类扩展不是函数错误
- 当js函数's已执行
- 要求未定义JS回调参数
- 在自定义mean.io包中使用angular-chart.js作为依赖项
- 无法在数据endVal中设置值=“”;{{ucount}}”;使用Angular JS的CountUp
- 如何从Java/scala调用js美化程序
- 如何更改<svg>标记为<img>用js标记
- 如何使用 node.js 比较两个 json 数组
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- JS / JQUERY iframe.contents() syntax
- 如何访问Meteor中lib/contents.js文件中的常量