【问题标题】:Understanding ES6 Modules import/export了解 ES6 模块导入/导出
【发布时间】:2019-01-29 14:07:17
【问题描述】:

我开始学习 ES6 模块和 import/export 语法,我希望我的模块只在需要的地方执行。

我创建了两个简单的模块,它们连接到 <div> 和特定的 class 或 id 以运行。

例如:

// product.js

import Vue from 'vue/dist/vue';

export default function() {

  var app = new Vue({
    el: '#c-product',
    data: {
      counter: 0,
    },
    methods: {
      addToCart: function() {
        this.counter++;
      },
      removeFromCart: function() {
        this.counter--;
      }
    }
  });

}

然后我有另一个用于轮播的模块:

// carousel.js

import Glide from '@glidejs/glide';

export default function() {

  new Glide('.glide', {
    type: 'carousel',
    startAt: 0,
    perView: 3,
    breakpoints: {
      800: {
        perView: 2
      }
    }
  }).mount();

};

然后我将所有内容与 Gulp + Browserify 捆绑在一起,以便在其中导入和执行模块的 main.js 文件:

// main.js
import Product from './product';
import Carousel from './carousel';

Product();
Carousel();

现在我有我的main.js 文件,我准备将其插入.html 页面,但我在控制台中出现错误,具体取决于页面中是否存在这些 div。

示例:如果在 product.html 页面中没有轮播,我在控制台中会出现关于缺少带有轮播类的 <div> 的错误。

希望清楚。

你能帮我理解吗?

Here the example on product page

【问题讨论】:

  • 你的错误是什么?
  • 我添加了一张图片。
  • 错误表明根元素(id c-product)必须存在。这是一个疯狂的想法 - 您是否检查过该元素是否存在于 dom 中?
  • @Kaspars #c-product 存在,其实错误不在轮播上。但我的问题是:我是否必须将我的模块实例化到 main.js 中?
  • 我看不出这与模块有什么关系。或者您是否希望为不同的页面创建不同的脚本,只导入该特定页面上需要的模块?

标签: javascript ecmascript-6 bundle es6-modules


【解决方案1】:

您可以通过一些防御性编码来解决它。您的每个模块都依赖于存在的某个 DOM 节点,因此您应该在实例化模块之前查询元素。喜欢:

// product.js

import Vue from 'vue/dist/vue';

export default function() {
  var vueRoot = document.getElementById('c-product')
  if (!vueRoot) return;  // element does not exist, so we return before instantiating

  var app = new Vue({
    el: '#c-product',
    data: {
      counter: 0,
    },
    methods: {
      addToCart: function() {
        this.counter++;
      },
      removeFromCart: function() {
        this.counter--;
      }
    }
  });

}

【讨论】:

  • 最初我想到了类似的东西,但这意味着我必须为我创建的每个模块做一个if?有没有可能没有“官方”的解决方案?
  • 确实..如果您的模块依赖于特定元素,您需要检查它
  • 也许问题是:我必须在哪里调用模块?在main.js?如果是这样,那么它具有全局错误是正确的。那么main.js 仅用于导入?
  • 嗯,没有一个单一的答案 - 这是一个架构问题。使用 main.js 文件导入全局模块当然是一种方法——但您也可以为单个页面构建特定的包(并避免在不需要它的页面上加载 VueJS)
  • 哦,根据您收到的错误,我猜您的 main.js 文件已加载到 head 标记中 - 或者至少在文档准备好之前加载。那不会飞..在这种情况下,无法查询文档,并且模块总是会失败。在body 中将 JS 作为最后一件事加载是一种很好的做法
猜你喜欢
  • 1970-01-01
  • 2017-06-29
  • 2016-02-05
  • 1970-01-01
  • 2017-01-04
  • 2016-05-13
  • 2018-12-09
  • 1970-01-01
  • 2015-12-10
相关资源
最近更新 更多