Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何访问Meteor中lib/constants.js文件中的常量?_Javascript_Meteor_Ecmascript 6_Constants - Fatal编程技术网

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

Javascript 如何访问Meteor中lib/constants.js文件中的常量?,javascript,meteor,ecmascript-6,constants,Javascript,Meteor,Ecmascript 6,Constants,我按照文档将常量放入lib/constants.js文件中 问题: 如何在我的客户端html和js文件中访问这些常量?您需要将它们设置为全局变量,以便其他文件可以看到它们 JavaScript /lib/constants.js /client/some-other-file.js 咖啡脚本 /lib/constants.coffee /client/some-other-file.coffee Meteor中的变量在文件范围内。 通常情况下,var myVar会放在全局节点上下文中,但是在M

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

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

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

JavaScript /lib/constants.js

/client/some-other-file.js


咖啡脚本 /lib/constants.coffee

/client/some-other-file.coffee


Meteor中的变量在文件范围内。
通常情况下,
var myVar
会放在全局节点上下文中,但是在Meteor中它会被封装在文件中(这使得编写更透明的代码非常有用)。Meteor会将所有文件包装在一个函数中,限定该函数中的变量范围,从而有效地将其保存在文件中

要定义一个全局变量,只需删除
var
/
let
/
const
关键字,Meteor就会注意导出它。您必须通过相同的机制创建函数(
myFunc=function myFunc(){}
myFunc=()=>{}
)。如果代码位于
client
目录中,则此导出将是客户端的;如果代码位于
server
目录中,则此导出将是服务器端的;如果代码位于其他不太特殊的目录中,则此导出将是服务器端的。
别忘了:

  • HTML模板文件总是在加载之前加载
  • main.
    开头的文件最后加载
  • 接下来将加载任何
    lib/
    目录中的文件
  • 下一步加载具有更深路径的文件
  • 然后按照整个路径的字母顺序加载文件
  • 现在,如果您试图立即访问此全局变量,您可能会遇到问题服务器端,但Meteor尚未实例化它,因为它尚未运行定义该变量的文件。因此,您必须与文件和文件夹名称进行斗争,或者尝试欺骗Meteor.startup()(祝您好运)。这意味着可读性较差、脆弱的位置相关代码。您的一位同事移动了一个文件,您的应用程序中断。
    或者,您可能只是不想每次添加文件时都必须返回文档,以运行五步流程来了解该文件的放置位置和命名方式

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

    1.ES6模块 Meteor 1.3(目前处于测试阶段)允许您通过使用
    模块
    包(
    Meteor添加模块
    api.use('modules')
    )在应用程序中使用

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

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

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

    Meteor 1.3将在
    a.js
    之前加载
    b.js
    文件,因为它已经被明确告知了这一点

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

    meteor create --package global_constants
    
    未使用
    var
    关键字声明的每个变量将导出到整个包中。这意味着您可以在自己的文件中创建变量,精细地调整加载顺序,控制它们是否应该转到客户端、服务器或两者。它还允许您在其他包中添加这些变量。
    这意味着清晰、可重用的代码。是否要添加常量?可以在已经创建的文件中执行此操作,也可以创建一个并
    api.addFiles
    it

    您可以阅读有关包管理的更多信息

    以下是一段引自:

    这[使用包]是代码分离、模块化和可重用性的终极目标。如果将每个功能的代码放在单独的包中,则一个功能的代码将无法访问其他功能的代码,除非通过导出,从而使每个依赖项都显式。这还允许对功能进行最简单的独立测试。您还可以使用
    meteor add
    发布软件包并在多个应用程序中使用它们


    将这两种方法与Meteor 1.3结合在一起真是太神奇了。模块比软件包更容易编写,也更轻,因为使用模块只需一行
    export
    和所需的多行
    import
    s,而不是整个软件包创建过程,但不像软件包那样简单(忘记编写文件顶部的
    import
    行)

    一个好办法是首先使用模块,然后在他们写累了或者因为写累了而发生错误时(误写了导入的
    ,…)立即切换到包。

    如果您要做的事情比a更大,请确保避免依赖传统的加载顺序。

    回答得好!我投票支持David的You,因为在/lib目录中添加一个常量文件将在加载其他文件之前加载它。这也是我最初的想法,但在构建应用程序时出现了一些问题。即使当我将全局变量放入(root)/lib文件夹时,无论是否有
    Meteor.startup()
    回调,Meteor都说应用程序有错误,因为没有定义
    某些全局变量
    。。。例如,在出版物中访问它时,一切都正常(因为这是由客户端触发的),但在另一个文件中立即调用它根本不起作用。所以我最后做了一个包裹!正在努力解决相同的问题,但发现一旦我删除
    var
    关键字,就会出现未定义的错误,因为我使用的是
    “use strict”在我的JavaScript文件的顶部(我认为这是必要的)。查看此线程后,我清楚了很多,为全局命名很有帮助:
    
    console.log(THE_ANSWER);
    
    @THE_ANSWER = 42
    
    console.log THE_ANSWER
    
    import {bThing} from './b.js';
    // bThing is now usable here
    
    export const bThing = 'my constant';
    
    meteor create --package global_constants