在Meteor中使用ES6导入和导出是否为时过早

Is it too early to use ES6 import and export in Meteor?

本文关键字:是否 为时过早 导入 ES6 Meteor      更新时间:2023-09-26

所以我一直在ES6中进行一些编码,并试图弄清楚导入/导出内容是如何工作的。

/lib/globalcode.js

'use strict';
let globalCode = {
    add: (x,y) => {
        return add(x,y);
    }
};
let add = (x,y) => {
    return x + y;
};
class Animal { 
  constructor(name) {
    this.name = name;
  }
  speak() {
    console.log(this.name + ' makes a noise.');
  }
};
export { Animal, globalCode };

/client/index.js

import { Animal, globalCode } from '/lib/globalcode.js';
Template.index.onRendered( () => {
  let animal = new Animal('cat');
  animal.speak();
  console.log(globalCode.add(5,6));
});

当我进入Chrome开发工具时,animal.speak()console.log(globalCode.add(5,6))的输出确实会显示出来,但当我在控制台中手动键入let animal = new Animal('cat')globalCode.add(5,6)时,我会分别得到未定义的Animal not definedglobalCode

显然还没有浏览器正式支持ES6模块,但我很困惑为什么console.log(globalCode.add(5,6))let animal = new Animal('cat');在从index.js运行时可以工作,而在从浏览器运行时不能工作。

上述限制使得调试非常困难。是否最好暂时远离ES6模块?Meteor服务器端是否完全支持它们?

导入创建词法绑定,不管您的名称如何,这些绑定都不是全局的。(实际上,模块中也没有var绑定。)如果您想将它们安装在全局对象上,可以将window.globalCode = globalCode或类似的绑定放在index.js中。

我认为这个问题是一个变量作用域问题。如果你要在"客户端/索引"页面的顶部导入,我想你会得到想要的结果:

import { Animal, globalCode } from '/lib/globalcode.js';
Template.index.onRendered( () => {
  let animal = new Animal('cat');
  animal.speak();
  console.log(globalCode.add(5,6));
});

为了回答你关于es6的问题,我会尽我所能使用它,并推荐使用它。